Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/driver1__ldd_8cpp_source.html
author Dominic Pinkman <dominic.pinkman@nokia.com>
Fri, 13 Aug 2010 16:47:46 +0100
changeset 14 578be2adaf3e
parent 6 43e37759235e
permissions -rw-r--r--
Week 32 contribution of PDK documentation content. See release notes for details. Fixes bug Bug 3582

<!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 &quot;Eclipse Public License v1.0&quot;</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 &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.</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 &lt;kern_priv.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &quot;<a class="code" href="driver1_8h.html">driver1.h</a>&quot;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;<a class="code" href="driver1__dev_8h.html">driver1_dev.h</a>&quot;</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">&quot;Driver1&quot;</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(&amp;<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&amp; 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*)&amp;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*&amp; 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 &#39;1&#39;</span>
<a name="l00107"></a>00107                 iReceiveDataDfc(ReceiveDataDfc, this, 1)   <span class="comment">// DFC is priority &#39;1&#39;</span>
<a name="l00108"></a>00108         {
<a name="l00109"></a>00109         <span class="comment">// Get pointer to client thread&#39;s DThread object</span>
<a name="l00110"></a>00110         iClient=&amp;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&#39;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&#39;t fail since it&#39;s the thread we are currently running in.</span>
<a name="l00115"></a>00115         iClient-&gt;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&amp; 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. &quot;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&#39;t have the capability you can&#39;t do anything&quot;</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&#39;t be used because the &#39;current thread&#39; isn&#39;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">&quot;Checked by DRIVER1&quot;</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()-&gt;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*&amp;)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&amp; 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>&lt;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&amp;(1&lt;&lt;RDriver1::ESendData))
<a name="l00313"></a>00313                 SendDataCancel();
<a name="l00314"></a>00314         <span class="keywordflow">if</span>(aMask&amp;(1&lt;&lt;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*)&amp;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&#39;t allow configuration changes whilst we&#39;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*)&amp;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&#39;t settable</span>
<a name="l00362"></a>00362         <span class="comment">// either contain the correct values or are zero (meaning &#39;default&#39;)</span>
<a name="l00363"></a>00363         <span class="keywordflow">if</span>(config.iPddBufferSize &amp;&amp; config.iPddBufferSize!=Pdd()-&gt;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 &amp;&amp; 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 &amp;&amp; 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()-&gt;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>&amp; 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()-&gt;Speed();
<a name="l00386"></a>00386         aConfig.<a class="code" href="class_r_driver1_1_1_t_config.html#a8355e96a67e66e79903fe0a74f17b6d2">iPddBufferSize</a> = Pdd()-&gt;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 &#39;SendData&#39;</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 &#39;SendData&#39; isn&#39;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()-&gt;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()-&gt;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&#39;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)-&gt;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 &#39;ReceiveData&#39;</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 &#39;ReceiveData&#39; isn&#39;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()-&gt;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()-&gt;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)-&gt;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&#39;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&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
</body>
</html>