--- a/textinput/peninputarc/src/peninputclient/penclientimpl.cpp Tue Feb 02 01:02:04 2010 +0200
+++ b/textinput/peninputarc/src/peninputclient/penclientimpl.cpp Fri Apr 16 15:17:40 2010 +0300
@@ -114,7 +114,7 @@
// RPeninputServerImpl::NewL
// ---------------------------------------------------------------------------
//
-RPeninputServerImpl* RPeninputServerImpl::NewL(TRequestStatus* aStatus)
+RPeninputServerImpl* RPeninputServerImpl::NewL()
{
//check for singleton existence
CCoeStatic * obj = CCoeEnv::Static()->FindStatic(KSingletonClientId);
@@ -123,14 +123,16 @@
if(client && client->IsValid())
{
RPeninputServerImpl* server = client->GetSingletonServer();
- TInt err = server->ServerReady() ? KErrNone : KErrLaunchingServer;
- User::RequestComplete(aStatus,err);
return server;
+/* if(iSingletonServer == 0 ) // second or later connecting from same client
+ {
+ error = KErrLaunchingServer;
+ }*/
}
RPeninputServerImpl* self = new(ELeave) RPeninputServerImpl();
CleanupStack::PushL(self);
- self->ConstructL(KSingletonClientId,aStatus);
+ self->ConstructL(KSingletonClientId);
CleanupStack::Pop(self);
return self;
}
@@ -145,18 +147,16 @@
iIsForegroundSession = EFalse;
iServerExit = EFalse;
iLaunchServer = EFalse;
+ iWaitScheduler = 0;
iCurPenUiType = -1;
- iWaitScheduler = NULL;
+ iWaitScheduler = 0;
iAppPrefferedUiMode = EPluginInputModeNone;
iAutoOpenFlag = ETrue;
iBackgroundCtrl = 0;
iResourceChange = EFalse;
- iWaiterAo = NULL;
- iPendingRequest = NULL;
- iServerReady = EFalse;
}
-void RPeninputServerImpl::ConstructL(const TUid& aUid, TRequestStatus* aStatus)
+void RPeninputServerImpl::ConstructL(const TUid& aUid)
{
CCoeStatic * obj = CCoeEnv::Static()->FindStatic(aUid);
CPenInputSingletonClient* client;
@@ -170,7 +170,7 @@
client = new (ELeave)CPenInputSingletonClient(aUid,this);
//Note: The client is destroyed by the control environment automatically
//User::LeaveIfError(DoConnectL());
- TRAPD(err, DoConnectL(aStatus));
+ TRAPD(err, DoConnectL());
if(KErrNone != err)
{
client->SetInvalid();
@@ -217,9 +217,8 @@
// RPeninputServerImpl::DoConnectL
// ---------------------------------------------------------------------------
//
-TInt RPeninputServerImpl::DoConnectL(TRequestStatus* aStatus)
+TInt RPeninputServerImpl::DoConnectL()
{
- iPendingRequest = aStatus;
TInt error = KErrNone;
/*************** Note ************************************************/
// Multi-thread case is not considered here!
@@ -234,45 +233,36 @@
{
// server does not yet exist or it has terminated
// try to create the server
-
- if(!aStatus) //sync call
+ error = StartThreadL();
+
+ if ( error == KErrNone || error == KErrAlreadyExists )
{
- error = StartThreadL();
- if(KErrNone == error)
- {
- error = CreateSession( KPeninputServerName,
- Version(),
- KDefaultMessageSlots,EIpcSession_Sharable);
- AddObserver();
- }
-
+ // creation of server successfull, or some other client thread
+ // created it first -> try to connect again
+ error = CreateSession( KPeninputServerName,
+ Version(),
+ KDefaultMessageSlots );
}
else
{
- StartThreadAsyncL();
- return KErrNone;
+ return error;
}
}
- else //server alreay there
+
+ TThreadId srvThreadId;
+ if(KErrNone == error)
{
- if(aStatus)
- OnServerStarted(KErrNone);
- else
- AddObserver();
+ TIpcArgs arg;
+
+ TPckg<TThreadId> msg(srvThreadId);
+ arg.Set(KMsgSlot0,&msg);
+ SendReceive(EPeninputRequestServerThreadId,arg);
}
- return error;
- }
-
-void RPeninputServerImpl::AddObserver()
- {
- TThreadId srvThreadId;
- TIpcArgs arg;
-
- TPckg<TThreadId> msg(srvThreadId);
- arg.Set(KMsgSlot0,&msg);
- SendReceive(EPeninputRequestServerThreadId,arg);
-
+
iServerExit = EFalse;
+ //create default observer
+ /*CPeninputServerObserver* observer = CPeninputServerObserver::NewL(this,
+ srvThreadId,iObserver);*/
if(iObserver)
{
iObserver->ReConstructL(srvThreadId);
@@ -281,12 +271,22 @@
{
iObserver = CPeninputServerObserver::NewL(this,srvThreadId);
}
+
+
+ TFindThread findPeninputServer( _L("*peninputserver*") );
+ TFullName name;
+ if (findPeninputServer.Next( name ) == KErrNone)
+ {
+ // if server is already running return immediately
+ //return KErrAlreadyExists;
+ RThread p;
+ TInt r = p.Open(name);
+ p.Close();
+ }
+
+ return error;
}
-TBool RPeninputServerImpl::ServerReady()
- {
- return iServerReady;
- }
// ---------------------------------------------------------------------------
// RPeninputServerImpl::Version
@@ -645,14 +645,6 @@
return supportMode;
}
-TInt RPeninputServerImpl::SetInputLanguage( TInt aLanguage )
- {
- TIpcArgs arg;
- TPckgC<TInt> msg(aLanguage);
- arg.Set(KMsgSlot0,&msg);
- return SendReceive(EPeninputRequestSetInputLanguage, arg);
- }
-
void RPeninputServerImpl::BackgroudDefaultOri( TInt aOri )
{
TIpcArgs arg;
@@ -680,27 +672,6 @@
}
*/
-
-TInt RPeninputServerImpl::StartThreadAsyncL()
- {
- //ASSERT_DUBUG(!iWaiterAo)
- iWaiterAo = new CWaitingServerAo(this);
-
-
- TInt ret = KErrNone;
-
- RProcess server;
- User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC()));
-
-
- server.Rendezvous(iWaiterAo->RequestStatus());
- server.Resume();
- server.Close();
-
- return ret;
- }
-
-
// ---------------------------------------------------------------------------
// RPeninputServerImpl::StartThread
// Creates the server thread on WINS and server process on MARM.
@@ -713,25 +684,39 @@
//
TInt RPeninputServerImpl::StartThreadL()
{
+ if(iWaitScheduler)
+ return KErrLaunchingServer;
TInt ret = KErrNone;
+ // check if server already exists
+ TFindServer findPeninputServer( KPeninputServerName );
+ TFullName name;
+ if (findPeninputServer.Next( name ) == KErrNone)
+ {
+ // if server is already running return immediately
+ return KErrAlreadyExists;
+ }
+ // request status which gets signaled when server has been initialized
+
RProcess server;
User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC()));
+ TRequestStatus status;
+ //User::WaitForRequest(status);
- TRequestStatus status;
- server.Rendezvous(status);
+
+ iObserver = CPeninputServerObserver::NewL(this,
+ 0);
+ server.Rendezvous(iObserver->RequestStatus());
server.Resume();
server.Close();
+
+ iWaitScheduler = CPeninputServerWaiter::NewL();
+ iWaitScheduler->Start();
+ ret = iWaitScheduler->Error();
- User::WaitForRequest(status);
- if(ESignalServerReady != status.Int())
- ret = KErrGeneral;
- else
- iServerReady = ETrue;
return ret;
}
-
// ---------------------------------------------------------------------------
// RPeninputServerImpl::AddPeninputServerObserverL
// Add observer
@@ -1082,13 +1067,6 @@
delete iObserver;
iObserver = NULL;
- if ( iWaiterAo )
- {
- iWaiterAo->Cancel();
- delete iWaiterAo;
- iWaiterAo = NULL;
- }
-
RSessionBase::Close();
}
@@ -1521,54 +1499,5 @@
MakeVisible( EFalse );
}
-
-void RPeninputServerImpl::OnServerStarted(TInt aErr)
- {
- if(KErrNone == aErr)
- {
- iServerReady = ETrue;
- }
-
- //create session
-
- TInt error = CreateSession( KPeninputServerName,
- Version(),
- KDefaultMessageSlots,EIpcSession_Sharable);
-
- if(KErrNone == error)
- AddObserver();
-
- User::RequestComplete(iPendingRequest, aErr);
- }
-
-CWaitingServerAo::CWaitingServerAo(RPeninputServerImpl* aClient)
- : CActive(CActive::EPriorityStandard),
- iClient(aClient)
- {
- CActiveScheduler::Add(this);
- SetActive();
- iStatus = KRequestPending;
- }
-
-
-void CWaitingServerAo::RunL()
- {
- TInt err = ESignalServerReady == iStatus.Int() ? KErrNone : KErrGeneral;
-
- iClient->OnServerStarted(err);
- }
-
-void CWaitingServerAo::DoCancel()
- {
- }
-TInt CWaitingServerAo::RunError(TInt /*aError*/)
- {
- return KErrNone;
- }
-
-TRequestStatus& CWaitingServerAo::RequestStatus()
- {
- return iStatus;
- }
// End of File