Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/driver1__ldd_8cpp_source.html
Initial contribution of the Adaptation Documentation.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>TB9.2 Example Applications: examples/Base/IPC/AdvancedClientServerExample/driver/driver1_ldd.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.2 -->
<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>
<a name="l00002"></a>00002 <span class="comment">// All rights reserved.</span>
<a name="l00003"></a>00003 <span class="comment">// This component and the accompanying materials are made available</span>
<a name="l00004"></a>00004 <span class="comment">// under the terms of "Eclipse Public License v1.0"</span>
<a name="l00005"></a>00005 <span class="comment">// which accompanies this distribution, and is available</span>
<a name="l00006"></a>00006 <span class="comment">// at the URL "http://www.eclipse.org/legal/epl-v10.html".</span>
<a name="l00007"></a>00007 <span class="comment">//</span>
<a name="l00008"></a>00008 <span class="comment">// Initial Contributors:</span>
<a name="l00009"></a>00009 <span class="comment">// Nokia Corporation - initial contribution.</span>
<a name="l00010"></a>00010 <span class="comment">//</span>
<a name="l00011"></a>00011 <span class="comment">// Contributors:</span>
<a name="l00012"></a>00012 <span class="comment">//</span>
<a name="l00013"></a>00013 <span class="comment">// Description:</span>
<a name="l00014"></a>00014 <span class="comment">// Example Logical Device Driver</span>
<a name="l00015"></a>00015 <span class="comment">//</span>
<a name="l00016"></a>00016
<a name="l00017"></a>00017
<a name="l00018"></a>00018
<a name="l00023"></a>00023 <span class="preprocessor">#include <kern_priv.h></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "<a class="code" href="driver1_8h.html">driver1.h</a>"</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="driver1__dev_8h.html">driver1_dev.h</a>"</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <a class="code" href="secureclientandserver_8h.html#a5eadd4429627d82193b37536d4faa03a">_LIT</a>(KDriver1PanicCategory,<span class="stringliteral">"Driver1"</span>);
<a name="l00028"></a>00028
<a name="l00029"></a>00029 <span class="comment">//</span>
<a name="l00030"></a>00030 <span class="comment">// DDriver1Factory</span>
<a name="l00031"></a>00031 <span class="comment">//</span>
<a name="l00032"></a>00032
<a name="l00037"></a><a class="code" href="driver1__ldd_8cpp.html#a4a71e1215ca5b0b994e768478a13357d">00037</a> <a class="code" href="driver1__ldd_8cpp.html#a4a71e1215ca5b0b994e768478a13357d">DECLARE_STANDARD_LDD</a>()
<a name="l00038"></a>00038 {
<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>;
<a name="l00040"></a>00040 }
<a name="l00041"></a>00041
<a name="l00045"></a><a class="code" href="class_d_driver1_factory.html#a28b03d2a83e475c0ef628d87f574b326">00045</a> <a class="code" href="class_d_driver1_factory.html#a28b03d2a83e475c0ef628d87f574b326">DDriver1Factory::DDriver1Factory</a>()
<a name="l00046"></a>00046 {
<a name="l00047"></a>00047 <span class="comment">// Sets the version number for this device.</span>
<a name="l00048"></a>00048 iVersion=<a class="code" href="class_r_driver1.html#a7d1f08b59801b5890fb77666e14d5e8f">RDriver1::VersionRequired</a>();
<a name="l00049"></a>00049 <span class="comment">// Indicate that we work with a PDD</span>
<a name="l00050"></a>00050 iParseMask=KDeviceAllowPhysicalDevice;
<a name="l00051"></a>00051 }
<a name="l00052"></a>00052
<a name="l00059"></a><a class="code" href="class_d_driver1_factory.html#a7aa17c3f9b4d020f1d48fa89bf587452">00059</a> TInt <a class="code" href="class_d_driver1_factory.html#a7aa17c3f9b4d020f1d48fa89bf587452">DDriver1Factory::Install</a>()
<a name="l00060"></a>00060 {
<a name="l00061"></a>00061 <span class="keywordflow">return</span> SetName(&<a class="code" href="class_r_driver1.html#a7e98e9f7ec04a53a404d646481f589ca">RDriver1::Name</a>());
<a name="l00062"></a>00062 }
<a name="l00063"></a>00063
<a name="l00067"></a><a class="code" href="class_d_driver1_factory.html#a2826ff8e0deb203cdabd8a5d31d4eccd">00067</a> <a class="code" href="class_d_driver1_factory.html#a2826ff8e0deb203cdabd8a5d31d4eccd">DDriver1Factory::~DDriver1Factory</a>()
<a name="l00068"></a>00068 {
<a name="l00069"></a>00069 }
<a name="l00070"></a>00070
<a name="l00076"></a><a class="code" href="class_d_driver1_factory.html#af6c76eec10ac39e32d1095b9b3a7ecc0">00076</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_factory.html#af6c76eec10ac39e32d1095b9b3a7ecc0">DDriver1Factory::GetCaps</a>(TDes8& aDes)<span class="keyword"> const</span>
<a name="l00077"></a>00077 <span class="keyword"> </span>{
<a name="l00078"></a>00078 <span class="comment">// Create a capabilities object</span>
<a name="l00079"></a>00079 <a class="code" href="class_r_driver1_1_1_t_caps.html">RDriver1::TCaps</a> caps;
<a name="l00080"></a>00080 caps.iVersion = iVersion;
<a name="l00081"></a>00081 <span class="comment">// Write it back to user memory</span>
<a name="l00082"></a>00082 Kern::InfoCopy(aDes,(TUint8*)&caps,<span class="keyword">sizeof</span>(caps));
<a name="l00083"></a>00083 }
<a name="l00084"></a>00084
<a name="l00093"></a><a class="code" href="class_d_driver1_factory.html#a2c28467be74fbe3022b3ae998c18894a">00093</a> TInt <a class="code" href="class_d_driver1_factory.html#a2c28467be74fbe3022b3ae998c18894a">DDriver1Factory::Create</a>(DLogicalChannelBase*& aChannel)
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 aChannel=<span class="keyword">new</span> <a class="code" href="class_d_driver1_channel.html">DDriver1Channel</a>;
<a name="l00096"></a>00096 <span class="keywordflow">if</span>(!aChannel)
<a name="l00097"></a>00097 <span class="keywordflow">return</span> KErrNoMemory;
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="keywordflow">return</span> KErrNone;
<a name="l00100"></a>00100 }
<a name="l00101"></a>00101
<a name="l00105"></a><a class="code" href="class_d_driver1_channel.html#ad8a91a9260da7cfc7ee245a77b853d6e">00105</a> <a class="code" href="class_d_driver1_channel.html#ad8a91a9260da7cfc7ee245a77b853d6e">DDriver1Channel::DDriver1Channel</a>()
<a name="l00106"></a>00106 : iSendDataDfc(SendDataDfc, this, 1), <span class="comment">// DFC is priority '1'</span>
<a name="l00107"></a>00107 iReceiveDataDfc(ReceiveDataDfc, this, 1) <span class="comment">// DFC is priority '1'</span>
<a name="l00108"></a>00108 {
<a name="l00109"></a>00109 <span class="comment">// Get pointer to client thread's DThread object</span>
<a name="l00110"></a>00110 iClient=&Kern::CurrentThread();
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="comment">// Open a reference on client thread so its control block can't disappear until</span>
<a name="l00113"></a>00113 <span class="comment">// this driver has finished with it.</span>
<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>
<a name="l00115"></a>00115 iClient->Open();
<a name="l00116"></a>00116 }
<a name="l00117"></a>00117
<a name="l00128"></a><a class="code" href="class_d_driver1_channel.html#ac08720a956dbae4e7127da92944c35ad">00128</a> TInt <a class="code" href="class_d_driver1_channel.html#ac08720a956dbae4e7127da92944c35ad">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)
<a name="l00129"></a>00129 {
<a name="l00130"></a>00130 <span class="comment">// Check Platform Security capabilities of client thread (if required).</span>
<a name="l00131"></a>00131 <span class="comment">//</span>
<a name="l00132"></a>00132 <span class="comment">// Here we handle the simple case where:</span>
<a name="l00133"></a>00133 <span class="comment">// 1. The device driver can only have one client thread</span>
<a name="l00134"></a>00134 <span class="comment">// 2. The security policy is the binary all-or-nothing policy.</span>
<a name="l00135"></a>00135 <span class="comment">// E.g. "If you have the right capability you can do anything with the driver</span>
<a name="l00136"></a>00136 <span class="comment">// and if you don't have the capability you can't do anything"</span>
<a name="l00137"></a>00137 <span class="comment">// </span>
<a name="l00138"></a>00138 <span class="comment">// If only some functionality of the driver is restricted, then the security check should</span>
<a name="l00139"></a>00139 <span class="comment">// go elsewhere, e.g. in DoRequest/DoControl. In that case Kern::CurrentThreadHasCapability()</span>
<a name="l00140"></a>00140 <span class="comment">// shouldn't be used because the 'current thread' isn't the client.</span>
<a name="l00141"></a>00141 <span class="comment">//</span>
<a name="l00142"></a>00142 <span class="comment">// In this example we do a check here for ECapabilityMultimediaDD...</span>
<a name="l00143"></a>00143 <span class="keywordflow">if</span>(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING(<span class="stringliteral">"Checked by DRIVER1"</span>)))
<a name="l00144"></a>00144 <span class="keywordflow">return</span> KErrPermissionDenied;
<a name="l00145"></a>00145
<a name="l00146"></a>00146 <span class="comment">// Check version</span>
<a name="l00147"></a>00147 <span class="keywordflow">if</span> (!Kern::QueryVersionSupported(<a class="code" href="class_r_driver1.html#a7d1f08b59801b5890fb77666e14d5e8f">RDriver1::VersionRequired</a>(),aVer))
<a name="l00148"></a>00148 <span class="keywordflow">return</span> KErrNotSupported;
<a name="l00149"></a>00149
<a name="l00150"></a>00150 <span class="comment">// Setup LDD for receiving client messages</span>
<a name="l00151"></a>00151 SetDfcQ(Kern::DfcQue0());
<a name="l00152"></a>00152 iMsgQ.Receive();
<a name="l00153"></a>00153
<a name="l00154"></a>00154 <span class="comment">// To receive client messages, associate the DFCs with the queue created above.</span>
<a name="l00155"></a>00155 iSendDataDfc.SetDfcQ(iDfcQ);
<a name="l00156"></a>00156 iReceiveDataDfc.SetDfcQ(iDfcQ);
<a name="l00157"></a>00157
<a name="l00158"></a>00158 <span class="comment">// Give PDD a pointer to this channel</span>
<a name="l00159"></a>00159 Pdd()->iLdd=<span class="keyword">this</span>;
<a name="l00160"></a>00160
<a name="l00161"></a>00161 <span class="comment">// Done</span>
<a name="l00162"></a>00162 <span class="keywordflow">return</span> KErrNone;
<a name="l00163"></a>00163 }
<a name="l00164"></a>00164
<a name="l00168"></a><a class="code" href="class_d_driver1_channel.html#a2739d21598133597f0ac408b20280049">00168</a> <a class="code" href="class_d_driver1_channel.html#a2739d21598133597f0ac408b20280049">DDriver1Channel::~DDriver1Channel</a>()
<a name="l00169"></a>00169 {
<a name="l00170"></a>00170 <span class="comment">// Cancel all processing that we may be doing</span>
<a name="l00171"></a>00171 DoCancel(RDriver1::EAllRequests);
<a name="l00172"></a>00172 <span class="comment">// Close our reference on the client thread</span>
<a name="l00173"></a>00173 Kern::SafeClose((DObject*&)iClient,NULL);
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175
<a name="l00183"></a><a class="code" href="class_d_driver1_channel.html#ab06d988aab9e3c39aaf6e5dabe389f70">00183</a> TInt <a class="code" href="class_d_driver1_channel.html#ab06d988aab9e3c39aaf6e5dabe389f70">DDriver1Channel::RequestUserHandle</a>(DThread* aThread, TOwnerType aType)
<a name="l00184"></a>00184 {
<a name="l00185"></a>00185 <span class="comment">// Make sure that only our client can get a handle</span>
<a name="l00186"></a>00186 <span class="keywordflow">if</span> (aType!=EOwnerThread || aThread!=iClient)
<a name="l00187"></a>00187 <span class="keywordflow">return</span> KErrAccessDenied;
<a name="l00188"></a>00188 <span class="keywordflow">return</span> KErrNone;
<a name="l00189"></a>00189 }
<a name="l00190"></a>00190
<a name="l00202"></a><a class="code" href="class_d_driver1_channel.html#adc1467b94ce109571581efa52f43e380">00202</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_channel.html#adc1467b94ce109571581efa52f43e380">DDriver1Channel::HandleMsg</a>(TMessageBase* aMsg)
<a name="l00203"></a>00203 {
<a name="l00204"></a>00204 TThreadMessage& m=*(TThreadMessage*)aMsg;
<a name="l00205"></a>00205
<a name="l00206"></a>00206 <span class="comment">// Get message type</span>
<a name="l00207"></a>00207 TInt <span class="keywordtype">id</span>=m.iValue;
<a name="l00208"></a>00208
<a name="l00209"></a>00209 <span class="comment">// Decode the message type and dispatch it to the relevent handler function...</span>
<a name="l00210"></a>00210 <span class="keywordflow">if</span> (<span class="keywordtype">id</span>==(TInt)ECloseMsg)
<a name="l00211"></a>00211 {
<a name="l00212"></a>00212 <span class="comment">// Channel Close</span>
<a name="l00213"></a>00213 DoCancel(RDriver1::EAllRequests);
<a name="l00214"></a>00214 m.Complete(KErrNone, EFalse);
<a name="l00215"></a>00215 <span class="keywordflow">return</span>;
<a name="l00216"></a>00216 }
<a name="l00217"></a>00217
<a name="l00218"></a>00218 <span class="keywordflow">if</span> (<span class="keywordtype">id</span>==KMaxTInt)
<a name="l00219"></a>00219 {
<a name="l00220"></a>00220 <span class="comment">// DoCancel</span>
<a name="l00221"></a>00221 DoCancel(m.Int0());
<a name="l00222"></a>00222 m.Complete(KErrNone,ETrue);
<a name="l00223"></a>00223 <span class="keywordflow">return</span>;
<a name="l00224"></a>00224 }
<a name="l00225"></a>00225
<a name="l00226"></a>00226 <span class="keywordflow">if</span> (<span class="keywordtype">id</span><0)
<a name="l00227"></a>00227 {
<a name="l00228"></a>00228 <span class="comment">// DoRequest</span>
<a name="l00229"></a>00229 TRequestStatus* pS=(TRequestStatus*)m.Ptr0();
<a name="l00230"></a>00230 TInt r=DoRequest(~<span class="keywordtype">id</span>,pS,m.Ptr1(),m.Ptr2());
<a name="l00231"></a>00231 <span class="keywordflow">if</span> (r!=KErrNone)
<a name="l00232"></a>00232 Kern::RequestComplete(iClient,pS,r);
<a name="l00233"></a>00233 m.Complete(KErrNone,ETrue);
<a name="l00234"></a>00234 }
<a name="l00235"></a>00235 <span class="keywordflow">else</span>
<a name="l00236"></a>00236 {
<a name="l00237"></a>00237 <span class="comment">// DoControl</span>
<a name="l00238"></a>00238 TInt r=DoControl(<span class="keywordtype">id</span>,m.Ptr0(),m.Ptr1());
<a name="l00239"></a>00239 m.Complete(r,ETrue);
<a name="l00240"></a>00240 }
<a name="l00241"></a>00241 }
<a name="l00242"></a>00242
<a name="l00250"></a>00250 TInt DDriver1Channel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
<a name="l00251"></a>00251 {
<a name="l00252"></a>00252 (void)a2; <span class="comment">// a2 not used in this example</span>
<a name="l00253"></a>00253
<a name="l00254"></a>00254 TInt r;
<a name="l00255"></a>00255
<a name="l00256"></a>00256 <span class="keywordflow">switch</span> (aFunction)
<a name="l00257"></a>00257 {
<a name="l00258"></a>00258 <span class="keywordflow">case</span> RDriver1::EGetConfig:
<a name="l00259"></a>00259 r = GetConfig((TDes8*)a1);
<a name="l00260"></a>00260 <span class="keywordflow">break</span>;
<a name="l00261"></a>00261
<a name="l00262"></a>00262 <span class="keywordflow">case</span> RDriver1::ESetConfig:
<a name="l00263"></a>00263 r = SetConfig((<span class="keyword">const</span> TDesC8*)a1);
<a name="l00264"></a>00264 <span class="keywordflow">break</span>;
<a name="l00265"></a>00265
<a name="l00266"></a>00266 <span class="keywordflow">default</span>:
<a name="l00267"></a>00267 r = KErrNotSupported;
<a name="l00268"></a>00268 <span class="keywordflow">break</span>;
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270
<a name="l00271"></a>00271 <span class="keywordflow">return</span> r;
<a name="l00272"></a>00272 }
<a name="l00273"></a>00273
<a name="l00282"></a>00282 TInt DDriver1Channel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
<a name="l00283"></a>00283 {
<a name="l00284"></a>00284 (void)a2; <span class="comment">// a2 not used in this example</span>
<a name="l00285"></a>00285
<a name="l00286"></a>00286 TInt r;
<a name="l00287"></a>00287
<a name="l00288"></a>00288 <span class="keywordflow">switch</span>(aReqNo)
<a name="l00289"></a>00289 {
<a name="l00290"></a>00290 <span class="keywordflow">case</span> RDriver1::ESendData:
<a name="l00291"></a>00291 r=SendData(aStatus,(<span class="keyword">const</span> TDesC8*)a1);
<a name="l00292"></a>00292 <span class="keywordflow">break</span>;
<a name="l00293"></a>00293
<a name="l00294"></a>00294 <span class="keywordflow">case</span> RDriver1::EReceiveData:
<a name="l00295"></a>00295 r=ReceiveData(aStatus,(TDes8*)a1);
<a name="l00296"></a>00296 <span class="keywordflow">break</span>;
<a name="l00297"></a>00297
<a name="l00298"></a>00298 <span class="keywordflow">default</span>:
<a name="l00299"></a>00299 r = KErrNotSupported;
<a name="l00300"></a>00300 <span class="keywordflow">break</span>;
<a name="l00301"></a>00301 }
<a name="l00302"></a>00302
<a name="l00303"></a>00303 <span class="keywordflow">return</span> r;
<a name="l00304"></a>00304 }
<a name="l00305"></a>00305
<a name="l00310"></a>00310 <span class="keywordtype">void</span> DDriver1Channel::DoCancel(TUint aMask)
<a name="l00311"></a>00311 {
<a name="l00312"></a>00312 <span class="keywordflow">if</span>(aMask&(1<<RDriver1::ESendData))
<a name="l00313"></a>00313 SendDataCancel();
<a name="l00314"></a>00314 <span class="keywordflow">if</span>(aMask&(1<<RDriver1::EReceiveData))
<a name="l00315"></a>00315 ReceiveDataCancel();
<a name="l00316"></a>00316 }
<a name="l00317"></a>00317
<a name="l00318"></a>00318 <span class="comment">//</span>
<a name="l00319"></a>00319 <span class="comment">// Methods for processing configuration control messages</span>
<a name="l00320"></a>00320 <span class="comment">//</span>
<a name="l00321"></a>00321
<a name="l00326"></a>00326 TInt DDriver1Channel::GetConfig(TDes8* aConfigBuf)
<a name="l00327"></a>00327 {
<a name="l00328"></a>00328 <span class="comment">// Create a structure giving the current configuration</span>
<a name="l00329"></a>00329 <a class="code" href="class_r_driver1_1_1_t_config.html">RDriver1::TConfig</a> config;
<a name="l00330"></a>00330 CurrentConfig(config);
<a name="l00331"></a>00331
<a name="l00332"></a>00332 <span class="comment">// Write the config to the client</span>
<a name="l00333"></a>00333 TPtrC8 ptr((<span class="keyword">const</span> TUint8*)&config,<span class="keyword">sizeof</span>(config));
<a name="l00334"></a>00334 <span class="keywordflow">return</span> Kern::ThreadDesWrite(iClient,aConfigBuf,ptr,0,KTruncateToMaxLength,NULL);
<a name="l00335"></a>00335 }
<a name="l00336"></a>00336
<a name="l00341"></a>00341 TInt DDriver1Channel::SetConfig(<span class="keyword">const</span> TDesC8* aConfigBuf)
<a name="l00342"></a>00342 {
<a name="l00343"></a>00343 <span class="comment">// Don't allow configuration changes whilst we're busy</span>
<a name="l00344"></a>00344 <span class="keywordflow">if</span>(iSendDataStatus || iReceiveDataStatus)
<a name="l00345"></a>00345 <span class="keywordflow">return</span> KErrInUse;
<a name="l00346"></a>00346
<a name="l00347"></a>00347 <span class="comment">// Create a config structure.</span>
<a name="l00348"></a>00348 <a class="code" href="class_r_driver1_1_1_t_config.html">RDriver1::TConfig</a> config;
<a name="l00349"></a>00349 CurrentConfig(config);
<a name="l00350"></a>00350
<a name="l00351"></a>00351 <span class="comment">// Note: We have filled config with the current settings, this is to allow</span>
<a name="l00352"></a>00352 <span class="comment">// backwards compatibility when a client gives us an old (and shorter) version</span>
<a name="l00353"></a>00353 <span class="comment">// of the config structure.</span>
<a name="l00354"></a>00354
<a name="l00355"></a>00355 <span class="comment">// Read the config structure from client</span>
<a name="l00356"></a>00356 TPtr8 ptr((TUint8*)&config,<span class="keyword">sizeof</span>(config));
<a name="l00357"></a>00357 TInt r=Kern::ThreadDesRead(iClient,aConfigBuf,ptr,0);
<a name="l00358"></a>00358 <span class="keywordflow">if</span>(r!=KErrNone)
<a name="l00359"></a>00359 <span class="keywordflow">return</span> r;
<a name="l00360"></a>00360
<a name="l00361"></a>00361 <span class="comment">// Use config data to setup the driver. Checking that parameters which aren't settable</span>
<a name="l00362"></a>00362 <span class="comment">// either contain the correct values or are zero (meaning 'default')</span>
<a name="l00363"></a>00363 <span class="keywordflow">if</span>(config.iPddBufferSize && config.iPddBufferSize!=Pdd()->BufferSize())
<a name="l00364"></a>00364 <span class="keywordflow">return</span> KErrArgument;
<a name="l00365"></a>00365
<a name="l00366"></a>00366 <span class="keywordflow">if</span>(config.iMaxSendDataSize && config.iMaxSendDataSize!=iSendDataBuffer.MaxSize())
<a name="l00367"></a>00367 <span class="keywordflow">return</span> KErrArgument;
<a name="l00368"></a>00368
<a name="l00369"></a>00369 <span class="keywordflow">if</span>(config.iMaxReceiveDataSize && config.iMaxReceiveDataSize!=iReceiveDataBuffer.MaxSize())
<a name="l00370"></a>00370 <span class="keywordflow">return</span> KErrArgument;
<a name="l00371"></a>00371
<a name="l00372"></a>00372 r=Pdd()->SetSpeed(config.iSpeed);
<a name="l00373"></a>00373 <span class="keywordflow">if</span>(r!=KErrNone)
<a name="l00374"></a>00374 <span class="keywordflow">return</span> r;
<a name="l00375"></a>00375
<a name="l00376"></a>00376 <span class="keywordflow">return</span> r;
<a name="l00377"></a>00377 }
<a name="l00378"></a>00378
<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)
<a name="l00384"></a>00384 {
<a name="l00385"></a>00385 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#a1bbc5535ddf8863917bf9ca18a688d91">iSpeed</a> = Pdd()->Speed();
<a name="l00386"></a>00386 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#a8355e96a67e66e79903fe0a74f17b6d2">iPddBufferSize</a> = Pdd()->BufferSize();
<a name="l00387"></a>00387 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#a5d055bb015e0902481ced408c2c7892b">iMaxSendDataSize</a> = iSendDataBuffer.MaxSize();
<a name="l00388"></a>00388 aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#a3b6388ffc3c59b31e9f003ca2bf12812">iMaxReceiveDataSize</a> = iReceiveDataBuffer.MaxSize();
<a name="l00389"></a>00389 }
<a name="l00390"></a>00390
<a name="l00391"></a>00391 <span class="comment">//</span>
<a name="l00392"></a>00392 <span class="comment">// Methods for processing 'SendData'</span>
<a name="l00393"></a>00393 <span class="comment">//</span>
<a name="l00394"></a>00394
<a name="l00402"></a>00402 TInt DDriver1Channel::SendData(TRequestStatus* aStatus,<span class="keyword">const</span> TDesC8* aData)
<a name="l00403"></a>00403 {
<a name="l00404"></a>00404 <span class="comment">// Check that a 'SendData' isn't already in progress</span>
<a name="l00405"></a>00405 <span class="keywordflow">if</span>(iSendDataStatus)
<a name="l00406"></a>00406 {
<a name="l00407"></a>00407 Kern::ThreadKill(iClient,EExitPanic,ERequestAlreadyPending,KDriver1PanicCategory);
<a name="l00408"></a>00408 <span class="keywordflow">return</span> KErrInUse;
<a name="l00409"></a>00409 }
<a name="l00410"></a>00410
<a name="l00411"></a>00411 <span class="comment">// Read data from client into our buffer</span>
<a name="l00412"></a>00412 TInt r=Kern::ThreadDesRead(iClient,aData,iSendDataBuffer,0);
<a name="l00413"></a>00413 <span class="keywordflow">if</span>(r!=KErrNone)
<a name="l00414"></a>00414 <span class="keywordflow">return</span> r;
<a name="l00415"></a>00415
<a name="l00416"></a>00416 <span class="comment">// Give data to PDD so that it can do the work</span>
<a name="l00417"></a>00417 r=Pdd()->SendData(iSendDataBuffer);
<a name="l00418"></a>00418 <span class="keywordflow">if</span>(r!=KErrNone)
<a name="l00419"></a>00419 <span class="keywordflow">return</span> r;
<a name="l00420"></a>00420
<a name="l00421"></a>00421 <span class="comment">// Save the client request status and return</span>
<a name="l00422"></a>00422 iSendDataStatus = aStatus;
<a name="l00423"></a>00423 <span class="keywordflow">return</span> KErrNone;
<a name="l00424"></a>00424 }
<a name="l00425"></a>00425
<a name="l00429"></a>00429 <span class="keywordtype">void</span> DDriver1Channel::SendDataCancel()
<a name="l00430"></a>00430 {
<a name="l00431"></a>00431 <span class="keywordflow">if</span>(iSendDataStatus)
<a name="l00432"></a>00432 {
<a name="l00433"></a>00433 <span class="comment">// Tell PDD to stop processing the request</span>
<a name="l00434"></a>00434 Pdd()->SendDataCancel();
<a name="l00435"></a>00435 <span class="comment">// Cancel DFC</span>
<a name="l00436"></a>00436 iSendDataDfc.Cancel();
<a name="l00437"></a>00437 <span class="comment">// Complete client's request</span>
<a name="l00438"></a>00438 Kern::RequestComplete(iClient,iSendDataStatus,KErrCancel);
<a name="l00439"></a>00439 }
<a name="l00440"></a>00440 }
<a name="l00441"></a>00441
<a name="l00445"></a><a class="code" href="class_d_driver1_channel.html#a4ddf64ba96fa2febc011034d3fcb46c8">00445</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_channel.html#a4ddf64ba96fa2febc011034d3fcb46c8">DDriver1Channel::SendDataComplete</a>(TInt aResult)
<a name="l00446"></a>00446 {
<a name="l00447"></a>00447 <span class="comment">// Save result code</span>
<a name="l00448"></a>00448 iSendDataResult = aResult;
<a name="l00449"></a>00449 <span class="comment">// Queue DFC</span>
<a name="l00450"></a>00450 iSendDataDfc.Add();
<a name="l00451"></a>00451 }
<a name="l00452"></a>00452
<a name="l00457"></a>00457 <span class="keywordtype">void</span> DDriver1Channel::SendDataDfc(TAny* aPtr)
<a name="l00458"></a>00458 {
<a name="l00459"></a>00459 ((<a class="code" href="class_d_driver1_channel.html">DDriver1Channel</a>*)aPtr)->DoSendDataComplete();
<a name="l00460"></a>00460 }
<a name="l00461"></a>00461
<a name="l00465"></a>00465 <span class="keywordtype">void</span> DDriver1Channel::DoSendDataComplete()
<a name="l00466"></a>00466 {
<a name="l00467"></a>00467 TInt result = iSendDataResult;
<a name="l00468"></a>00468 <span class="comment">// Complete clients request</span>
<a name="l00469"></a>00469 Kern::RequestComplete(iClient,iSendDataStatus,result);
<a name="l00470"></a>00470 }
<a name="l00471"></a>00471
<a name="l00472"></a>00472 <span class="comment">//</span>
<a name="l00473"></a>00473 <span class="comment">// Methods for processing 'ReceiveData'</span>
<a name="l00474"></a>00474 <span class="comment">//</span>
<a name="l00475"></a>00475
<a name="l00482"></a>00482 TInt DDriver1Channel::ReceiveData(TRequestStatus* aStatus,TDes8* aPtr)
<a name="l00483"></a>00483 {
<a name="l00484"></a>00484 <span class="comment">// Check that a 'ReceiveData' isn't already in progress</span>
<a name="l00485"></a>00485 <span class="keywordflow">if</span>(iReceiveDataStatus)
<a name="l00486"></a>00486 {
<a name="l00487"></a>00487 Kern::ThreadKill(iClient,EExitPanic,ERequestAlreadyPending,KDriver1PanicCategory);
<a name="l00488"></a>00488 <span class="keywordflow">return</span> KErrInUse;
<a name="l00489"></a>00489 }
<a name="l00490"></a>00490
<a name="l00491"></a>00491 <span class="comment">// Ask PDD for data</span>
<a name="l00492"></a>00492 TInt r=Pdd()->ReceiveData(iReceiveDataBuffer);
<a name="l00493"></a>00493 <span class="keywordflow">if</span>(r!=KErrNone)
<a name="l00494"></a>00494 <span class="keywordflow">return</span> r;
<a name="l00495"></a>00495
<a name="l00496"></a>00496 <span class="comment">// Save the client request status and descriptor before returning</span>
<a name="l00497"></a>00497 iReceiveDataStatus = aStatus;
<a name="l00498"></a>00498 iReceiveDataDescriptor = aPtr;
<a name="l00499"></a>00499 <span class="keywordflow">return</span> KErrNone;
<a name="l00500"></a>00500 }
<a name="l00501"></a>00501
<a name="l00505"></a>00505 <span class="keywordtype">void</span> DDriver1Channel::ReceiveDataCancel()
<a name="l00506"></a>00506 {
<a name="l00507"></a>00507 <span class="keywordflow">if</span>(iReceiveDataStatus)
<a name="l00508"></a>00508 {
<a name="l00509"></a>00509 <span class="comment">// Tell PDD to stop processing the request</span>
<a name="l00510"></a>00510 Pdd()->ReceiveDataCancel();
<a name="l00511"></a>00511 <span class="comment">// Cancel DFC</span>
<a name="l00512"></a>00512 iReceiveDataDfc.Cancel();
<a name="l00513"></a>00513 <span class="comment">// Finished with client descriptor, so NULL it to help detect coding errors</span>
<a name="l00514"></a>00514 iReceiveDataDescriptor = NULL;
<a name="l00515"></a>00515 <span class="comment">// Complete clients request</span>
<a name="l00516"></a>00516 Kern::RequestComplete(iClient,iReceiveDataStatus,KErrCancel);
<a name="l00517"></a>00517 }
<a name="l00518"></a>00518 }
<a name="l00519"></a>00519
<a name="l00523"></a><a class="code" href="class_d_driver1_channel.html#ac5102a3cbbcb3fe11357481d8d204523">00523</a> <span class="keywordtype">void</span> <a class="code" href="class_d_driver1_channel.html#ac5102a3cbbcb3fe11357481d8d204523">DDriver1Channel::ReceiveDataComplete</a>(TInt aResult)
<a name="l00524"></a>00524 {
<a name="l00525"></a>00525 <span class="comment">// Save result code</span>
<a name="l00526"></a>00526 iReceiveDataResult = aResult;
<a name="l00527"></a>00527 <span class="comment">// Queue DFC</span>
<a name="l00528"></a>00528 iReceiveDataDfc.Add();
<a name="l00529"></a>00529 }
<a name="l00530"></a>00530
<a name="l00535"></a>00535 <span class="keywordtype">void</span> DDriver1Channel::ReceiveDataDfc(TAny* aPtr)
<a name="l00536"></a>00536 {
<a name="l00537"></a>00537 ((<a class="code" href="class_d_driver1_channel.html">DDriver1Channel</a>*)aPtr)->DoReceiveDataComplete();
<a name="l00538"></a>00538 }
<a name="l00539"></a>00539
<a name="l00543"></a>00543 <span class="keywordtype">void</span> DDriver1Channel::DoReceiveDataComplete()
<a name="l00544"></a>00544 {
<a name="l00545"></a>00545 <span class="comment">// Write data to client from our buffer</span>
<a name="l00546"></a>00546 TInt result=Kern::ThreadDesWrite(iClient,iReceiveDataDescriptor,iReceiveDataBuffer,0);
<a name="l00547"></a>00547
<a name="l00548"></a>00548 <span class="comment">// Finished with client descriptor, so NULL it to help detect coding errors</span>
<a name="l00549"></a>00549 iReceiveDataDescriptor = NULL;
<a name="l00550"></a>00550
<a name="l00551"></a>00551 <span class="comment">// Use result code from PDD if it was an error</span>
<a name="l00552"></a>00552 <span class="keywordflow">if</span>(iReceiveDataResult!=KErrNone)
<a name="l00553"></a>00553 result = iReceiveDataResult;
<a name="l00554"></a>00554
<a name="l00555"></a>00555 <span class="comment">// Complete client's request</span>
<a name="l00556"></a>00556 Kern::RequestComplete(iClient,iReceiveDataStatus,result);
<a name="l00557"></a>00557 }
<a name="l00558"></a>00558
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
</body>
</html>