diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/threadserversession_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/threadserversession_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,194 @@ + + +TB10.1 Example Applications: examples/Base/IPC/AdvancedClientServerExample/ThreadServer/src/threadserversession.cpp Source File + + + + +

examples/Base/IPC/AdvancedClientServerExample/ThreadServer/src/threadserversession.cpp

00001 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+00002 // All rights reserved.
+00003 // This component and the accompanying materials are made available
+00004 // under the terms of "Eclipse Public License v1.0"
+00005 // which accompanies this distribution, and is available
+00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
+00007 //
+00008 // Initial Contributors:
+00009 // Nokia Corporation - initial contribution.
+00010 //
+00011 // Contributors:
+00012 //
+00013 // Description:
+00014 //
+00015 
+00016 #include "threadserversession.h"
+00017 
+00018 
+00019 /*****************CThreadServerSession**********************/
+00023 CThreadServerSession* CThreadServerSession::NewL(CThreadServer& aServer)
+00024         {
+00025         CThreadServerSession* s = new(ELeave) CThreadServerSession(aServer);
+00026         CleanupStack::PushL(s);
+00027         s->ConstructL();
+00028         CleanupStack::Pop();
+00029         return s;       
+00030         }
+00034 CThreadServerSession::CThreadServerSession(CThreadServer& aServer)
+00035 :iServer(aServer)
+00036         {
+00037         }
+00038 void CThreadServerSession::ConstructL()
+00039         {
+00040         }
+00044 CThreadServerSession::~CThreadServerSession()
+00045         {
+00046         delete iAsyncRequestHandler;            
+00047         iServer.CloseLogicalChannel();
+00048         iServer.DecrementRefCount();
+00049         }
+00054 void CThreadServerSession::CreateL()
+00055 //
+00056 // 2nd phase construct for sessions - called by the CServer framework
+00057 //
+00058         {
+00059         iServer.IncrementRefCount();            
+00060         //load dummy ldd
+00061         User::LeaveIfError(iServer.LoadDevice());
+00062         iAsyncRequestHandler = CAsyncHandler::NewL(iServer);    
+00063         }
+00067 void CThreadServerSession::ServiceL(const RMessage2& aMessage)
+00068         {
+00069         TInt r = KErrNone;
+00070         switch(aMessage.Function())
+00071                 {                               
+00072                 case EThreadServerLoadDeviceDriver:
+00073                         aMessage.Complete(iServer.LoadDevice());
+00074                         break;
+00075                 
+00076                 case EThreadServerOpenDriver:
+00077                         aMessage.Complete(iServer.OpenLogicalChannel());
+00078                         break;
+00079                         
+00080                 case EThreadServerSendData: //async
+00081                         r = iAsyncRequestHandler->ProcessRequest(aMessage);
+00082                         if (r!=KErrNone)
+00083                                 aMessage.Complete(r);
+00084                         break;
+00085                         
+00086                 case EThreadServerSendDataCancel: //cancel async
+00087                         iAsyncRequestHandler->Cancel(); 
+00088                         aMessage.Complete(KErrNone); 
+00089                         break;
+00090                         
+00091                 case EThreadServerUnloadDeviceDriver:
+00092                         aMessage.Complete(iServer.UnloadDevice());
+00093                         break;
+00094                         
+00095                 default:
+00096                         User::Leave(KErrNotSupported);
+00097                         break;
+00098                 }
+00099 
+00100         }
+00101 /*****************CAsyncHandler**********************/
+00105 CThreadServerSession::CAsyncHandler* CThreadServerSession::CAsyncHandler::NewL(CThreadServer& aServer)
+00106         {
+00107         CAsyncHandler* self = new(ELeave) CAsyncHandler(aServer);
+00108         CleanupStack::PushL(self);
+00109         self ->ConstructL();
+00110         CleanupStack::Pop();
+00111         return self;
+00112         }
+00116 CThreadServerSession::CAsyncHandler::~CAsyncHandler()
+00117         {
+00118         Cancel();
+00119         iMessageArray.Close();
+00120         }
+00124 void CThreadServerSession::CAsyncHandler::RunL()
+00125         {
+00126         // complete the request
+00127         Complete(iStatus.Int());
+00128         
+00129         //continue to execute next request if there is any
+00130         ExecuteFirstRequestInArray();
+00131         }
+00135 void CThreadServerSession::CAsyncHandler::DoCancel()
+00136         {
+00137         iServer.CancelSendData();
+00138         // complete the request
+00139         Complete(iStatus.Int());
+00140         }
+00144 CThreadServerSession::CAsyncHandler::CAsyncHandler(CThreadServer& aServer)
+00145         :CActive(EPriorityStandard), iServer(aServer)
+00146         {
+00147         CActiveScheduler::Add(this);
+00148         }
+00149 
+00150 void CThreadServerSession::CAsyncHandler::ConstructL()
+00151         {
+00152         }
+00158 TInt CThreadServerSession::CAsyncHandler::ProcessRequest(const RMessage2& aMessage)
+00159         {
+00160         TInt ret;
+00161         //store message
+00162         TMessage newMessage;
+00163         newMessage.Message() = aMessage;
+00164         ret= iMessageArray.Append(newMessage);
+00165         if (ret != KErrNone)
+00166                 return ret;
+00167         
+00168         // only kick off the first request in the array when there is only one in the array
+00169         if (iMessageArray.Count() == 1) 
+00170                 ret = ExecuteFirstRequestInArray();
+00171 
+00172         return ret;
+00173         }
+00178 TInt CThreadServerSession::CAsyncHandler::ExecuteFirstRequestInArray()
+00179         {
+00180         TInt r = KErrNone;
+00181         if (iMessageArray.Count() != 0)
+00182                 {
+00183                 const RMessage2& message = iMessageArray[0].Message();
+00184                 switch (message.Function())
+00185                         {
+00186                         case EThreadServerSendData:
+00187                                 {
+00188                                 TBuf8<KThreadServerMaxMessageLen> sendObject;
+00189                                 r= message.Read(0, sendObject);
+00190                                 if (r == KErrNone)
+00191                                         {
+00192                                         r = iServer.SendDataToDevice(iStatus, sendObject);
+00193                                         if (r==KErrNone)
+00194                                                 SetActive();
+00195                                         }
+00196                                 }
+00197                                 break;
+00198                                 
+00199                         default:
+00200                                 break;
+00201                         }
+00202                 }
+00203         return r; 
+00204         }
+00208 void CThreadServerSession::CAsyncHandler::Complete(TInt aResult)
+00209         {
+00210         iMessageArray[0].Message().Complete(aResult);
+00211         iMessageArray.Remove(0);
+00212         iServer.UpdateDriverState(CThreadServer::ELogicalChannelOpened);
+00213         }
+00214 
+00215 /***************TMessage****************/
+00219 const RMessage2& CThreadServerSession::CAsyncHandler::TMessage::Message() const
+00220         {
+00221         return iMessage;
+00222         }
+00223 RMessage2& CThreadServerSession::CAsyncHandler::TMessage::Message()
+00224         {
+00225         return iMessage; 
+00226         }
+00227 
+00228 //EOF
+

Generated on Thu Jan 21 10:32:56 2010 for TB10.1 Example Applications by  + +doxygen 1.5.3
+ +