|
1 /* |
|
2 * =========================================================================== |
|
3 * Name : hgfswserver.cpp |
|
4 * Part of : Huriganes / Fast Swap Server |
|
5 * Description : server implementation |
|
6 * Version : %version: sa1spcx1#14 % |
|
7 * |
|
8 * Copyright © 2008 Nokia Corporation. |
|
9 * This material, including documentation and any related |
|
10 * computer programs, is protected by copyright controlled by |
|
11 * Nokia Corporation. All rights are reserved. Copying, |
|
12 * including reproducing, storing, adapting or translating, any |
|
13 * or all of this material requires the prior written consent of |
|
14 * Nokia Corporation. This material also contains confidential |
|
15 * information which may not be disclosed to others without the |
|
16 * prior written consent of Nokia Corporation. |
|
17 * =========================================================================== |
|
18 */ |
|
19 |
|
20 #include "hgfswserver.h" |
|
21 #include "hgfswsession.h" |
|
22 #include "hgfswappui.h" |
|
23 #include "hgfswengine.h" |
|
24 |
|
25 #include <s32mem.h> |
|
26 #include <eikenv.h> |
|
27 #include <apgwgnam.h> |
|
28 |
|
29 // -------------------------------------------------------------------------- |
|
30 // CHgFswServer::CHgFswServer |
|
31 // -------------------------------------------------------------------------- |
|
32 // |
|
33 CHgFswServer::CHgFswServer( TInt aPriority, CHgFswAppUi& aAppUi ) |
|
34 : CServer2( aPriority ), iAppUi( aAppUi ) |
|
35 { |
|
36 } |
|
37 |
|
38 // -------------------------------------------------------------------------- |
|
39 // CHgFswServer::NewLC |
|
40 // -------------------------------------------------------------------------- |
|
41 // |
|
42 CHgFswServer* CHgFswServer::NewLC( CHgFswAppUi& aAppUi ) |
|
43 { |
|
44 CHgFswServer* self = new ( ELeave ) CHgFswServer( |
|
45 EPriorityNormal, aAppUi ); |
|
46 CleanupStack::PushL( self ); |
|
47 self->ConstructL(); |
|
48 return self; |
|
49 } |
|
50 |
|
51 // -------------------------------------------------------------------------- |
|
52 // CHgFswServer::ConstructL |
|
53 // -------------------------------------------------------------------------- |
|
54 // |
|
55 void CHgFswServer::ConstructL() |
|
56 { |
|
57 StartL( KHgFswServerName ); |
|
58 iEngine = CHgFswEngine::NewL( *this ); |
|
59 iAppUi.SetTaskListObserver( *iEngine ); |
|
60 iAppUi.SetResourceObserver( *iEngine ); |
|
61 } |
|
62 |
|
63 // -------------------------------------------------------------------------- |
|
64 // CHgFswServer::~CHgFswServer |
|
65 // -------------------------------------------------------------------------- |
|
66 // |
|
67 CHgFswServer::~CHgFswServer() |
|
68 { |
|
69 delete iBuffer; |
|
70 delete iEngine; |
|
71 } |
|
72 |
|
73 // -------------------------------------------------------------------------- |
|
74 // CHgFswServer::NewSessionL |
|
75 // -------------------------------------------------------------------------- |
|
76 // |
|
77 CSession2* CHgFswServer::NewSessionL( const TVersion&, |
|
78 const RMessage2& ) const |
|
79 { |
|
80 return new ( ELeave ) CHgFswSession; |
|
81 } |
|
82 |
|
83 // -------------------------------------------------------------------------- |
|
84 // CHgFswServer::AddSession |
|
85 // -------------------------------------------------------------------------- |
|
86 // |
|
87 void CHgFswServer::AddSession() |
|
88 { |
|
89 ++iSessionCount; |
|
90 } |
|
91 |
|
92 // -------------------------------------------------------------------------- |
|
93 // CHgFswServer::DropSession |
|
94 // -------------------------------------------------------------------------- |
|
95 // |
|
96 void CHgFswServer::DropSession() |
|
97 { |
|
98 --iSessionCount; |
|
99 } |
|
100 |
|
101 // -------------------------------------------------------------------------- |
|
102 // CHgFswServer::SerializeAndGetBufferSizeL |
|
103 // -------------------------------------------------------------------------- |
|
104 // |
|
105 void CHgFswServer::SerializeAndGetBufferSizeL( const RMessage2& aMessage ) |
|
106 { |
|
107 const TInt KBufferExpandSize = 128; |
|
108 const RHgFswArray& array( iEngine->FswDataL() ); |
|
109 delete iBuffer; iBuffer = NULL; |
|
110 iBuffer = CBufFlat::NewL( KBufferExpandSize ); |
|
111 RBufWriteStream ws; |
|
112 CleanupClosePushL( ws ); |
|
113 ws.Open( *iBuffer ); |
|
114 CHgFswEntry::ExternalizeArrayL( ws, array ); |
|
115 CleanupStack::PopAndDestroy( &ws ); |
|
116 TPtr8 p( iBuffer->Ptr( 0 ) ); |
|
117 TPckg<TInt> size( p.Length() ); |
|
118 aMessage.WriteL( 0, size ); |
|
119 aMessage.Complete( KErrNone ); |
|
120 } |
|
121 |
|
122 // -------------------------------------------------------------------------- |
|
123 // CHgFswServer::GetBufferL |
|
124 // -------------------------------------------------------------------------- |
|
125 // |
|
126 void CHgFswServer::GetBufferL( const RMessage2& aMessage ) |
|
127 { |
|
128 if ( !iBuffer ) |
|
129 { |
|
130 User::Leave( KErrGeneral ); |
|
131 } |
|
132 TPtr8 p( iBuffer->Ptr( 0 ) ); |
|
133 // If the size expected by the client does not match indicate it with a leave |
|
134 // so the client can recognize it by checking the return value of SendReceive |
|
135 // and can request the buffer size again. |
|
136 if ( p.Length() != aMessage.Int1() ) |
|
137 { |
|
138 User::Leave( KErrArgument ); |
|
139 } |
|
140 aMessage.WriteL( 0, p ); |
|
141 aMessage.Complete( KErrNone ); |
|
142 } |
|
143 |
|
144 // -------------------------------------------------------------------------- |
|
145 // CHgFswServer::CloseAppL |
|
146 // -------------------------------------------------------------------------- |
|
147 // |
|
148 void CHgFswServer::CloseAppL( TInt aWgId ) |
|
149 { |
|
150 iEngine->CloseAppL( aWgId ); |
|
151 } |
|
152 |
|
153 // -------------------------------------------------------------------------- |
|
154 // CHgFswServer::SwitchToAppL |
|
155 // -------------------------------------------------------------------------- |
|
156 // |
|
157 void CHgFswServer::SwitchToAppL( TInt aWgId ) |
|
158 { |
|
159 iEngine->SwitchToAppL( aWgId ); |
|
160 } |
|
161 |
|
162 // -------------------------------------------------------------------------- |
|
163 // CHgFswServer::ForegroundAppUidL |
|
164 // -------------------------------------------------------------------------- |
|
165 // |
|
166 void CHgFswServer::ForegroundAppUidL( const RMessage2& aMessage ) |
|
167 { |
|
168 TUid uid = iEngine->ForegroundAppUidL( aMessage.Int1() ); |
|
169 TPckg<TInt> uidPckg( uid.iUid ); |
|
170 aMessage.WriteL( 0, uidPckg ); |
|
171 } |
|
172 |
|
173 // -------------------------------------------------------------------------- |
|
174 // CHgFswServer::FswDataChanged |
|
175 // callback from engine |
|
176 // -------------------------------------------------------------------------- |
|
177 // |
|
178 void CHgFswServer::FswDataChanged() |
|
179 { |
|
180 // notify all sessions about the change |
|
181 iSessionIter.SetToFirst(); |
|
182 while ( CHgFswSession* session = static_cast<CHgFswSession*>( iSessionIter++ ) ) |
|
183 { |
|
184 if ( session->IsListening() ) |
|
185 { |
|
186 session->FswDataChanged(); |
|
187 } |
|
188 } |
|
189 } |
|
190 |
|
191 // -------------------------------------------------------------------------- |
|
192 // CHgFswServer::FswDataListenersCount |
|
193 // callback from engine |
|
194 // -------------------------------------------------------------------------- |
|
195 // |
|
196 TInt CHgFswServer::FswDataListenerCount() |
|
197 { |
|
198 TInt n = 0; |
|
199 iSessionIter.SetToFirst(); |
|
200 while ( CHgFswSession* session = static_cast<CHgFswSession*>( iSessionIter++ ) ) |
|
201 { |
|
202 if ( session->IsListening() ) |
|
203 { |
|
204 ++n; |
|
205 } |
|
206 } |
|
207 return n; |
|
208 } |
|
209 |
|
210 // -------------------------------------------------------------------------- |
|
211 // RunServerL |
|
212 // -------------------------------------------------------------------------- |
|
213 // |
|
214 static void RunServerL( CHgFswAppUi& aAppUi, CEikonEnv& aEnv ) |
|
215 { |
|
216 // change thread name |
|
217 User::LeaveIfError( RThread::RenameMe( KHgFswServerName ) ); |
|
218 |
|
219 // set app as hidden |
|
220 CApaWindowGroupName* wgName = |
|
221 CApaWindowGroupName::NewL( aEnv.WsSession(), |
|
222 aEnv.RootWin().Identifier() ); |
|
223 wgName->SetHidden( ETrue ); |
|
224 wgName->SetWindowGroupName( aEnv.RootWin() ); |
|
225 delete wgName; |
|
226 |
|
227 // start server |
|
228 CHgFswServer* server = CHgFswServer::NewLC( aAppUi ); |
|
229 RProcess::Rendezvous( KErrNone ); |
|
230 CActiveScheduler::Start(); |
|
231 CleanupStack::PopAndDestroy( server ); |
|
232 } |
|
233 |
|
234 // -------------------------------------------------------------------------- |
|
235 // E32Main |
|
236 // -------------------------------------------------------------------------- |
|
237 // |
|
238 TInt E32Main() |
|
239 { |
|
240 __UHEAP_MARK; |
|
241 CTrapCleanup* cleanup = CTrapCleanup::New(); |
|
242 TInt err = KErrNoMemory; |
|
243 if ( cleanup ) |
|
244 { |
|
245 CEikonEnv* env = new CEikonEnv; |
|
246 if ( env ) |
|
247 { |
|
248 TRAP( err, env->ConstructL() ); |
|
249 if ( err == KErrNone ) |
|
250 { |
|
251 env->DisableExitChecks( ETrue ); |
|
252 CHgFswAppUi* ui = new CHgFswAppUi; |
|
253 if ( ui ) |
|
254 { |
|
255 TRAP( err, ui->ConstructL() ); |
|
256 if ( err == KErrNone ) |
|
257 { |
|
258 // hide from tasklist and prevent from coming foreground |
|
259 env->RootWin().SetOrdinalPosition( 0, |
|
260 ECoeWinPriorityNeverAtFront ); |
|
261 // set as system app so will not be closed when memory is low |
|
262 env->SetSystem( ETrue ); |
|
263 |
|
264 RFbsSession::Connect(); |
|
265 |
|
266 TRAP( err, RunServerL( *ui, *env ) ); |
|
267 |
|
268 RFbsSession::Disconnect(); |
|
269 |
|
270 ui->PrepareToExit(); |
|
271 } |
|
272 } |
|
273 } |
|
274 env->DestroyEnvironment(); |
|
275 } |
|
276 delete cleanup; |
|
277 } |
|
278 __UHEAP_MARKEND; |
|
279 return err; |
|
280 } |
|
281 |
|
282 |
|
283 // end of file |