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

examples/Base/IPC/AdvancedClientServerExample/ProcessServer/src/processserver.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 "processserver.h"
+00017 #include "processserverstart.h"
+00018 #include "processserversession.h"
+00019 #include<e32debug.h>
+00020 
+00021 const TInt KProcessServerShutDownDelay = 50000000; //50 sec
+00022 
+00023 //******CProcessServer******//
+00024 void CProcessServer::NewLC()
+00025         {
+00026         CProcessServer* s = new(ELeave) CProcessServer();
+00027         CleanupStack::PushL(s);
+00028         s->ConstructL();
+00029         }
+00033 CProcessServer::CProcessServer()
+00034         :CServer2(EPriorityStandard, ESharableSessions),iDriverState(EStateUnknown)
+00035         {
+00036         }
+00040 void CProcessServer::ConstructL()
+00041         {
+00042         // Call CServer2::StartL() before any other functions inside ConstructL()
+00043         // to avoid an error other than KErrAlreadyExists when the duplicate server starts
+00044         StartL(KProcessServerName);
+00045         iDelayProcessServerShutDown = CDelayServerShutDown::NewL();
+00046         }
+00050 CProcessServer::~CProcessServer()
+00051         {
+00052         if (iDelayProcessServerShutDown)
+00053                 {
+00054                 iDelayProcessServerShutDown->Cancel();
+00055                 delete iDelayProcessServerShutDown;
+00056                 }
+00057                 
+00058         // unload device driver when server terminated
+00059         UnloadDevice();
+00060         }
+00067 CSession2* CProcessServer::NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const
+00068         {
+00069         //check whether version is compatible
+00070         TVersion v(KProcessServerVersion,KProcessServerMinorVersionNumber,KProcessServerBuildVersionNumber);
+00071         if(!User::QueryVersionSupported(v, aVersion))
+00072                 User::Leave(KErrNotSupported);
+00073         
+00074         // check client process has the required capability
+00075         if(!aMessage.HasCapability(ECapabilityMultimediaDD))
+00076                 User::Leave(KErrPermissionDenied);              
+00077 
+00078         // construct and return the server side client session object
+00079         CProcessServer& ncThis = const_cast<CProcessServer&>(*this);
+00080         CProcessServerSession* serverSession = CProcessServerSession::NewL(ncThis);
+00081         return serverSession;
+00082         }
+00086 void CProcessServer::IncrementRefCount()
+00087         {
+00088         iRefCount++;
+00089         iDelayProcessServerShutDown->Cancel(); // Cancel shutdown if it has started due to no clients being connected 
+00090         }
+00091         
+00095 void CProcessServer::DecrementRefCount() 
+00096         {
+00097         iRefCount--;
+00098         if ( iRefCount == 0 )
+00099                 {
+00100                 iDelayProcessServerShutDown->SetDelay(TTimeIntervalMicroSeconds32(KProcessServerShutDownDelay));
+00101                 }
+00102         }
+00107 TInt CProcessServer::LoadDevice()
+00108         {
+00109         if (iDriverState>=EDriverLoaded && iDriverState<EDriverUnloaded)
+00110                 return KErrNone; //Device has been loaded, return immediately
+00111                 
+00112         TInt r=User::LoadPhysicalDevice(KDriver1PddFileName);
+00113         if (r!=KErrNone && r!=KErrAlreadyExists)
+00114                 {
+00115                 return r; //some error occurred
+00116                 }
+00117 
+00118         r = User::LoadLogicalDevice(KDriver1LddFileName);
+00119         if (r!=KErrNone && r!=KErrAlreadyExists)
+00120                 {
+00121                 return r; //some error occurred 
+00122                 }
+00123 
+00124         //both PDD and LDD have been loaded
+00125         UpdateDriverState(EDriverLoaded);
+00126         return KErrNone; 
+00127         }
+00132 TInt CProcessServer::UnloadDevice()
+00133         {
+00134         if (iDriverState==EDriverUnloaded || iDriverState == EStateUnknown)
+00135                 return KErrNone; //no device is loaded, return immediately
+00136                 
+00137         // close device
+00138         if (iDriver.Handle())
+00139                 iDriver.Close();
+00140         // Unload Logical Device
+00141         TInt r = User::FreeLogicalDevice(RDriver1::Name());
+00142         if (r!=KErrNone)
+00143                 return r;
+00144         // Unload Physical Device
+00145         TName pddName(RDriver1::Name());
+00146         _LIT(KVariantExtension,".template");
+00147         pddName.Append(KVariantExtension);
+00148         r=User::FreePhysicalDevice(pddName);
+00149         
+00150         if (KErrNone==r)
+00151                 UpdateDriverState(EDriverUnloaded);     
+00152         return r;
+00153         }
+00158 TInt CProcessServer::OpenLogicalChannel()
+00159         {
+00160         if (iDriverState>=ELogicalChannelOpened && iDriverState<ELogicalChannelClosed)
+00161                 return KErrNone;
+00162         
+00163         TInt r = iDriver.Open();
+00164         if (KErrNone==r)
+00165                 UpdateDriverState(ELogicalChannelOpened);
+00166         
+00167         return r;
+00168         }
+00172 void CProcessServer::CloseLogicalChannel()
+00173         {
+00174         if (iDriver.Handle())
+00175                 {
+00176                 iDriver.Close();
+00177                 UpdateDriverState(ELogicalChannelClosed);
+00178                 }
+00179         }
+00186 TInt CProcessServer::SendDataToDevice(TRequestStatus& aStatus, const TDesC8& aData)
+00187         {
+00188         TInt r = KErrNone;
+00189         if (iDriverState>=ELogicalChannelOpened && iDriverState<ELogicalChannelClosed)
+00190                 {
+00191                 iDriver.SendData(aStatus, aData);
+00192                 UpdateDriverState(ESendingData);
+00193                 }
+00194         else
+00195                 {
+00196                 r = KErrArgument;
+00197                 }
+00198         return r;
+00199         }
+00203 void CProcessServer::CancelSendData()
+00204         {
+00205         iDriver.SendDataCancel();
+00206         UpdateDriverState(ELogicalChannelOpened);
+00207         }
+00212 void CProcessServer::UpdateDriverState(TDriverState aState)
+00213         {
+00214         iDriverState = aState;
+00215         }
+00216 
+00217 //EOF
+

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