112 |
112 |
113 // --------------------------------------------------------------------------- |
113 // --------------------------------------------------------------------------- |
114 // RPeninputServerImpl::NewL |
114 // RPeninputServerImpl::NewL |
115 // --------------------------------------------------------------------------- |
115 // --------------------------------------------------------------------------- |
116 // |
116 // |
117 RPeninputServerImpl* RPeninputServerImpl::NewL(TRequestStatus* aStatus) |
117 RPeninputServerImpl* RPeninputServerImpl::NewL() |
118 { |
118 { |
119 //check for singleton existence |
119 //check for singleton existence |
120 CCoeStatic * obj = CCoeEnv::Static()->FindStatic(KSingletonClientId); |
120 CCoeStatic * obj = CCoeEnv::Static()->FindStatic(KSingletonClientId); |
121 CPenInputSingletonClient* client = |
121 CPenInputSingletonClient* client = |
122 static_cast<CPenInputSingletonClient*>(obj); |
122 static_cast<CPenInputSingletonClient*>(obj); |
123 if(client && client->IsValid()) |
123 if(client && client->IsValid()) |
124 { |
124 { |
125 RPeninputServerImpl* server = client->GetSingletonServer(); |
125 RPeninputServerImpl* server = client->GetSingletonServer(); |
126 TInt err = server->ServerReady() ? KErrNone : KErrLaunchingServer; |
|
127 User::RequestComplete(aStatus,err); |
|
128 return server; |
126 return server; |
|
127 /* if(iSingletonServer == 0 ) // second or later connecting from same client |
|
128 { |
|
129 error = KErrLaunchingServer; |
|
130 }*/ |
129 } |
131 } |
130 |
132 |
131 RPeninputServerImpl* self = new(ELeave) RPeninputServerImpl(); |
133 RPeninputServerImpl* self = new(ELeave) RPeninputServerImpl(); |
132 CleanupStack::PushL(self); |
134 CleanupStack::PushL(self); |
133 self->ConstructL(KSingletonClientId,aStatus); |
135 self->ConstructL(KSingletonClientId); |
134 CleanupStack::Pop(self); |
136 CleanupStack::Pop(self); |
135 return self; |
137 return self; |
136 } |
138 } |
137 |
139 |
138 // --------------------------------------------------------------------------- |
140 // --------------------------------------------------------------------------- |
143 { |
145 { |
144 iObserver = 0; |
146 iObserver = 0; |
145 iIsForegroundSession = EFalse; |
147 iIsForegroundSession = EFalse; |
146 iServerExit = EFalse; |
148 iServerExit = EFalse; |
147 iLaunchServer = EFalse; |
149 iLaunchServer = EFalse; |
|
150 iWaitScheduler = 0; |
148 iCurPenUiType = -1; |
151 iCurPenUiType = -1; |
149 iWaitScheduler = NULL; |
152 iWaitScheduler = 0; |
150 iAppPrefferedUiMode = EPluginInputModeNone; |
153 iAppPrefferedUiMode = EPluginInputModeNone; |
151 iAutoOpenFlag = ETrue; |
154 iAutoOpenFlag = ETrue; |
152 iBackgroundCtrl = 0; |
155 iBackgroundCtrl = 0; |
153 iResourceChange = EFalse; |
156 iResourceChange = EFalse; |
154 iWaiterAo = NULL; |
157 } |
155 iPendingRequest = NULL; |
158 |
156 iServerReady = EFalse; |
159 void RPeninputServerImpl::ConstructL(const TUid& aUid) |
157 } |
|
158 |
|
159 void RPeninputServerImpl::ConstructL(const TUid& aUid, TRequestStatus* aStatus) |
|
160 { |
160 { |
161 CCoeStatic * obj = CCoeEnv::Static()->FindStatic(aUid); |
161 CCoeStatic * obj = CCoeEnv::Static()->FindStatic(aUid); |
162 CPenInputSingletonClient* client; |
162 CPenInputSingletonClient* client; |
163 //__ASSERT_ALWAYS(obj == NULL, User::Leave(KErrAlreadyExists)); |
163 //__ASSERT_ALWAYS(obj == NULL, User::Leave(KErrAlreadyExists)); |
164 if(obj) |
164 if(obj) |
168 } |
168 } |
169 else |
169 else |
170 client = new (ELeave)CPenInputSingletonClient(aUid,this); |
170 client = new (ELeave)CPenInputSingletonClient(aUid,this); |
171 //Note: The client is destroyed by the control environment automatically |
171 //Note: The client is destroyed by the control environment automatically |
172 //User::LeaveIfError(DoConnectL()); |
172 //User::LeaveIfError(DoConnectL()); |
173 TRAPD(err, DoConnectL(aStatus)); |
173 TRAPD(err, DoConnectL()); |
174 if(KErrNone != err) |
174 if(KErrNone != err) |
175 { |
175 { |
176 client->SetInvalid(); |
176 client->SetInvalid(); |
177 User::LeaveIfError(err); |
177 User::LeaveIfError(err); |
178 } |
178 } |
215 |
215 |
216 // --------------------------------------------------------------------------- |
216 // --------------------------------------------------------------------------- |
217 // RPeninputServerImpl::DoConnectL |
217 // RPeninputServerImpl::DoConnectL |
218 // --------------------------------------------------------------------------- |
218 // --------------------------------------------------------------------------- |
219 // |
219 // |
220 TInt RPeninputServerImpl::DoConnectL(TRequestStatus* aStatus) |
220 TInt RPeninputServerImpl::DoConnectL() |
221 { |
221 { |
222 iPendingRequest = aStatus; |
|
223 TInt error = KErrNone; |
222 TInt error = KErrNone; |
224 /*************** Note ************************************************/ |
223 /*************** Note ************************************************/ |
225 // Multi-thread case is not considered here! |
224 // Multi-thread case is not considered here! |
226 /*************** Note ************************************************/ |
225 /*************** Note ************************************************/ |
227 |
226 |
232 |
231 |
233 if( error == KErrNotFound || error == KErrServerTerminated ) |
232 if( error == KErrNotFound || error == KErrServerTerminated ) |
234 { |
233 { |
235 // server does not yet exist or it has terminated |
234 // server does not yet exist or it has terminated |
236 // try to create the server |
235 // try to create the server |
237 |
236 error = StartThreadL(); |
238 if(!aStatus) //sync call |
237 |
|
238 if ( error == KErrNone || error == KErrAlreadyExists ) |
239 { |
239 { |
240 error = StartThreadL(); |
240 // creation of server successfull, or some other client thread |
241 if(KErrNone == error) |
241 // created it first -> try to connect again |
242 { |
242 error = CreateSession( KPeninputServerName, |
243 error = CreateSession( KPeninputServerName, |
243 Version(), |
244 Version(), |
244 KDefaultMessageSlots ); |
245 KDefaultMessageSlots,EIpcSession_Sharable); |
|
246 AddObserver(); |
|
247 } |
|
248 |
|
249 } |
245 } |
250 else |
246 else |
251 { |
247 { |
252 StartThreadAsyncL(); |
248 return error; |
253 return KErrNone; |
|
254 } |
249 } |
255 } |
250 } |
256 else //server alreay there |
251 |
257 { |
252 TThreadId srvThreadId; |
258 if(aStatus) |
253 if(KErrNone == error) |
259 OnServerStarted(KErrNone); |
254 { |
260 else |
255 TIpcArgs arg; |
261 AddObserver(); |
256 |
262 } |
257 TPckg<TThreadId> msg(srvThreadId); |
|
258 arg.Set(KMsgSlot0,&msg); |
|
259 SendReceive(EPeninputRequestServerThreadId,arg); |
|
260 } |
|
261 |
|
262 iServerExit = EFalse; |
|
263 //create default observer |
|
264 /*CPeninputServerObserver* observer = CPeninputServerObserver::NewL(this, |
|
265 srvThreadId,iObserver);*/ |
|
266 if(iObserver) |
|
267 { |
|
268 iObserver->ReConstructL(srvThreadId); |
|
269 } |
|
270 else |
|
271 { |
|
272 iObserver = CPeninputServerObserver::NewL(this,srvThreadId); |
|
273 } |
|
274 |
|
275 |
|
276 TFindThread findPeninputServer( _L("*peninputserver*") ); |
|
277 TFullName name; |
|
278 if (findPeninputServer.Next( name ) == KErrNone) |
|
279 { |
|
280 // if server is already running return immediately |
|
281 //return KErrAlreadyExists; |
|
282 RThread p; |
|
283 TInt r = p.Open(name); |
|
284 p.Close(); |
|
285 } |
|
286 |
263 return error; |
287 return error; |
264 } |
288 } |
265 |
289 |
266 void RPeninputServerImpl::AddObserver() |
|
267 { |
|
268 TThreadId srvThreadId; |
|
269 TIpcArgs arg; |
|
270 |
|
271 TPckg<TThreadId> msg(srvThreadId); |
|
272 arg.Set(KMsgSlot0,&msg); |
|
273 SendReceive(EPeninputRequestServerThreadId,arg); |
|
274 |
|
275 iServerExit = EFalse; |
|
276 if(iObserver) |
|
277 { |
|
278 iObserver->ReConstructL(srvThreadId); |
|
279 } |
|
280 else |
|
281 { |
|
282 iObserver = CPeninputServerObserver::NewL(this,srvThreadId); |
|
283 } |
|
284 } |
|
285 |
|
286 TBool RPeninputServerImpl::ServerReady() |
|
287 { |
|
288 return iServerReady; |
|
289 } |
|
290 |
290 |
291 // --------------------------------------------------------------------------- |
291 // --------------------------------------------------------------------------- |
292 // RPeninputServerImpl::Version |
292 // RPeninputServerImpl::Version |
293 // --------------------------------------------------------------------------- |
293 // --------------------------------------------------------------------------- |
294 // |
294 // |
643 SendReceive(EPeninputRequestSupportInputMode,arg); |
643 SendReceive(EPeninputRequestSupportInputMode,arg); |
644 |
644 |
645 return supportMode; |
645 return supportMode; |
646 } |
646 } |
647 |
647 |
648 TInt RPeninputServerImpl::SetInputLanguage( TInt aLanguage ) |
|
649 { |
|
650 TIpcArgs arg; |
|
651 TPckgC<TInt> msg(aLanguage); |
|
652 arg.Set(KMsgSlot0,&msg); |
|
653 return SendReceive(EPeninputRequestSetInputLanguage, arg); |
|
654 } |
|
655 |
|
656 void RPeninputServerImpl::BackgroudDefaultOri( TInt aOri ) |
648 void RPeninputServerImpl::BackgroudDefaultOri( TInt aOri ) |
657 { |
649 { |
658 TIpcArgs arg; |
650 TIpcArgs arg; |
659 TPckgC<TInt> msg(aOri); |
651 TPckgC<TInt> msg(aOri); |
660 arg.Set(KMsgSlot0,&msg); |
652 arg.Set(KMsgSlot0,&msg); |
678 commandLine->SetProcessEnvironmentL(aServer); |
670 commandLine->SetProcessEnvironmentL(aServer); |
679 CleanupStack::PopAndDestroy(commandLine); |
671 CleanupStack::PopAndDestroy(commandLine); |
680 |
672 |
681 } |
673 } |
682 */ |
674 */ |
683 |
|
684 TInt RPeninputServerImpl::StartThreadAsyncL() |
|
685 { |
|
686 //ASSERT_DUBUG(!iWaiterAo) |
|
687 iWaiterAo = new CWaitingServerAo(this); |
|
688 |
|
689 |
|
690 TInt ret = KErrNone; |
|
691 |
|
692 RProcess server; |
|
693 User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC())); |
|
694 |
|
695 |
|
696 server.Rendezvous(iWaiterAo->RequestStatus()); |
|
697 server.Resume(); |
|
698 server.Close(); |
|
699 |
|
700 return ret; |
|
701 } |
|
702 |
|
703 |
|
704 // --------------------------------------------------------------------------- |
675 // --------------------------------------------------------------------------- |
705 // RPeninputServerImpl::StartThread |
676 // RPeninputServerImpl::StartThread |
706 // Creates the server thread on WINS and server process on MARM. |
677 // Creates the server thread on WINS and server process on MARM. |
707 // Access to the thread/process creation is controlled with |
678 // Access to the thread/process creation is controlled with |
708 // a global mutex which allows only one client thread to do |
679 // a global mutex which allows only one client thread to do |
711 // already created it. |
682 // already created it. |
712 // --------------------------------------------------------------------------- |
683 // --------------------------------------------------------------------------- |
713 // |
684 // |
714 TInt RPeninputServerImpl::StartThreadL() |
685 TInt RPeninputServerImpl::StartThreadL() |
715 { |
686 { |
|
687 if(iWaitScheduler) |
|
688 return KErrLaunchingServer; |
716 TInt ret = KErrNone; |
689 TInt ret = KErrNone; |
|
690 |
|
691 // check if server already exists |
|
692 TFindServer findPeninputServer( KPeninputServerName ); |
|
693 TFullName name; |
|
694 if (findPeninputServer.Next( name ) == KErrNone) |
|
695 { |
|
696 // if server is already running return immediately |
|
697 return KErrAlreadyExists; |
|
698 } |
|
699 // request status which gets signaled when server has been initialized |
717 |
700 |
718 RProcess server; |
701 RProcess server; |
719 User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC())); |
702 User::LeaveIfError(server.Create(KPeninputServerExe,KNullDesC())); |
720 |
703 TRequestStatus status; |
721 TRequestStatus status; |
704 //User::WaitForRequest(status); |
722 server.Rendezvous(status); |
705 |
|
706 |
|
707 iObserver = CPeninputServerObserver::NewL(this, |
|
708 0); |
|
709 server.Rendezvous(iObserver->RequestStatus()); |
723 server.Resume(); |
710 server.Resume(); |
724 server.Close(); |
711 server.Close(); |
725 |
712 |
726 User::WaitForRequest(status); |
713 iWaitScheduler = CPeninputServerWaiter::NewL(); |
727 if(ESignalServerReady != status.Int()) |
714 iWaitScheduler->Start(); |
728 ret = KErrGeneral; |
715 ret = iWaitScheduler->Error(); |
729 else |
716 |
730 iServerReady = ETrue; |
|
731 return ret; |
717 return ret; |
732 } |
718 } |
733 |
|
734 |
719 |
735 // --------------------------------------------------------------------------- |
720 // --------------------------------------------------------------------------- |
736 // RPeninputServerImpl::AddPeninputServerObserverL |
721 // RPeninputServerImpl::AddPeninputServerObserverL |
737 // Add observer |
722 // Add observer |
738 // --------------------------------------------------------------------------- |
723 // --------------------------------------------------------------------------- |
1519 void CPenUiBackgroundWnd::Hide() |
1497 void CPenUiBackgroundWnd::Hide() |
1520 { |
1498 { |
1521 MakeVisible( EFalse ); |
1499 MakeVisible( EFalse ); |
1522 } |
1500 } |
1523 |
1501 |
1524 |
|
1525 void RPeninputServerImpl::OnServerStarted(TInt aErr) |
|
1526 { |
|
1527 if(KErrNone == aErr) |
|
1528 { |
|
1529 iServerReady = ETrue; |
|
1530 } |
|
1531 |
|
1532 //create session |
|
1533 |
|
1534 TInt error = CreateSession( KPeninputServerName, |
|
1535 Version(), |
|
1536 KDefaultMessageSlots,EIpcSession_Sharable); |
|
1537 |
|
1538 if(KErrNone == error) |
|
1539 AddObserver(); |
|
1540 |
|
1541 User::RequestComplete(iPendingRequest, aErr); |
|
1542 } |
|
1543 |
|
1544 CWaitingServerAo::CWaitingServerAo(RPeninputServerImpl* aClient) |
|
1545 : CActive(CActive::EPriorityStandard), |
|
1546 iClient(aClient) |
|
1547 { |
|
1548 CActiveScheduler::Add(this); |
|
1549 SetActive(); |
|
1550 iStatus = KRequestPending; |
|
1551 } |
|
1552 |
|
1553 |
|
1554 void CWaitingServerAo::RunL() |
|
1555 { |
|
1556 TInt err = ESignalServerReady == iStatus.Int() ? KErrNone : KErrGeneral; |
|
1557 |
|
1558 iClient->OnServerStarted(err); |
|
1559 } |
|
1560 |
|
1561 void CWaitingServerAo::DoCancel() |
|
1562 { |
|
1563 } |
|
1564 TInt CWaitingServerAo::RunError(TInt /*aError*/) |
|
1565 { |
|
1566 return KErrNone; |
|
1567 } |
|
1568 |
|
1569 TRequestStatus& CWaitingServerAo::RequestStatus() |
|
1570 { |
|
1571 return iStatus; |
|
1572 } |
|
1573 // End of File |
1502 // End of File |
1574 |
1503 |