examples/Base/IPC/AdvancedClientServerExample/ProcessClient/src/processclient.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 
00017 #include "processclient.h"
00018 #include "processclientserver.h"
00019 #include<e32debug.h>
00020 
00021 #define KMaxServerNameLength 256
00022 
00023 static const TUid KUidProcessServer = {0x10283037}; // Process Server UID
00024 const TInt KCreateSessionRetryCount = 2;                                        //CreateSession retry count
00025 const TInt KServerDefaultMessageSlots = 2;                      //server async Message Slots
00026 
00033 static TInt StartServer()
00034         {
00035         const TUidType serverUid(KNullUid,KNullUid,KUidProcessServer);
00036 
00037         RProcess server;
00038         TInt r=server.Create(KProcessServerServerImg,KNullDesC,serverUid);
00039         if (r!=KErrNone)
00040                 return r;
00041         TRequestStatus stat;
00042         server.Rendezvous(stat);
00043 
00044         if (stat!=KRequestPending)
00045                 server.Kill(KErrCouldNotConnect);               // abort startup
00046         else
00047                 server.Resume();        // logon OK - start the server
00048         
00049         User::WaitForRequest(stat);             // wait for start or death
00050         // The server exit type may be a panic value and a panic value can be zero, which is the same 
00051         // value as KErrNone. So, the exit type is tested for a panic before being returned.
00052         if (server.ExitType()==EExitPanic)
00053                 {
00054                 r = KErrServerTerminated;
00055                 }
00056         else
00057                 {
00058                 r = stat.Int();
00059                 }
00060         server.Close();
00061         return r;
00062         }
00067 EXPORT_C TInt RProcessClient::Connect()
00068         {
00069         TInt retry=KCreateSessionRetryCount; //number of CreateSession retries
00070         FOREVER
00071                 {
00072                 // try to create a session with the server which has KServerDefaultMessageSlots async message slots.
00073                 TInt r=CreateSession(KProcessServerName,
00074                                                          TVersion(KProcessServerVersion,
00075                                                                           KProcessServerMinorVersionNumber,
00076                                                                           KProcessServerBuildVersionNumber),
00077                                                          KServerDefaultMessageSlots);                                                    
00078                 if (r!=KErrNotFound && r!=KErrServerTerminated)
00079                         return r;
00080                 if (--retry==0)
00081                         return r;
00082                 r=StartServer();        
00083                 if (r!=KErrNone && r!=KErrAlreadyExists)
00084                         return r;
00085                 // 1. r=KErrNone means server starts up successfully.
00086                 // 2. r=KErrAlreadyExists means a duplicate server was trying to start up.
00087                 //              Note: if there are other functions called before CServer2::StartL() during construction,
00088                 //                other errors might happen when the duplicate server is trying to start.
00089                 //            Therefore, we recommend CServer2::StartL() is the first function in server construction
00090                 //            @see CProcessServer::ConstructL()
00091                 //
00092                 // NOTE: If users would like to retry start up server after other scenarios happened, e.g. panic,then go 
00093                 //               through the following steps:
00094                 //                1. Increase the value of KCreateSessionRetryCount (only start up server once in this example)
00095                 //                2. Need another variable, e.g. TExitType, together with error code returned in StartServer()
00096                 //                      to distinguish these scenarios
00097                 //                3. Modify the third if statement to stop exit when the required scenarios happens.
00098                 //           
00099                 }
00100         }
00105 EXPORT_C TInt RProcessClient::OpenDriver()
00106         {
00107         return SendReceive(EOpenDriver);
00108         }
00114 EXPORT_C void RProcessClient::Send(const TDesC8& aBuf, TRequestStatus& aStatus)
00115         {
00116         SendReceive(EDummyLDDSendData, TIpcArgs(&aBuf), aStatus);
00117         }
00121 EXPORT_C void RProcessClient::SendCancel()
00122         {
00123         SendReceive(EDummyLDDSendDataCancel);
00124         }
00129 EXPORT_C TInt RProcessClient::UnloadDeviceDriver()
00130         {
00131         return SendReceive(EUnloadDeviceDriver);
00132         }
00137 EXPORT_C TInt RProcessClient::LoadDeviceDriver()
00138         {
00139         return SendReceive(ELoadDeviceDriver);
00140         }
00141 
00142 //EOF

Generated by  doxygen 1.6.2