00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <t-client.h>
00018 #include "clientserver.h"
00019
00020 static TInt StartServer()
00021
00022
00023
00024
00025
00026 {
00027 const TUidType serverUid(KNullUid,KNullUid,KServerUid3);
00028 RProcess server;
00029 TInt r=server.Create(KMyServerImg,KNullDesC,serverUid);
00030 if (r!=KErrNone)
00031 return r;
00032 TRequestStatus stat;
00033 server.Rendezvous(stat);
00034 if (stat!=KRequestPending)
00035 server.Kill(0);
00036 else
00037 server.Resume();
00038 User::WaitForRequest(stat);
00039
00040
00041
00042 r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
00043 server.Close();
00044 return r;
00045 }
00046
00047 EXPORT_C TInt RMySession::Connect()
00048
00049
00050
00051 {
00052 TInt retry=2;
00053 for (;;)
00054 {
00055 TInt r=CreateSession(KMyServerName,TVersion(0,0,0),1);
00056 if (r!=KErrNotFound && r!=KErrServerTerminated)
00057 return r;
00058 if (--retry==0)
00059 return r;
00060 r=StartServer();
00061 if (r!=KErrNone && r!=KErrAlreadyExists)
00062 return r;
00063 }
00064 }
00065
00066 EXPORT_C TInt RMySession::Send(const TDesC& aMessage)
00067 {
00068 if (aMessage.Length()>KMaxMyMessage)
00069 return KErrArgument;
00070 return SendReceive(ESend,TIpcArgs(&aMessage));
00071 }
00072
00073 EXPORT_C void RMySession::Receive(TRequestStatus& aStatus,TDes& aMessage)
00074 {
00075 SendReceive(EReceive,TIpcArgs(&aMessage,aMessage.MaxLength()),aStatus);
00076 }
00077
00078 EXPORT_C void RMySession::CancelReceive()
00079 {
00080 SendReceive(ECancelReceive);
00081 }