00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "threadclient.h"
00017 #include "threadserver.h"
00018 #include "threadclientserver.h"
00019 #include<e32debug.h>
00020
00021 #define KMaxServerNameLength 256
00022
00023 static const TUid KUidThreadServer = {0x10283039};
00024 const TInt KCreateSessionRetryCount = 2;
00025 const TInt KServerDefaultMessageSlots = 2;
00026
00033 static TInt StartServer()
00034 {
00035 const TUidType serverUid(KNullUid,KNullUid,KUidThreadServer);
00036 TThreadFunction serverFunc = CThreadServer::StartThread;
00037 RThread server;
00038
00039
00040 TInt r = server.Create(_L(""), serverFunc, KThreadServerStackSize,
00041 #ifdef SYMBIAN_USE_SEPARATE_HEAPS
00042 KThreadServerInitHeapSize, KThreadServerMaxHeapSize,
00043 #else
00044 &User::Heap(),
00045 #endif
00046 NULL,EOwnerProcess);
00047
00048 if (r!=KErrNone)
00049 return r;
00050 TRequestStatus stat;
00051 server.Rendezvous(stat);
00052
00053 if (stat!=KRequestPending)
00054 server.Kill(KErrCouldNotConnect);
00055 else
00056 server.Resume();
00057
00058 User::WaitForRequest(stat);
00059
00060
00061 r=(server.ExitType()==EExitPanic) ? KErrServerTerminated : stat.Int();
00062 server.Close();
00063 return r;
00064 }
00068 EXPORT_C TInt RThreadClient::Connect()
00069 {
00070 TInt retry=KCreateSessionRetryCount;
00071 FOREVER
00072 {
00073
00074 TInt r=CreateSession(KThreadServerName,
00075 TVersion(KThreadServerVersion,
00076 KThreadServerMinorVersionNumber,
00077 KThreadServerBuildVersionNumber),
00078 KServerDefaultMessageSlots);
00079 if (r!=KErrNotFound && r!=KErrServerTerminated)
00080 return r;
00081 if (--retry==0)
00082 return r;
00083 r=StartServer();
00084 if (r!=KErrNone && r!=KErrAlreadyExists)
00085 return r;
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 }
00101 }
00106 EXPORT_C TInt RThreadClient::OpenDriver()
00107 {
00108 return SendReceive(EThreadServerOpenDriver);
00109 }
00115 EXPORT_C void RThreadClient::Send(const TDesC8& aBuf, TRequestStatus& aStatus)
00116 {
00117 SendReceive(EThreadServerSendData, TIpcArgs(&aBuf), aStatus);
00118 }
00122 EXPORT_C void RThreadClient::SendCancel()
00123 {
00124 SendReceive(EThreadServerSendDataCancel);
00125 }
00130 EXPORT_C TInt RThreadClient::UnloadDeviceDriver()
00131 {
00132 return SendReceive(EThreadServerUnloadDeviceDriver);
00133 }
00138 EXPORT_C TInt RThreadClient::LoadDeviceDriver()
00139 {
00140 return SendReceive(EThreadServerLoadDeviceDriver);
00141 }
00142
00143