00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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};
00024 const TInt KCreateSessionRetryCount = 2;
00025 const TInt KServerDefaultMessageSlots = 2;
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);
00046 else
00047 server.Resume();
00048
00049 User::WaitForRequest(stat);
00050
00051
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;
00070 FOREVER
00071 {
00072
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
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
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