diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/threadserver_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/threadserver_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,182 @@ + +
+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 "threadserver.h" +00017 #include "threadserverstart.h" +00018 #include "threadserversession.h" +00019 +00020 const TInt KThreadServerShutDownDelay = 50000000; //50 sec +00021 +00022 +00023 //******CThreadServer******// +00027 void CThreadServer::NewLC() +00028 { +00029 CThreadServer* s = new(ELeave) CThreadServer(); +00030 CleanupStack::PushL(s); +00031 s->ConstructL(); +00032 } +00036 CThreadServer::CThreadServer() +00037 :CServer2(EPriorityStandard, ESharableSessions),iDriverState(EStateUnknown) +00038 { +00039 } +00040 void CThreadServer::ConstructL() +00041 { +00042 // Call CServer2::StartL() before any other functions inside ConstructL +00043 // to avoid errors other than KErrAlreadyExists when the duplicate Server starts +00044 StartL(KThreadServerName); +00045 iDelayThreadServerShutDown = CDelayServerShutDown::NewL(); +00046 } +00050 CThreadServer::~CThreadServer() +00051 { +00052 if (iDelayThreadServerShutDown) +00053 { +00054 iDelayThreadServerShutDown->Cancel(); +00055 delete iDelayThreadServerShutDown; +00056 } +00057 // unload device driver when server terminated +00058 UnloadDevice(); +00059 } +00066 CSession2* CThreadServer::NewSessionL(const TVersion& aVersion,const RMessage2& /*aMessage*/) const +00067 { +00068 //check whether version is compatible +00069 TVersion v(KThreadServerVersion,KThreadServerMinorVersionNumber,KThreadServerBuildVersionNumber); +00070 if(!User::QueryVersionSupported(v, aVersion)) +00071 User::Leave(KErrNotSupported); +00072 +00073 // construct and return the server side client session object +00074 CThreadServer& ncThis = const_cast<CThreadServer&>(*this); +00075 CThreadServerSession* serverSession = CThreadServerSession::NewL(ncThis); +00076 return serverSession; +00077 } +00081 void CThreadServer::IncrementRefCount() +00082 { +00083 iRefCount++; +00084 iDelayThreadServerShutDown->Cancel(); // Cancel shutdown if it has started due to no clients being connected. +00085 } +00089 void CThreadServer::DecrementRefCount() +00090 { +00091 iRefCount--; +00092 if ( iRefCount == 0 ) +00093 { +00094 iDelayThreadServerShutDown->SetDelay(TTimeIntervalMicroSeconds32(KThreadServerShutDownDelay)); +00095 } +00096 } +00100 void CThreadServer::RenameServer() +00101 { +00102 //Rename thread server name in order to prevent same name creation +00103 RThread serverThread; +00104 TThreadId threadId; +00105 TName name; +00106 name.Append(KThreadServerName); +00107 threadId = serverThread.Id(); +00108 name.AppendNum(threadId.Id(),EHex); +00109 //We are ignoring the error code returned from User::RenameThread +00110 //as it is not important here, it may be used for profiling +00111 User::RenameThread(name); +00112 } +00117 TInt CThreadServer::LoadDevice() +00118 { +00119 if (iDriverState>=EDriverLoaded && iDriverState<EDriverUnloaded) +00120 return KErrNone; //Device has been loaded, return immediately +00121 +00122 TInt r=User::LoadPhysicalDevice(KThreadServerDriverPddFileName); +00123 if (r!=KErrNone && r!=KErrAlreadyExists) +00124 return r; //some error occurred +00125 +00126 r = User::LoadLogicalDevice(KThreadServerDriverLddFileName); +00127 if (r!=KErrNone && r!=KErrAlreadyExists) +00128 return r; //some error occurred +00129 +00130 //both PDD and LDD have been loaded +00131 UpdateDriverState(EDriverLoaded); +00132 return KErrNone; +00133 } +00138 TInt CThreadServer::UnloadDevice() +00139 { +00140 if (iDriverState==EDriverUnloaded || iDriverState == EStateUnknown) +00141 return KErrNone; //no device is loaded, return immediately +00142 +00143 // close device +00144 if (iDriver.Handle()) +00145 iDriver.Close(); +00146 // Unload Logical Device +00147 TInt r = User::FreeLogicalDevice(RDriver1::Name()); +00148 if (r!=KErrNone) +00149 return r; +00150 // Unload Physical Device +00151 TName pddName(RDriver1::Name()); +00152 _LIT(KVariantExtension,".template"); +00153 pddName.Append(KVariantExtension); +00154 r=User::FreePhysicalDevice(pddName); +00155 +00156 if (KErrNone==r) +00157 UpdateDriverState(EDriverUnloaded); +00158 return r; +00159 } +00164 TInt CThreadServer::OpenLogicalChannel() +00165 { +00166 if (iDriverState>=ELogicalChannelOpened && iDriverState<ELogicalChannelClosed) +00167 return KErrNone; +00168 +00169 TInt r = iDriver.Open(); +00170 if (KErrNone==r) +00171 UpdateDriverState(ELogicalChannelOpened); +00172 +00173 return r; +00174 } +00178 void CThreadServer::CloseLogicalChannel() +00179 { +00180 if (iDriver.Handle()) +00181 { +00182 iDriver.Close(); +00183 UpdateDriverState(ELogicalChannelClosed); +00184 } +00185 } +00192 TInt CThreadServer::SendDataToDevice(TRequestStatus& aStatus, const TDesC8& aData) +00193 { +00194 TInt r = KErrNone; +00195 if (iDriverState>=ELogicalChannelOpened && iDriverState<ELogicalChannelClosed) +00196 { +00197 iDriver.SendData(aStatus, aData); +00198 UpdateDriverState(ESendingData); +00199 } +00200 else +00201 { +00202 r = KErrArgument; +00203 } +00204 return r; +00205 } +00209 void CThreadServer::CancelSendData() +00210 { +00211 iDriver.SendDataCancel(); +00212 UpdateDriverState(ELogicalChannelOpened); +00213 } +00218 void CThreadServer::UpdateDriverState(TDriverState aState) +00219 { +00220 iDriverState = aState; +00221 } +00222 //EOF +