|
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
|
2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> |
|
3 <title>TB10.1 Example Applications: examples/Base/IPC/AdvancedClientServerExample/driver/driver1_ldd.cpp Source File</title> |
|
4 <link href="doxygen.css" rel="stylesheet" type="text/css"> |
|
5 <link href="tabs.css" rel="stylesheet" type="text/css"> |
|
6 </head><body> |
|
7 <!-- Generated by Doxygen 1.5.3 --> |
|
8 <h1>examples/Base/IPC/AdvancedClientServerExample/driver/driver1_ldd.cpp</h1><a href="driver1__ldd_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).</span> |
|
9 <a name="l00002"></a>00002 <span class="comment">// All rights reserved.</span> |
|
10 <a name="l00003"></a>00003 <span class="comment">// This component and the accompanying materials are made available</span> |
|
11 <a name="l00004"></a>00004 <span class="comment">// under the terms of "Eclipse Public License v1.0"</span> |
|
12 <a name="l00005"></a>00005 <span class="comment">// which accompanies this distribution, and is available</span> |
|
13 <a name="l00006"></a>00006 <span class="comment">// at the URL "http://www.eclipse.org/legal/epl-v10.html".</span> |
|
14 <a name="l00007"></a>00007 <span class="comment">//</span> |
|
15 <a name="l00008"></a>00008 <span class="comment">// Initial Contributors:</span> |
|
16 <a name="l00009"></a>00009 <span class="comment">// Nokia Corporation - initial contribution.</span> |
|
17 <a name="l00010"></a>00010 <span class="comment">//</span> |
|
18 <a name="l00011"></a>00011 <span class="comment">// Contributors:</span> |
|
19 <a name="l00012"></a>00012 <span class="comment">//</span> |
|
20 <a name="l00013"></a>00013 <span class="comment">// Description:</span> |
|
21 <a name="l00014"></a>00014 <span class="comment">// Example Logical Device Driver</span> |
|
22 <a name="l00015"></a>00015 <span class="comment">//</span> |
|
23 <a name="l00016"></a>00016 |
|
24 <a name="l00017"></a>00017 |
|
25 <a name="l00018"></a>00018 |
|
26 <a name="l00023"></a>00023 <span class="preprocessor">#include <kern_priv.h></span> |
|
27 <a name="l00024"></a>00024 <span class="preprocessor">#include "<a class="code" href="driver1_8h.html">driver1.h</a>"</span> |
|
28 <a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="driver1__dev_8h.html">driver1_dev.h</a>"</span> |
|
29 <a name="l00026"></a>00026 |
|
30 <a name="l00027"></a>00027 _LIT(KDriver1PanicCategory,<span class="stringliteral">"Driver1"</span>); |
|
31 <a name="l00028"></a>00028 |
|
32 <a name="l00029"></a>00029 <span class="comment">//</span> |
|
33 <a name="l00030"></a>00030 <span class="comment">// DDriver1Factory</span> |
|
34 <a name="l00031"></a>00031 <span class="comment">//</span> |
|
35 <a name="l00032"></a>00032 |
|
36 <a name="l00037"></a><a class="code" href="driver1__ldd_8cpp.html#4a71e1215ca5b0b994e768478a13357d">00037</a> <a class="code" href="driver1__ldd_8cpp.html#4a71e1215ca5b0b994e768478a13357d">DECLARE_STANDARD_LDD</a>() |
|
37 <a name="l00038"></a>00038 { |
|
38 <a name="l00039"></a>00039 <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="class_d_driver1_factory.html">DDriver1Factory</a>; |
|
39 <a name="l00040"></a>00040 } |
|
40 <a name="l00041"></a>00041 |
|
41 <a name="l00045"></a><a class="code" href="class_d_driver1_factory.html#28b03d2a83e475c0ef628d87f574b326">00045</a> <a class="code" href="class_d_driver1_factory.html#28b03d2a83e475c0ef628d87f574b326">DDriver1Factory::DDriver1Factory</a>() |
|
42 <a name="l00046"></a>00046 { |
|
43 <a name="l00047"></a>00047 <span class="comment">// Sets the version number for this device.</span> |
|
44 <a name="l00048"></a>00048 iVersion=<a class="code" href="class_r_driver1.html#7d1f08b59801b5890fb77666e14d5e8f">RDriver1::VersionRequired</a>(); |
|
45 <a name="l00049"></a>00049 <span class="comment">// Indicate that we work with a PDD</span> |
|
46 <a name="l00050"></a>00050 iParseMask=KDeviceAllowPhysicalDevice; |
|
47 <a name="l00051"></a>00051 } |
|
48 <a name="l00052"></a>00052 |
|
49 <a name="l00059"></a><a class="code" href="class_d_driver1_factory.html#7aa17c3f9b4d020f1d48fa89bf587452">00059</a> TInt <a class="code" href="class_d_driver1_factory.html#7aa17c3f9b4d020f1d48fa89bf587452">DDriver1Factory::Install</a>() |
|
50 <a name="l00060"></a>00060 { |
|
51 <a name="l00061"></a>00061 <span class="keywordflow">return</span> SetName(&<a class="code" href="class_r_driver1.html#7e98e9f7ec04a53a404d646481f589ca">RDriver1::Name</a>()); |
|
52 <a name="l00062"></a>00062 } |
|
53 <a name="l00063"></a>00063 |
|
54 <a name="l00067"></a><a class="code" href="class_d_driver1_factory.html#2826ff8e0deb203cdabd8a5d31d4eccd">00067</a> <a class="code" href="class_d_driver1_factory.html#2826ff8e0deb203cdabd8a5d31d4eccd">DDriver1Factory::~DDriver1Factory</a>() |
|
55 <a name="l00068"></a>00068 { |
|
56 <a name="l00069"></a>00069 } |
|
57 <a name="l00070"></a>00070 |
|
58 <a name="l00076"></a><a class="code" href="class_d_driver1_factory.html#f6c76eec10ac39e32d1095b9b3a7ecc0">00076</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_factory.html#f6c76eec10ac39e32d1095b9b3a7ecc0">DDriver1Factory::GetCaps</a>(TDes8& aDes)<span class="keyword"> const</span> |
|
59 <a name="l00077"></a>00077 <span class="keyword"> </span>{ |
|
60 <a name="l00078"></a>00078 <span class="comment">// Create a capabilities object</span> |
|
61 <a name="l00079"></a>00079 <a class="code" href="class_r_driver1_1_1_t_caps.html">RDriver1::TCaps</a> caps; |
|
62 <a name="l00080"></a>00080 caps.<a class="code" href="class_r_driver1_1_1_t_caps.html#8acb73cae71002cb92ff7944036da689">iVersion</a> = iVersion; |
|
63 <a name="l00081"></a>00081 <span class="comment">// Write it back to user memory</span> |
|
64 <a name="l00082"></a>00082 Kern::InfoCopy(aDes,(TUint8*)&caps,<span class="keyword">sizeof</span>(caps)); |
|
65 <a name="l00083"></a>00083 } |
|
66 <a name="l00084"></a>00084 |
|
67 <a name="l00093"></a><a class="code" href="class_d_driver1_factory.html#2c28467be74fbe3022b3ae998c18894a">00093</a> TInt <a class="code" href="class_d_driver1_factory.html#2c28467be74fbe3022b3ae998c18894a">DDriver1Factory::Create</a>(DLogicalChannelBase*& aChannel) |
|
68 <a name="l00094"></a>00094 { |
|
69 <a name="l00095"></a>00095 aChannel=<span class="keyword">new</span> <a class="code" href="class_d_driver1_channel.html">DDriver1Channel</a>; |
|
70 <a name="l00096"></a>00096 <span class="keywordflow">if</span>(!aChannel) |
|
71 <a name="l00097"></a>00097 <span class="keywordflow">return</span> KErrNoMemory; |
|
72 <a name="l00098"></a>00098 |
|
73 <a name="l00099"></a>00099 <span class="keywordflow">return</span> KErrNone; |
|
74 <a name="l00100"></a>00100 } |
|
75 <a name="l00101"></a>00101 |
|
76 <a name="l00105"></a><a class="code" href="class_d_driver1_channel.html#d8a91a9260da7cfc7ee245a77b853d6e">00105</a> <a class="code" href="class_d_driver1_channel.html#d8a91a9260da7cfc7ee245a77b853d6e">DDriver1Channel::DDriver1Channel</a>() |
|
77 <a name="l00106"></a>00106 : iSendDataDfc(SendDataDfc, this, 1), <span class="comment">// DFC is priority '1'</span> |
|
78 <a name="l00107"></a>00107 iReceiveDataDfc(ReceiveDataDfc, this, 1) <span class="comment">// DFC is priority '1'</span> |
|
79 <a name="l00108"></a>00108 { |
|
80 <a name="l00109"></a>00109 <span class="comment">// Get pointer to client thread's DThread object</span> |
|
81 <a name="l00110"></a>00110 iClient=&Kern::CurrentThread(); |
|
82 <a name="l00111"></a>00111 |
|
83 <a name="l00112"></a>00112 <span class="comment">// Open a reference on client thread so its control block can't disappear until</span> |
|
84 <a name="l00113"></a>00113 <span class="comment">// this driver has finished with it.</span> |
|
85 <a name="l00114"></a>00114 <span class="comment">// Note, this call to Open can't fail since it's the thread we are currently running in.</span> |
|
86 <a name="l00115"></a>00115 iClient->Open(); |
|
87 <a name="l00116"></a>00116 } |
|
88 <a name="l00117"></a>00117 |
|
89 <a name="l00128"></a><a class="code" href="class_d_driver1_channel.html#c08720a956dbae4e7127da92944c35ad">00128</a> TInt <a class="code" href="class_d_driver1_channel.html#c08720a956dbae4e7127da92944c35ad">DDriver1Channel::DoCreate</a>(TInt <span class="comment">/*aUnit*/</span>, <span class="keyword">const</span> TDesC8* <span class="comment">/*aInfo*/</span>, <span class="keyword">const</span> TVersion& aVer) |
|
90 <a name="l00129"></a>00129 { |
|
91 <a name="l00130"></a>00130 <span class="comment">// Check Platform Security capabilities of client thread (if required).</span> |
|
92 <a name="l00131"></a>00131 <span class="comment">//</span> |
|
93 <a name="l00132"></a>00132 <span class="comment">// Here we handle the simple case where:</span> |
|
94 <a name="l00133"></a>00133 <span class="comment">// 1. The device driver can only have one client thread</span> |
|
95 <a name="l00134"></a>00134 <span class="comment">// 2. The security policy is the binary all-or-nothing policy.</span> |
|
96 <a name="l00135"></a>00135 <span class="comment">// E.g. "If you have the right capability you can do anything with the driver</span> |
|
97 <a name="l00136"></a>00136 <span class="comment">// and if you don't have the capability you can't do anything"</span> |
|
98 <a name="l00137"></a>00137 <span class="comment">// </span> |
|
99 <a name="l00138"></a>00138 <span class="comment">// If only some functionality of the driver is restricted, then the security check should</span> |
|
100 <a name="l00139"></a>00139 <span class="comment">// go elsewhere, e.g. in DoRequest/DoControl. In that case Kern::CurrentThreadHasCapability()</span> |
|
101 <a name="l00140"></a>00140 <span class="comment">// shouldn't be used because the 'current thread' isn't the client.</span> |
|
102 <a name="l00141"></a>00141 <span class="comment">//</span> |
|
103 <a name="l00142"></a>00142 <span class="comment">// In this example we do a check here for ECapabilityMultimediaDD...</span> |
|
104 <a name="l00143"></a>00143 <span class="keywordflow">if</span>(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING(<span class="stringliteral">"Checked by DRIVER1"</span>))) |
|
105 <a name="l00144"></a>00144 <span class="keywordflow">return</span> KErrPermissionDenied; |
|
106 <a name="l00145"></a>00145 |
|
107 <a name="l00146"></a>00146 <span class="comment">// Check version</span> |
|
108 <a name="l00147"></a>00147 <span class="keywordflow">if</span> (!Kern::QueryVersionSupported(<a class="code" href="class_r_driver1.html#7d1f08b59801b5890fb77666e14d5e8f">RDriver1::VersionRequired</a>(),aVer)) |
|
109 <a name="l00148"></a>00148 <span class="keywordflow">return</span> KErrNotSupported; |
|
110 <a name="l00149"></a>00149 |
|
111 <a name="l00150"></a>00150 <span class="comment">// Setup LDD for receiving client messages</span> |
|
112 <a name="l00151"></a>00151 SetDfcQ(Kern::DfcQue0()); |
|
113 <a name="l00152"></a>00152 iMsgQ.Receive(); |
|
114 <a name="l00153"></a>00153 |
|
115 <a name="l00154"></a>00154 <span class="comment">// To receive client messages, associate the DFCs with the queue created above.</span> |
|
116 <a name="l00155"></a>00155 iSendDataDfc.SetDfcQ(iDfcQ); |
|
117 <a name="l00156"></a>00156 iReceiveDataDfc.SetDfcQ(iDfcQ); |
|
118 <a name="l00157"></a>00157 |
|
119 <a name="l00158"></a>00158 <span class="comment">// Give PDD a pointer to this channel</span> |
|
120 <a name="l00159"></a>00159 Pdd()-><a class="code" href="class_d_driver1.html#8af44708d43002e2485765269d99d846">iLdd</a>=<span class="keyword">this</span>; |
|
121 <a name="l00160"></a>00160 |
|
122 <a name="l00161"></a>00161 <span class="comment">// Done</span> |
|
123 <a name="l00162"></a>00162 <span class="keywordflow">return</span> KErrNone; |
|
124 <a name="l00163"></a>00163 } |
|
125 <a name="l00164"></a>00164 |
|
126 <a name="l00168"></a><a class="code" href="class_d_driver1_channel.html#2739d21598133597f0ac408b20280049">00168</a> <a class="code" href="class_d_driver1_channel.html#2739d21598133597f0ac408b20280049">DDriver1Channel::~DDriver1Channel</a>() |
|
127 <a name="l00169"></a>00169 { |
|
128 <a name="l00170"></a>00170 <span class="comment">// Cancel all processing that we may be doing</span> |
|
129 <a name="l00171"></a>00171 DoCancel(RDriver1::EAllRequests); |
|
130 <a name="l00172"></a>00172 <span class="comment">// Close our reference on the client thread</span> |
|
131 <a name="l00173"></a>00173 Kern::SafeClose((DObject*&)iClient,NULL); |
|
132 <a name="l00174"></a>00174 } |
|
133 <a name="l00175"></a>00175 |
|
134 <a name="l00183"></a><a class="code" href="class_d_driver1_channel.html#b06d988aab9e3c39aaf6e5dabe389f70">00183</a> TInt <a class="code" href="class_d_driver1_channel.html#b06d988aab9e3c39aaf6e5dabe389f70">DDriver1Channel::RequestUserHandle</a>(DThread* aThread, TOwnerType aType) |
|
135 <a name="l00184"></a>00184 { |
|
136 <a name="l00185"></a>00185 <span class="comment">// Make sure that only our client can get a handle</span> |
|
137 <a name="l00186"></a>00186 <span class="keywordflow">if</span> (aType!=EOwnerThread || aThread!=iClient) |
|
138 <a name="l00187"></a>00187 <span class="keywordflow">return</span> KErrAccessDenied; |
|
139 <a name="l00188"></a>00188 <span class="keywordflow">return</span> KErrNone; |
|
140 <a name="l00189"></a>00189 } |
|
141 <a name="l00190"></a>00190 |
|
142 <a name="l00202"></a><a class="code" href="class_d_driver1_channel.html#dc1467b94ce109571581efa52f43e380">00202</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_channel.html#dc1467b94ce109571581efa52f43e380">DDriver1Channel::HandleMsg</a>(TMessageBase* aMsg) |
|
143 <a name="l00203"></a>00203 { |
|
144 <a name="l00204"></a>00204 TThreadMessage& m=*(TThreadMessage*)aMsg; |
|
145 <a name="l00205"></a>00205 |
|
146 <a name="l00206"></a>00206 <span class="comment">// Get message type</span> |
|
147 <a name="l00207"></a>00207 TInt <span class="keywordtype">id</span>=m.iValue; |
|
148 <a name="l00208"></a>00208 |
|
149 <a name="l00209"></a>00209 <span class="comment">// Decode the message type and dispatch it to the relevent handler function...</span> |
|
150 <a name="l00210"></a>00210 <span class="keywordflow">if</span> (<span class="keywordtype">id</span>==(TInt)ECloseMsg) |
|
151 <a name="l00211"></a>00211 { |
|
152 <a name="l00212"></a>00212 <span class="comment">// Channel Close</span> |
|
153 <a name="l00213"></a>00213 DoCancel(RDriver1::EAllRequests); |
|
154 <a name="l00214"></a>00214 m.Complete(KErrNone, EFalse); |
|
155 <a name="l00215"></a>00215 <span class="keywordflow">return</span>; |
|
156 <a name="l00216"></a>00216 } |
|
157 <a name="l00217"></a>00217 |
|
158 <a name="l00218"></a>00218 <span class="keywordflow">if</span> (<span class="keywordtype">id</span>==KMaxTInt) |
|
159 <a name="l00219"></a>00219 { |
|
160 <a name="l00220"></a>00220 <span class="comment">// DoCancel</span> |
|
161 <a name="l00221"></a>00221 DoCancel(m.Int0()); |
|
162 <a name="l00222"></a>00222 m.Complete(KErrNone,ETrue); |
|
163 <a name="l00223"></a>00223 <span class="keywordflow">return</span>; |
|
164 <a name="l00224"></a>00224 } |
|
165 <a name="l00225"></a>00225 |
|
166 <a name="l00226"></a>00226 <span class="keywordflow">if</span> (<span class="keywordtype">id</span><0) |
|
167 <a name="l00227"></a>00227 { |
|
168 <a name="l00228"></a>00228 <span class="comment">// DoRequest</span> |
|
169 <a name="l00229"></a>00229 TRequestStatus* pS=(TRequestStatus*)m.Ptr0(); |
|
170 <a name="l00230"></a>00230 TInt r=DoRequest(~<span class="keywordtype">id</span>,pS,m.Ptr1(),m.Ptr2()); |
|
171 <a name="l00231"></a>00231 <span class="keywordflow">if</span> (r!=KErrNone) |
|
172 <a name="l00232"></a>00232 Kern::RequestComplete(iClient,pS,r); |
|
173 <a name="l00233"></a>00233 m.Complete(KErrNone,ETrue); |
|
174 <a name="l00234"></a>00234 } |
|
175 <a name="l00235"></a>00235 <span class="keywordflow">else</span> |
|
176 <a name="l00236"></a>00236 { |
|
177 <a name="l00237"></a>00237 <span class="comment">// DoControl</span> |
|
178 <a name="l00238"></a>00238 TInt r=DoControl(<span class="keywordtype">id</span>,m.Ptr0(),m.Ptr1()); |
|
179 <a name="l00239"></a>00239 m.Complete(r,ETrue); |
|
180 <a name="l00240"></a>00240 } |
|
181 <a name="l00241"></a>00241 } |
|
182 <a name="l00242"></a>00242 |
|
183 <a name="l00250"></a>00250 TInt DDriver1Channel::DoControl(TInt aFunction, TAny* a1, TAny* a2) |
|
184 <a name="l00251"></a>00251 { |
|
185 <a name="l00252"></a>00252 (void)a2; <span class="comment">// a2 not used in this example</span> |
|
186 <a name="l00253"></a>00253 |
|
187 <a name="l00254"></a>00254 TInt r; |
|
188 <a name="l00255"></a>00255 |
|
189 <a name="l00256"></a>00256 <span class="keywordflow">switch</span> (aFunction) |
|
190 <a name="l00257"></a>00257 { |
|
191 <a name="l00258"></a>00258 <span class="keywordflow">case</span> RDriver1::EGetConfig: |
|
192 <a name="l00259"></a>00259 r = GetConfig((TDes8*)a1); |
|
193 <a name="l00260"></a>00260 <span class="keywordflow">break</span>; |
|
194 <a name="l00261"></a>00261 |
|
195 <a name="l00262"></a>00262 <span class="keywordflow">case</span> RDriver1::ESetConfig: |
|
196 <a name="l00263"></a>00263 r = SetConfig((<span class="keyword">const</span> TDesC8*)a1); |
|
197 <a name="l00264"></a>00264 <span class="keywordflow">break</span>; |
|
198 <a name="l00265"></a>00265 |
|
199 <a name="l00266"></a>00266 <span class="keywordflow">default</span>: |
|
200 <a name="l00267"></a>00267 r = KErrNotSupported; |
|
201 <a name="l00268"></a>00268 <span class="keywordflow">break</span>; |
|
202 <a name="l00269"></a>00269 } |
|
203 <a name="l00270"></a>00270 |
|
204 <a name="l00271"></a>00271 <span class="keywordflow">return</span> r; |
|
205 <a name="l00272"></a>00272 } |
|
206 <a name="l00273"></a>00273 |
|
207 <a name="l00282"></a>00282 TInt DDriver1Channel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2) |
|
208 <a name="l00283"></a>00283 { |
|
209 <a name="l00284"></a>00284 (void)a2; <span class="comment">// a2 not used in this example</span> |
|
210 <a name="l00285"></a>00285 |
|
211 <a name="l00286"></a>00286 TInt r; |
|
212 <a name="l00287"></a>00287 |
|
213 <a name="l00288"></a>00288 <span class="keywordflow">switch</span>(aReqNo) |
|
214 <a name="l00289"></a>00289 { |
|
215 <a name="l00290"></a>00290 <span class="keywordflow">case</span> RDriver1::ESendData: |
|
216 <a name="l00291"></a>00291 r=SendData(aStatus,(<span class="keyword">const</span> TDesC8*)a1); |
|
217 <a name="l00292"></a>00292 <span class="keywordflow">break</span>; |
|
218 <a name="l00293"></a>00293 |
|
219 <a name="l00294"></a>00294 <span class="keywordflow">case</span> RDriver1::EReceiveData: |
|
220 <a name="l00295"></a>00295 r=ReceiveData(aStatus,(TDes8*)a1); |
|
221 <a name="l00296"></a>00296 <span class="keywordflow">break</span>; |
|
222 <a name="l00297"></a>00297 |
|
223 <a name="l00298"></a>00298 <span class="keywordflow">default</span>: |
|
224 <a name="l00299"></a>00299 r = KErrNotSupported; |
|
225 <a name="l00300"></a>00300 <span class="keywordflow">break</span>; |
|
226 <a name="l00301"></a>00301 } |
|
227 <a name="l00302"></a>00302 |
|
228 <a name="l00303"></a>00303 <span class="keywordflow">return</span> r; |
|
229 <a name="l00304"></a>00304 } |
|
230 <a name="l00305"></a>00305 |
|
231 <a name="l00310"></a>00310 <span class="keywordtype">void</span> DDriver1Channel::DoCancel(TUint aMask) |
|
232 <a name="l00311"></a>00311 { |
|
233 <a name="l00312"></a>00312 <span class="keywordflow">if</span>(aMask&(1<<RDriver1::ESendData)) |
|
234 <a name="l00313"></a>00313 SendDataCancel(); |
|
235 <a name="l00314"></a>00314 <span class="keywordflow">if</span>(aMask&(1<<RDriver1::EReceiveData)) |
|
236 <a name="l00315"></a>00315 ReceiveDataCancel(); |
|
237 <a name="l00316"></a>00316 } |
|
238 <a name="l00317"></a>00317 |
|
239 <a name="l00318"></a>00318 <span class="comment">//</span> |
|
240 <a name="l00319"></a>00319 <span class="comment">// Methods for processing configuration control messages</span> |
|
241 <a name="l00320"></a>00320 <span class="comment">//</span> |
|
242 <a name="l00321"></a>00321 |
|
243 <a name="l00326"></a>00326 TInt DDriver1Channel::GetConfig(TDes8* aConfigBuf) |
|
244 <a name="l00327"></a>00327 { |
|
245 <a name="l00328"></a>00328 <span class="comment">// Create a structure giving the current configuration</span> |
|
246 <a name="l00329"></a>00329 <a class="code" href="class_r_driver1_1_1_t_config.html">RDriver1::TConfig</a> config; |
|
247 <a name="l00330"></a>00330 CurrentConfig(config); |
|
248 <a name="l00331"></a>00331 |
|
249 <a name="l00332"></a>00332 <span class="comment">// Write the config to the client</span> |
|
250 <a name="l00333"></a>00333 TPtrC8 ptr((<span class="keyword">const</span> TUint8*)&config,<span class="keyword">sizeof</span>(config)); |
|
251 <a name="l00334"></a>00334 <span class="keywordflow">return</span> Kern::ThreadDesWrite(iClient,aConfigBuf,ptr,0,KTruncateToMaxLength,NULL); |
|
252 <a name="l00335"></a>00335 } |
|
253 <a name="l00336"></a>00336 |
|
254 <a name="l00341"></a>00341 TInt DDriver1Channel::SetConfig(<span class="keyword">const</span> TDesC8* aConfigBuf) |
|
255 <a name="l00342"></a>00342 { |
|
256 <a name="l00343"></a>00343 <span class="comment">// Don't allow configuration changes whilst we're busy</span> |
|
257 <a name="l00344"></a>00344 <span class="keywordflow">if</span>(iSendDataStatus || iReceiveDataStatus) |
|
258 <a name="l00345"></a>00345 <span class="keywordflow">return</span> KErrInUse; |
|
259 <a name="l00346"></a>00346 |
|
260 <a name="l00347"></a>00347 <span class="comment">// Create a config structure.</span> |
|
261 <a name="l00348"></a>00348 <a class="code" href="class_r_driver1_1_1_t_config.html">RDriver1::TConfig</a> config; |
|
262 <a name="l00349"></a>00349 CurrentConfig(config); |
|
263 <a name="l00350"></a>00350 |
|
264 <a name="l00351"></a>00351 <span class="comment">// Note: We have filled config with the current settings, this is to allow</span> |
|
265 <a name="l00352"></a>00352 <span class="comment">// backwards compatibility when a client gives us an old (and shorter) version</span> |
|
266 <a name="l00353"></a>00353 <span class="comment">// of the config structure.</span> |
|
267 <a name="l00354"></a>00354 |
|
268 <a name="l00355"></a>00355 <span class="comment">// Read the config structure from client</span> |
|
269 <a name="l00356"></a>00356 TPtr8 ptr((TUint8*)&config,<span class="keyword">sizeof</span>(config)); |
|
270 <a name="l00357"></a>00357 TInt r=Kern::ThreadDesRead(iClient,aConfigBuf,ptr,0); |
|
271 <a name="l00358"></a>00358 <span class="keywordflow">if</span>(r!=KErrNone) |
|
272 <a name="l00359"></a>00359 <span class="keywordflow">return</span> r; |
|
273 <a name="l00360"></a>00360 |
|
274 <a name="l00361"></a>00361 <span class="comment">// Use config data to setup the driver. Checking that parameters which aren't settable</span> |
|
275 <a name="l00362"></a>00362 <span class="comment">// either contain the correct values or are zero (meaning 'default')</span> |
|
276 <a name="l00363"></a>00363 <span class="keywordflow">if</span>(config.iPddBufferSize && config.iPddBufferSize!=Pdd()->BufferSize()) |
|
277 <a name="l00364"></a>00364 <span class="keywordflow">return</span> KErrArgument; |
|
278 <a name="l00365"></a>00365 |
|
279 <a name="l00366"></a>00366 <span class="keywordflow">if</span>(config.iMaxSendDataSize && config.iMaxSendDataSize!=iSendDataBuffer.MaxSize()) |
|
280 <a name="l00367"></a>00367 <span class="keywordflow">return</span> KErrArgument; |
|
281 <a name="l00368"></a>00368 |
|
282 <a name="l00369"></a>00369 <span class="keywordflow">if</span>(config.iMaxReceiveDataSize && config.iMaxReceiveDataSize!=iReceiveDataBuffer.MaxSize()) |
|
283 <a name="l00370"></a>00370 <span class="keywordflow">return</span> KErrArgument; |
|
284 <a name="l00371"></a>00371 |
|
285 <a name="l00372"></a>00372 r=Pdd()-><a class="code" href="class_d_driver1.html#0d7b74b4271f06588815756cb14f0d44">SetSpeed</a>(config.iSpeed); |
|
286 <a name="l00373"></a>00373 <span class="keywordflow">if</span>(r!=KErrNone) |
|
287 <a name="l00374"></a>00374 <span class="keywordflow">return</span> r; |
|
288 <a name="l00375"></a>00375 |
|
289 <a name="l00376"></a>00376 <span class="keywordflow">return</span> r; |
|
290 <a name="l00377"></a>00377 } |
|
291 <a name="l00378"></a>00378 |
|
292 <a name="l00383"></a>00383 <span class="keywordtype">void</span> DDriver1Channel::CurrentConfig(<a class="code" href="class_r_driver1_1_1_t_config.html">RDriver1::TConfig</a>& aConfig) |
|
293 <a name="l00384"></a>00384 { |
|
294 <a name="l00385"></a>00385 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#1bbc5535ddf8863917bf9ca18a688d91">iSpeed</a> = Pdd()-><a class="code" href="class_d_driver1.html#5545b403164f1bcda66d85f6bda60a3d">Speed</a>(); |
|
295 <a name="l00386"></a>00386 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#8355e96a67e66e79903fe0a74f17b6d2">iPddBufferSize</a> = Pdd()-><a class="code" href="class_d_driver1.html#6eeaff28ed4130abea1c443f35e2425e">BufferSize</a>(); |
|
296 <a name="l00387"></a>00387 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#5d055bb015e0902481ced408c2c7892b">iMaxSendDataSize</a> = iSendDataBuffer.MaxSize(); |
|
297 <a name="l00388"></a>00388 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#3b6388ffc3c59b31e9f003ca2bf12812">iMaxReceiveDataSize</a> = iReceiveDataBuffer.MaxSize(); |
|
298 <a name="l00389"></a>00389 } |
|
299 <a name="l00390"></a>00390 |
|
300 <a name="l00391"></a>00391 <span class="comment">//</span> |
|
301 <a name="l00392"></a>00392 <span class="comment">// Methods for processing 'SendData'</span> |
|
302 <a name="l00393"></a>00393 <span class="comment">//</span> |
|
303 <a name="l00394"></a>00394 |
|
304 <a name="l00402"></a>00402 TInt DDriver1Channel::SendData(TRequestStatus* aStatus,<span class="keyword">const</span> TDesC8* aData) |
|
305 <a name="l00403"></a>00403 { |
|
306 <a name="l00404"></a>00404 <span class="comment">// Check that a 'SendData' isn't already in progress</span> |
|
307 <a name="l00405"></a>00405 <span class="keywordflow">if</span>(iSendDataStatus) |
|
308 <a name="l00406"></a>00406 { |
|
309 <a name="l00407"></a>00407 Kern::ThreadKill(iClient,EExitPanic,ERequestAlreadyPending,KDriver1PanicCategory); |
|
310 <a name="l00408"></a>00408 <span class="keywordflow">return</span> KErrInUse; |
|
311 <a name="l00409"></a>00409 } |
|
312 <a name="l00410"></a>00410 |
|
313 <a name="l00411"></a>00411 <span class="comment">// Read data from client into our buffer</span> |
|
314 <a name="l00412"></a>00412 TInt r=Kern::ThreadDesRead(iClient,aData,iSendDataBuffer,0); |
|
315 <a name="l00413"></a>00413 <span class="keywordflow">if</span>(r!=KErrNone) |
|
316 <a name="l00414"></a>00414 <span class="keywordflow">return</span> r; |
|
317 <a name="l00415"></a>00415 |
|
318 <a name="l00416"></a>00416 <span class="comment">// Give data to PDD so that it can do the work</span> |
|
319 <a name="l00417"></a>00417 r=Pdd()-><a class="code" href="class_d_driver1.html#c162d25bf54dbf154e13d4842564a348">SendData</a>(iSendDataBuffer); |
|
320 <a name="l00418"></a>00418 <span class="keywordflow">if</span>(r!=KErrNone) |
|
321 <a name="l00419"></a>00419 <span class="keywordflow">return</span> r; |
|
322 <a name="l00420"></a>00420 |
|
323 <a name="l00421"></a>00421 <span class="comment">// Save the client request status and return</span> |
|
324 <a name="l00422"></a>00422 iSendDataStatus = aStatus; |
|
325 <a name="l00423"></a>00423 <span class="keywordflow">return</span> KErrNone; |
|
326 <a name="l00424"></a>00424 } |
|
327 <a name="l00425"></a>00425 |
|
328 <a name="l00429"></a>00429 <span class="keywordtype">void</span> DDriver1Channel::SendDataCancel() |
|
329 <a name="l00430"></a>00430 { |
|
330 <a name="l00431"></a>00431 <span class="keywordflow">if</span>(iSendDataStatus) |
|
331 <a name="l00432"></a>00432 { |
|
332 <a name="l00433"></a>00433 <span class="comment">// Tell PDD to stop processing the request</span> |
|
333 <a name="l00434"></a>00434 Pdd()-><a class="code" href="class_d_driver1.html#9a3a3ab2af9124b17d69bfa3dd713944">SendDataCancel</a>(); |
|
334 <a name="l00435"></a>00435 <span class="comment">// Cancel DFC</span> |
|
335 <a name="l00436"></a>00436 iSendDataDfc.Cancel(); |
|
336 <a name="l00437"></a>00437 <span class="comment">// Complete client's request</span> |
|
337 <a name="l00438"></a>00438 Kern::RequestComplete(iClient,iSendDataStatus,KErrCancel); |
|
338 <a name="l00439"></a>00439 } |
|
339 <a name="l00440"></a>00440 } |
|
340 <a name="l00441"></a>00441 |
|
341 <a name="l00445"></a><a class="code" href="class_d_driver1_channel.html#4ddf64ba96fa2febc011034d3fcb46c8">00445</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_channel.html#4ddf64ba96fa2febc011034d3fcb46c8">DDriver1Channel::SendDataComplete</a>(TInt aResult) |
|
342 <a name="l00446"></a>00446 { |
|
343 <a name="l00447"></a>00447 <span class="comment">// Save result code</span> |
|
344 <a name="l00448"></a>00448 iSendDataResult = aResult; |
|
345 <a name="l00449"></a>00449 <span class="comment">// Queue DFC</span> |
|
346 <a name="l00450"></a>00450 iSendDataDfc.Add(); |
|
347 <a name="l00451"></a>00451 } |
|
348 <a name="l00452"></a>00452 |
|
349 <a name="l00457"></a>00457 <span class="keywordtype">void</span> DDriver1Channel::SendDataDfc(TAny* aPtr) |
|
350 <a name="l00458"></a>00458 { |
|
351 <a name="l00459"></a>00459 ((<a class="code" href="class_d_driver1_channel.html">DDriver1Channel</a>*)aPtr)->DoSendDataComplete(); |
|
352 <a name="l00460"></a>00460 } |
|
353 <a name="l00461"></a>00461 |
|
354 <a name="l00465"></a>00465 <span class="keywordtype">void</span> DDriver1Channel::DoSendDataComplete() |
|
355 <a name="l00466"></a>00466 { |
|
356 <a name="l00467"></a>00467 TInt result = iSendDataResult; |
|
357 <a name="l00468"></a>00468 <span class="comment">// Complete clients request</span> |
|
358 <a name="l00469"></a>00469 Kern::RequestComplete(iClient,iSendDataStatus,result); |
|
359 <a name="l00470"></a>00470 } |
|
360 <a name="l00471"></a>00471 |
|
361 <a name="l00472"></a>00472 <span class="comment">//</span> |
|
362 <a name="l00473"></a>00473 <span class="comment">// Methods for processing 'ReceiveData'</span> |
|
363 <a name="l00474"></a>00474 <span class="comment">//</span> |
|
364 <a name="l00475"></a>00475 |
|
365 <a name="l00482"></a>00482 TInt DDriver1Channel::ReceiveData(TRequestStatus* aStatus,TDes8* aPtr) |
|
366 <a name="l00483"></a>00483 { |
|
367 <a name="l00484"></a>00484 <span class="comment">// Check that a 'ReceiveData' isn't already in progress</span> |
|
368 <a name="l00485"></a>00485 <span class="keywordflow">if</span>(iReceiveDataStatus) |
|
369 <a name="l00486"></a>00486 { |
|
370 <a name="l00487"></a>00487 Kern::ThreadKill(iClient,EExitPanic,ERequestAlreadyPending,KDriver1PanicCategory); |
|
371 <a name="l00488"></a>00488 <span class="keywordflow">return</span> KErrInUse; |
|
372 <a name="l00489"></a>00489 } |
|
373 <a name="l00490"></a>00490 |
|
374 <a name="l00491"></a>00491 <span class="comment">// Ask PDD for data</span> |
|
375 <a name="l00492"></a>00492 TInt r=Pdd()-><a class="code" href="class_d_driver1.html#cdc78f9aa6c84f645eeb8153ad3d0cad">ReceiveData</a>(iReceiveDataBuffer); |
|
376 <a name="l00493"></a>00493 <span class="keywordflow">if</span>(r!=KErrNone) |
|
377 <a name="l00494"></a>00494 <span class="keywordflow">return</span> r; |
|
378 <a name="l00495"></a>00495 |
|
379 <a name="l00496"></a>00496 <span class="comment">// Save the client request status and descriptor before returning</span> |
|
380 <a name="l00497"></a>00497 iReceiveDataStatus = aStatus; |
|
381 <a name="l00498"></a>00498 iReceiveDataDescriptor = aPtr; |
|
382 <a name="l00499"></a>00499 <span class="keywordflow">return</span> KErrNone; |
|
383 <a name="l00500"></a>00500 } |
|
384 <a name="l00501"></a>00501 |
|
385 <a name="l00505"></a>00505 <span class="keywordtype">void</span> DDriver1Channel::ReceiveDataCancel() |
|
386 <a name="l00506"></a>00506 { |
|
387 <a name="l00507"></a>00507 <span class="keywordflow">if</span>(iReceiveDataStatus) |
|
388 <a name="l00508"></a>00508 { |
|
389 <a name="l00509"></a>00509 <span class="comment">// Tell PDD to stop processing the request</span> |
|
390 <a name="l00510"></a>00510 Pdd()-><a class="code" href="class_d_driver1.html#d23696951f712dc6503f554a131f2993">ReceiveDataCancel</a>(); |
|
391 <a name="l00511"></a>00511 <span class="comment">// Cancel DFC</span> |
|
392 <a name="l00512"></a>00512 iReceiveDataDfc.Cancel(); |
|
393 <a name="l00513"></a>00513 <span class="comment">// Finished with client descriptor, so NULL it to help detect coding errors</span> |
|
394 <a name="l00514"></a>00514 iReceiveDataDescriptor = NULL; |
|
395 <a name="l00515"></a>00515 <span class="comment">// Complete clients request</span> |
|
396 <a name="l00516"></a>00516 Kern::RequestComplete(iClient,iReceiveDataStatus,KErrCancel); |
|
397 <a name="l00517"></a>00517 } |
|
398 <a name="l00518"></a>00518 } |
|
399 <a name="l00519"></a>00519 |
|
400 <a name="l00523"></a><a class="code" href="class_d_driver1_channel.html#c5102a3cbbcb3fe11357481d8d204523">00523</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_channel.html#c5102a3cbbcb3fe11357481d8d204523">DDriver1Channel::ReceiveDataComplete</a>(TInt aResult) |
|
401 <a name="l00524"></a>00524 { |
|
402 <a name="l00525"></a>00525 <span class="comment">// Save result code</span> |
|
403 <a name="l00526"></a>00526 iReceiveDataResult = aResult; |
|
404 <a name="l00527"></a>00527 <span class="comment">// Queue DFC</span> |
|
405 <a name="l00528"></a>00528 iReceiveDataDfc.Add(); |
|
406 <a name="l00529"></a>00529 } |
|
407 <a name="l00530"></a>00530 |
|
408 <a name="l00535"></a>00535 <span class="keywordtype">void</span> DDriver1Channel::ReceiveDataDfc(TAny* aPtr) |
|
409 <a name="l00536"></a>00536 { |
|
410 <a name="l00537"></a>00537 ((<a class="code" href="class_d_driver1_channel.html">DDriver1Channel</a>*)aPtr)->DoReceiveDataComplete(); |
|
411 <a name="l00538"></a>00538 } |
|
412 <a name="l00539"></a>00539 |
|
413 <a name="l00543"></a>00543 <span class="keywordtype">void</span> DDriver1Channel::DoReceiveDataComplete() |
|
414 <a name="l00544"></a>00544 { |
|
415 <a name="l00545"></a>00545 <span class="comment">// Write data to client from our buffer</span> |
|
416 <a name="l00546"></a>00546 TInt result=Kern::ThreadDesWrite(iClient,iReceiveDataDescriptor,iReceiveDataBuffer,0); |
|
417 <a name="l00547"></a>00547 |
|
418 <a name="l00548"></a>00548 <span class="comment">// Finished with client descriptor, so NULL it to help detect coding errors</span> |
|
419 <a name="l00549"></a>00549 iReceiveDataDescriptor = NULL; |
|
420 <a name="l00550"></a>00550 |
|
421 <a name="l00551"></a>00551 <span class="comment">// Use result code from PDD if it was an error</span> |
|
422 <a name="l00552"></a>00552 <span class="keywordflow">if</span>(iReceiveDataResult!=KErrNone) |
|
423 <a name="l00553"></a>00553 result = iReceiveDataResult; |
|
424 <a name="l00554"></a>00554 |
|
425 <a name="l00555"></a>00555 <span class="comment">// Complete client's request</span> |
|
426 <a name="l00556"></a>00556 Kern::RequestComplete(iClient,iReceiveDataStatus,result); |
|
427 <a name="l00557"></a>00557 } |
|
428 <a name="l00558"></a>00558 |
|
429 </pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Thu Jan 21 10:32:56 2010 for TB10.1 Example Applications by |
|
430 <a href="http://www.doxygen.org/index.html"> |
|
431 <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.3 </small></address> |
|
432 </body> |
|
433 </html> |