00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00028 #include "ssmanager.h"
00029 #include "dummy_diskstatus_swppolicy.hrh"
00030 #include <ssm/ssmsubstates.hrh>
00031 #include <ssm/ssmstate.h>
00032 #include <ssm/ssmstateawaresession.h>
00033 #include <ssm/ssmdomaindefs.h>
00034
00035 _LIT(KTxtExampleCode,"System State Manager Example");
00036 _LIT(KTxtError,"error is %d\n");
00037 _LIT(KTxtFormat,"*****************************\n");
00038 _LIT(KTxtFormat1,".............\n");
00039
00040 _LIT(KTxtSwpInfo,"\nKey of the SwP is %d \n \nValue of the SwP is %d \n\n");
00041 _LIT(KTxtSasResult,"\nState aware session connected with [%d]");
00042
00043 _LIT(KTxtState,"\nValue of new state :");
00044 _LIT(KTxtReqNotificationChgofState,"\nRequest Notification for any change of state\n");
00045 _LIT(KTxtStateValues,"\n Main state: %04x \n SubState: %04x \n");
00046
00047 _LIT(KTxtStateChangeResult,"\nState transition completed with : %d\n");
00048 _LIT(KTxtSwpChangeResult,"\nSwP transition completed with : %d\n");
00049
00050 const TUint KFiveSecDelay = 500000;
00051
00052 static TInt StopScheduler(TAny* )
00053 {
00054 CActiveScheduler::Stop();
00055 return KErrNone;
00056 }
00057
00058 CSysStateManagerExample* CSysStateManagerExample::NewLC()
00059 {
00060 CSysStateManagerExample* self=new(ELeave)CSysStateManagerExample();
00061 CleanupStack::PushL(self);
00062 return self;
00063 }
00064
00065 CSysStateManagerExample::CSysStateManagerExample()
00066 {
00067
00068 }
00069
00073 CSysStateManagerExample::~CSysStateManagerExample()
00074 {
00075 iSsmStateManager.Close();
00076 delete iConsole;
00077 }
00078
00082 void CSysStateManagerExample::SwpChanged(TSsmSwp )
00083 {
00084 _LIT(KTxtUserNotifiedSwPChange,"Notification received of a change in the SwP value.\n");
00085 iConsole->Printf(KTxtUserNotifiedSwPChange);
00086 }
00087
00091 void CSysStateManagerExample::RequestSwpChange()
00092 {
00097 TSsmSwp swp(EExampleSwPKey, ESwpValueJustPublishSwP);
00098
00099 TRequestStatus status;
00100 iSsmStateManager.RequestSwpChange(swp, status);
00101 User::WaitForRequest(status);
00102 iConsole->Printf(KTxtSwpChangeResult,status.Int());
00103 iConsole->Printf(KTxtSwpInfo,swp.Key(),swp.Value());
00104 }
00105
00109 void CSysStateManagerExample::RequestSsChange()
00110 {
00111 _LIT(KTxtNormalToRestore,"\nRequesting a System state change from Normal to Restore\n");
00112 TInt reason =0;
00113 TSsmStateTransition state(ESsmRestore, ESsmRestoreSubState, reason);
00114 iConsole->Printf(KTxtNormalToRestore);
00115 TRequestStatus status;
00116 iSsmStateManager.RequestStateTransition(state,status);
00117 User::WaitForRequest(status);
00118 User::After(KFiveSecDelay);
00119 iConsole->Printf(KTxtStateChangeResult,status.Int());
00120
00121 RSsmStateAwareSession stateAwareSession;
00122
00123
00124
00125
00126 TInt ret = stateAwareSession.Connect(KSM2UiServicesDomain3);
00127 if(ret!=KErrNone)
00128 {
00129 iConsole->Printf(KTxtSasResult,ret);
00130 }
00131 else
00132 {
00133 TSsmState current = stateAwareSession.State();
00134 TSsmStateName name = current.Name();
00135 iConsole->Printf(KTxtState);
00136 iConsole->Printf(name);
00137 iConsole->Printf(KTxtStateValues,current.MainState(),current.SubState());
00138 stateAwareSession.Close();
00139 }
00140 }
00141
00146 void CSysStateManagerExample::RequestSwpChangeWithNotificationL()
00147 {
00148 CActiveScheduler* sched = new(ELeave) CActiveScheduler;
00149 CleanupStack::PushL(sched);
00150 CActiveScheduler::Install(sched);
00155 CSsmSystemWideProperty* cProp = CSsmSystemWideProperty::NewLC(EExampleSwPKey);
00156
00157
00158 cProp->AddSubscriberL(*this);
00159
00160
00161 TSsmSwp swp(EExampleSwPKey,ESwpValueJustPublishSwP);
00162 TRequestStatus status;
00163 iSsmStateManager.RequestSwpChange(swp, status);
00164 User::WaitForRequest(status);
00165 iConsole->Printf(KTxtSwpChangeResult,status.Int());
00166 iConsole->Printf(KTxtSwpInfo,swp.Key(),swp.Value());
00167
00168
00169 swp.Set(EExampleSwPKey,ESwpValueForBackup);
00170 iSsmStateManager.RequestSwpChange(swp, status);
00171 User::WaitForRequest(status);
00172 iConsole->Printf(KTxtSwpChangeResult,status.Int());
00173 iConsole->Printf(KTxtSwpInfo,swp.Key(),swp.Value());
00174 CAsyncCallBack* stopper = new(ELeave) CAsyncCallBack(CActive::EPriorityIdle);
00175 CleanupStack::PushL(stopper);
00176 TCallBack stopSchedulerCallback(StopScheduler, this);
00177 stopper->Set(stopSchedulerCallback);
00178
00179
00180 stopper->CallBack();
00181
00182 sched->Start();
00183 CleanupStack::PopAndDestroy(3, sched);
00184 }
00185
00190 void CSysStateManagerExample::RequestSsChangeWithNotification()
00191 {
00192 _LIT(KTxtStateChangeNotificationSuccess,"\nNotification of the state transition received\n");
00193 _LIT(KTxtStateChangeNotificationFailure,"\nNotification of the state transition failed\n");
00194 _LIT(KTxtNormalToBackup,"\nRequest a System State change from Normal to Back up\n");
00195 _LIT(KTxtAlreadyInThisState,"\nSystem state is already in Backup\n");
00196
00197
00198 RSsmStateAwareSession stateAwareSession;
00199
00200
00201
00202
00203
00204 TInt err = stateAwareSession.Connect(KSM2UiServicesDomain3);
00205 iConsole->Printf(KTxtSasResult,err);
00206 TSsmState current = stateAwareSession.State();
00207 TSsmStateName name = current.Name();
00208
00209 if(current.MainState()!= ESsmBackup)
00210 {
00211 TSsmStateTransition state1(ESsmBackup,ESsmBackupSubState, 0);
00212 iConsole->Printf(KTxtNormalToBackup);
00213 TRequestStatus status1,status2;
00214 iConsole->Printf(KTxtReqNotificationChgofState);
00215 stateAwareSession.RequestStateNotification(status1);
00216 iSsmStateManager.RequestStateTransition(state1,status2);
00217 User::WaitForRequest(status2);
00218 User::After(KFiveSecDelay);
00219 if(status2.Int() == KErrNone)
00220 {
00221 iConsole->Printf(KTxtStateChangeResult,status2.Int());
00222 current = stateAwareSession.State();
00223 name = current.Name();
00224 }
00225 else
00226 {
00227 iConsole->Printf(KTxtStateChangeResult,status2.Int());
00228 }
00229 iConsole->Printf(KTxtState);
00230 iConsole->Printf(name);
00231 iConsole->Printf(KTxtStateValues,current.MainState(),current.SubState());
00232 User::WaitForRequest(status1);
00233 if(status1.Int() == KErrNone)
00234 {
00235 iConsole->Printf(KTxtStateChangeNotificationSuccess);
00236 }
00237 else
00238 {
00239 iConsole->Printf(KTxtStateChangeNotificationFailure);
00240 }
00241 }
00242 else
00243 {
00244 iConsole->Printf(KTxtAlreadyInThisState);
00245 }
00246 stateAwareSession.Close();
00247 }
00248
00249 void CSysStateManagerExample::SSManagerL()
00250 {
00251 _LIT(KTextPressAnyKey," [press any key]");
00252 _LIT(KTextPressAnyKeyToExit," [press any key to exit]");
00253
00254 _LIT(KTxtSwp,"Swp means SystemWide Property.\nDisk status, Battery information are few examples of System wide properties.\n");
00255 _LIT(KTxtSs,"\n SS means System State.\n Ex:Backup,Restore, Start-up, Shutdown are few examples of System states.\n");
00256 _LIT(KTxtExampleDemo,"\n The example helps the user in understanding, how to define new System states and System wide properties.It also helps him in exercising the various features of SSM framework.\n");
00257 _LIT(KTxtSSM, "Exercise the features of System State Manager\n");
00258 _LIT(KTxtConnect,"Connecting to System State Manager.........\n");
00259 _LIT(KTxtSuccess,"Connection is successful.........\n");
00260
00261 _LIT(KTxtReqChangeInSwp,"1) request a change to a Swp, without notification\n");
00262 _LIT(KTxtReqChangeInSs,"2) request a change to a system state, without notification\n");
00263 _LIT(KTxtNotifyChangeInSwp,"3) request a change to a Swp, with notification\n");
00264 _LIT(KTxtNotifyChangeInSs,"4) request a change to a system state, with notification\n");
00265 _LIT(KTxtOptionNotSupported,"this option is not supported\n");
00266
00267 _LIT(KTxtPressESC,"Press ESC to stop using the System State Information utility\n");
00268 _LIT(KTxtContinue,"Choose any option 1 - 4 to continue\n");
00269
00270 iConsole= Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
00271 iConsole->Printf(KTxtFormat);
00272 iConsole->Printf(KTxtSwp);
00273 iConsole->Printf(KTxtSs);
00274 iConsole->Printf(KTxtExampleDemo);
00275 iConsole->Printf(KTxtFormat);
00276 iConsole->Printf(KTxtSSM);
00277 iConsole->Printf(KTxtConnect);
00278 iConsole->Printf(KTxtFormat1);
00279 TInt connect = iSsmStateManager.Connect();
00280 if(connect==KErrNone)
00281 {
00282 iConsole->Printf(KTxtSuccess);
00283 iConsole->Printf(KTxtFormat);
00284 iConsole->Printf(KTextPressAnyKey);
00285 iConsole->Getch();
00286 iConsole->ClearScreen();
00287 iConsole->Printf(KTxtReqChangeInSwp);
00288 iConsole->Printf(KTxtReqChangeInSs);
00289 iConsole->Printf(KTxtNotifyChangeInSwp);
00290 iConsole->Printf(KTxtNotifyChangeInSs);
00291 iConsole->Printf(KTxtContinue);
00292 TChar tchar = iConsole->Getch();
00293
00294 while (tchar != EKeyEscape)
00295 {
00296 switch(tchar)
00297 {
00298 case '1':
00299 {
00300 RequestSwpChange();
00301 break;
00302 }
00303 case '2':
00304 {
00305 RequestSsChange();
00306 break;
00307 }
00308 case '3':
00309 {
00310 RequestSwpChangeWithNotificationL();
00311 break;
00312 }
00313 case '4':
00314 {
00315 RequestSsChangeWithNotification();
00316 break;
00317 }
00318 default:
00319 {
00320 iConsole->Printf(KTxtOptionNotSupported);
00321 break;
00322 }
00323 }
00324 iConsole->Printf(KTextPressAnyKey);
00325 iConsole->Getch();
00326 iConsole->ClearScreen();
00327 iConsole->Printf(KTxtPressESC);
00328 iConsole->Printf(KTxtContinue);
00329 iConsole->Printf(KTxtReqChangeInSwp);
00330 iConsole->Printf(KTxtReqChangeInSs);
00331 iConsole->Printf(KTxtNotifyChangeInSwp);
00332 iConsole->Printf(KTxtNotifyChangeInSs);
00333 tchar = iConsole->Getch();
00334 }
00335 }
00336 else
00337 {
00338 iConsole->Printf(KTxtError,connect);
00339 }
00340 iConsole->Printf(KTextPressAnyKeyToExit);
00341 iConsole->Getch();
00342 }
00343
00344 static void doExampleL()
00345 {
00346 CSysStateManagerExample* ssManager = CSysStateManagerExample::NewLC();
00347 ssManager->SSManagerL();
00348 CleanupStack::PopAndDestroy(ssManager);
00349 }
00350
00351 extern TInt E32Main()
00352 {
00353 __UHEAP_MARK;
00354 CTrapCleanup* cleanup=CTrapCleanup::New();
00355 if(cleanup!=NULL)
00356 {
00357 TRAPD (error,doExampleL());
00358 __ASSERT_ALWAYS(!error,User::Panic(KTxtExampleCode,error));
00359 }
00360 delete cleanup;
00361 __UHEAP_MARKEND;
00362 return KErrNone;
00363 }