diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/threadserversession_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/threadserversession_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ - -
-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 -