00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <e32cons.h>
00017 #include <d32resmanus.h>
00018
00019 _LIT(KTxtExampleCode,"PRM Example");
00020 _LIT(KTxtFailed,"\nFailed with error : %d \n");
00021 _LIT(KTxtPressAnyKey," \nPress any key to continue\n");
00022 _LIT(KEnterResourceIdValue,"\nEnter the resource ID - any number other than zero: ");
00023 _LIT(KTxtStateChange,"\nState of the resource after the change: %d");
00024 _LIT(KPrintNoOfClients,"\nNumber of clients is %d \n");
00025 _LIT(KTxtOptionNotSupported,"\nThis option is not supported\n");
00031 _LIT8(KClient,"resourcemanager");
00032 TClientName gName(KClient);
00033
00034
00035 const TBool gIsKernelClient = EFalse;
00036
00037
00038 TUint gResourceId;
00039
00044 RBusDevResManUs gChannel;
00045
00046 CConsoleBase* gConsole;
00047
00048 TUint gNumClients = 0;
00049 TUint gNumResources = 0;
00050
00056 TInt gReadValue = 0;
00057
00061 TUint GetUserInput()
00062 {
00063 TBufC<50> buf;
00064 TPtr ptr(buf.Des());
00065 TKeyCode ch = gConsole->Getch();
00066 while(ch != EKeyEnter)
00067 {
00068 _LIT(KChar, "%c");
00069 gConsole->Printf(KChar,ch);
00070 if(ch!= EKeyBackspace)
00071 {
00072 ptr.Append(ch);
00073 }
00074 ch=gConsole->Getch();
00075 }
00076 TUint value;
00077
00078 TUint err = TLex(ptr).Val(value, EDecimal);
00079
00080 if(value == 0)
00081 {
00082 gConsole->Printf(KTxtOptionNotSupported);
00083 return (TUint)KErrNotSupported;;
00084 }
00085 else
00086 {
00087 if (err == (TUint)KErrNone)
00088 {
00089 return value;
00090 }
00091 else
00092 {
00093 return (TUint)KErrNotSupported;;
00094 }
00095 }
00096 }
00097
00101 void GetNoOfResources()
00102 {
00103 _LIT(KTxtOption,"\nGet the number of resources \n");
00104 gConsole->Printf(KTxtOption);
00105 TInt err=gChannel.GetNoOfResources(gNumResources);
00106 if(err != KErrNone)
00107 {
00108 gConsole->Printf(KTxtFailed,err);
00109 }
00110 else
00111 {
00112 _LIT(KPrintNoOfResources,"\nNumber of resources = %d \n");
00113 gConsole->Printf(KPrintNoOfResources,gNumResources);
00114 }
00115 }
00116
00121 void GetResourceInfo()
00122 {
00123 _LIT(KTxtOption,"\nGet information about a particular resource...\n");
00124 gConsole->Printf(KTxtOption);
00125
00126 gConsole->Printf(KEnterResourceIdValue);
00127 gResourceId = GetUserInput();
00128 if(gResourceId != (TUint)KErrNotSupported)
00129 {
00130
00131
00132
00133
00134
00135 TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
00136
00137 TResourceInfoBuf *info = new TResourceInfoBuf();
00138 TInt err=gChannel.GetResourceInfo(gResourceId,info);
00139 if(err!= KErrNone)
00140 {
00141 gConsole->Printf(KTxtFailed,err);
00142 }
00143 else
00144 {
00145 name.Copy((*info)().iName);
00146 name.PtrZ();
00147 _LIT(KPrintResourceInfo,"\nResource id = %d \t Resource name = %S \n");
00148 gConsole->Printf(KPrintResourceInfo,gResourceId ,&name);
00149 }
00150 delete info;
00151 }
00152 }
00153
00157 void GetAllResourcesInfoL()
00158 {
00159 _LIT(KTxtOption,"\nGet information about all the resources...\n");
00160 gConsole->Printf(KTxtOption);
00161
00162 GetNoOfResources();
00163
00164
00165
00166
00167 TInt err;
00168 RSimplePointerArray<TResourceInfoBuf> resPtrs(gNumResources);
00169 for(TUint i=0;i<gNumResources;i++)
00170 {
00171 TResourceInfoBuf* info = new TResourceInfoBuf;
00172 if((err=resPtrs.Insert(info, i))!=KErrNone)
00173 {
00174 gConsole->Printf(KTxtFailed,err);
00175 }
00176 }
00177
00178 if((err=gChannel.GetAllResourcesInfo(&resPtrs,gNumResources))!=KErrNone)
00179 {
00180 gConsole->Printf(KTxtFailed,err);
00181 }
00182
00183
00184
00185
00186
00187 TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
00188 for(TUint i=0; i<gNumResources; i++)
00189 {
00190 TResourceInfoBuf* currentInfo = resPtrs[i];
00191 name.Copy((*currentInfo)().iName);
00192 name.PtrZ();
00193 _LIT(KPrintResourceInfo,"Resource id = %d, name = %S \n");
00194 gConsole->Printf(KPrintResourceInfo,(*currentInfo)().iId,&name);
00195 if(i%5 == 0 && i!= 0)
00196 {
00197 gConsole->Printf(KTxtPressAnyKey);
00198 TChar tchar = gConsole->Getch();
00199 }
00200 delete currentInfo;
00201 }
00202 resPtrs.Close();
00203 }
00204
00208 void GetResourceState()
00209 {
00210 _LIT(KTxtOption,"\nGet the state of a particular resource... \n");
00211 gConsole->Printf(KTxtOption);
00212
00213 gConsole->Printf(KEnterResourceIdValue);
00214 gResourceId = GetUserInput();
00215 if(gResourceId != (TUint)KErrNotSupported)
00216 {
00217 TRequestStatus getResourceStatus;
00231 TBool isCached = EFalse;
00232 TInt levelOwnerId = 0;
00233 gChannel.GetResourceState(getResourceStatus,gResourceId,isCached,&gReadValue,&levelOwnerId);
00234 User::WaitForRequest(getResourceStatus);
00235 if(getResourceStatus.Int() != KErrNone)
00236 {
00237 gConsole->Printf(KTxtFailed,getResourceStatus.Int());
00238 }
00239 else
00240 {
00241 _LIT(KPrintResourceState,"\nResource state is %d\n");
00242 gConsole->Printf(KPrintResourceState,gReadValue);
00243 _LIT(KTxtLevelOwnerId,"\nId of the client which owns this resource is %d");
00244 gConsole->Printf(KTxtLevelOwnerId,levelOwnerId);
00245 }
00246 }
00247 }
00248
00252 void GetNumClientsUsingResource()
00253 {
00254 _LIT(KTxtOption,"\nGet the number of clients using a particular resource... \n");
00255 gConsole->Printf(KTxtOption);
00256 GetNoOfResources();
00257
00258 gConsole->Printf(KEnterResourceIdValue);
00259 gResourceId = GetUserInput();
00260 if(gResourceId != (TUint)KErrNotSupported)
00261 {
00262 _LIT(KPrintNoOfClientsUsingResource,"\nNumber of clients using resource : %d\n");
00263 gNumClients = 0;
00264 TInt err=gChannel.GetNumClientsUsingResource(gResourceId, gNumClients, gIsKernelClient);
00265 if((err == KErrArgument && gNumClients == 0) || err == KErrNone)
00266 {
00267 gConsole->Printf(KPrintNoOfClientsUsingResource,gNumClients);
00268 }
00269 else
00270 {
00271 gConsole->Printf(KTxtFailed,err);
00272 }
00273 }
00274 }
00275
00279 void GetNumResourcesInUseByClient()
00280 {
00281 _LIT(KTxtOption,"\nGet the number of resources in use by a particular client \n");
00282 gConsole->Printf(KTxtOption);
00283 _LIT(KTxtClientName,"Name of the client used in this option is resourcemanager ");
00284 gConsole->Printf(KTxtClientName);
00285
00286 TInt err=gChannel.GetNumResourcesInUseByClient(gName, gNumResources, gIsKernelClient);
00287 if(err!=KErrNone)
00288 {
00289 gConsole->Printf(KTxtFailed,err);
00290 }
00291 else
00292 {
00293 _LIT(KPrintNumResourcesInUseByClient,"\nNumber of resources in use by client : %d\n");
00294 gConsole->Printf(KPrintNumResourcesInUseByClient,gNumResources);
00295 }
00296 }
00297
00301 void GetInfoOnResourcesInUseByClientL()
00302 {
00303 _LIT(KTxtOption,"\nGet information about all the resources in use by client... \n");
00304 gConsole->Printf(KTxtOption);
00305
00306
00307 GetNumResourcesInUseByClient();
00308
00309 if(gNumResources!= 0)
00310 {
00311
00312
00313
00314
00315 RSimplePointerArray<TResourceInfoBuf> resPtrs(gNumResources);
00316
00317 for(TUint i=0;i<gNumResources;i++)
00318 {
00319 TResourceInfoBuf *info = new TResourceInfoBuf();
00320 TInt err=resPtrs.Insert(info, i);
00321 if(err!= KErrNone)
00322 {
00323 gConsole->Printf(KTxtFailed,err);
00324 }
00325 }
00326
00327 TInt err=gChannel.GetInfoOnResourcesInUseByClient(gName, gNumResources, &resPtrs);
00328 if(err!= KErrNone)
00329 {
00330 gConsole->Printf(KTxtFailed,err);
00331 }
00332 else
00333 {
00334
00335
00336
00337
00338
00339 TBuf16<MAX_RESOURCE_NAME_LENGTH+1>name;
00340 _LIT(KPrintResourceInfo,"\nResource %d name = %S \n");
00341 for(TUint i=0; i<gNumResources; i++)
00342 {
00343 TResourceInfoBuf* currRes = resPtrs[i];
00344 name.Copy((*currRes)().iName);
00345 name.PtrZ();
00346 gConsole->Printf(KPrintResourceInfo,i,&name);
00347 if(i%5 == 0)
00348 {
00349 gConsole->Printf(KTxtPressAnyKey);
00350 TChar tchar = gConsole->Getch();
00351 }
00352 }
00353 }
00354 resPtrs.Close();
00355 }
00356 }
00357
00361 void GetInfoOnClientsUsingResourceL()
00362 {
00363 _LIT(KTxtOption,"\nGet information about all clients using a particular resource... \n");
00364 gConsole->Printf(KTxtOption);
00365
00366
00367 GetNumClientsUsingResource();
00368
00369 if(gNumClients!= 0)
00370 {
00371
00372 RSimplePointerArray<TClientInfoBuf> resPtrs(gNumClients);
00373 for(TUint i=0;i<gNumClients;i++)
00374 {
00375 TClientInfoBuf *info = new TClientInfoBuf();
00376 TInt err=resPtrs.Insert(info, i);
00377 if(err!= KErrNone)
00378 {
00379 gConsole->Printf(KTxtFailed,err);
00380 }
00381 }
00382 TInt err=gChannel.GetInfoOnClientsUsingResource(gResourceId, gNumClients, &resPtrs, gIsKernelClient);
00383 if(err!= KErrNone)
00384 {
00385 gConsole->Printf(KTxtFailed,err);
00386 }
00387 else
00388 {
00389
00390 _LIT(KPrintClientName,"Client name %d = %S, ID=%d\n");
00391 for(TUint i=0;i<gNumClients;i++)
00392 {
00393 TClientInfoBuf* currInfoBuf = resPtrs[i];
00394 TClientInfo currInfo=(*currInfoBuf)();
00395 TBuf16<sizeof(TClientName)> name;
00396 name.Copy(currInfo.iName);
00397 gConsole->Printf(KPrintClientName,i,&name,currInfo.iId);
00398 }
00399 }
00400 resPtrs.Close();
00401 }
00402 }
00403
00407 void GetNamesOfAllClientsL()
00408 {
00409 _LIT(KTxtOption,"\nGet the names of all clients... \n");
00410
00411 gConsole->Printf(KTxtOption);
00412
00413
00414 TInt err=gChannel.GetNoOfClients(gNumClients, gIsKernelClient);
00415
00416
00417 RSimplePointerArray<TClientName> resPtrs(gNumClients);
00418 if(err != KErrNone)
00419 {
00420 gConsole->Printf(KTxtFailed,err);
00421 }
00422 else
00423 {
00424 gConsole->Printf(KPrintNoOfClients,gNumClients);
00425 for(TUint i=0;i<gNumClients;i++)
00426 {
00427 TClientName *info = new TClientName();
00428 if((err=resPtrs.Insert(info, i))!= KErrNone)
00429 {
00430 gConsole->Printf(KTxtFailed,err);
00431 }
00432 }
00433 }
00434
00435
00436 if((err=gChannel.GetNamesAllClients(&resPtrs, gNumClients, gIsKernelClient)) != KErrNone)
00437 {
00438 gConsole->Printf(KTxtFailed,err);
00439 }
00440 else
00441 {
00442 _LIT(KPrintNamesOfAllClients,"\nNames of all clients\n");
00443 _LIT(KPrintClientName,"Client name : %S\n");
00444 gConsole->Printf(KPrintNamesOfAllClients);
00445 for(TUint i=0;i<gNumClients;i++)
00446 {
00447 TClientName *currName = resPtrs[i];
00448 TBuf16<sizeof(TClientName)> name;
00449 name.Copy(*currName);
00450 gConsole->Printf(KPrintClientName,&name);
00451 delete currName;
00452 }
00453 }
00454 resPtrs.Close();
00455 }
00456
00460 TInt ChangeStateOfResource()
00461 {
00462 _LIT(KTxtOption,"\nChange the state of a particular resource... \n");
00463 gConsole->Printf(KTxtOption);
00464
00465
00466 GetResourceState();
00467 TInt newLevel = gReadValue + 2;
00468 TRequestStatus changeResourceStatus;
00469 gChannel.ChangeResourceState(changeResourceStatus,gResourceId,newLevel);
00470 User::WaitForRequest(changeResourceStatus);
00471 if(changeResourceStatus.Int() != KErrNone)
00472 {
00473 _LIT(KTxtChangeOfStateFailed,"\nChange of state failed with return value %d\n");
00474 gConsole->Printf(KTxtChangeOfStateFailed,changeResourceStatus.Int());
00475 }
00476 else
00477 {
00478 gConsole->Printf(KTxtStateChange,newLevel);
00479 }
00480 return changeResourceStatus.Int();
00481 }
00482
00486 void RequestNotification()
00487 {
00488 _LIT(KTxtOption,"\nRequest resource manager to notify the client about changes to the state of a resource... \n");
00489 gConsole->Printf(KTxtOption);
00490
00491
00492 TInt ret = ChangeStateOfResource();
00493 if(ret == KErrNone)
00494 {
00495 TRequestStatus notificationStatus;
00496
00497 gChannel.RequestNotification(notificationStatus, gResourceId);
00498 TInt newLevel = gReadValue + 2;
00499
00500
00501 TRequestStatus changeResourceStatus;
00502 gChannel.ChangeResourceState(changeResourceStatus,gResourceId,newLevel);
00503 User::WaitForRequest(changeResourceStatus);
00504 gConsole->Printf(KTxtStateChange,newLevel);
00505 User::WaitForRequest(notificationStatus);
00506 if(notificationStatus.Int() != KErrNone)
00507 {
00508 _LIT(KTxtNotificationFailed,"\nRequest Notification for any change in the state of a resource failed with %d");
00509 gConsole->Printf(KTxtNotificationFailed,notificationStatus.Int());
00510 }
00511 else
00512 {
00513
00514 _LIT(KTxtNotificationSuccess,"\nRequest Notification for any change in the state of a resource is successful");
00515 gConsole->Printf(KTxtNotificationSuccess);
00516 }
00517 }
00518 else
00519 {
00520 _LIT(KTxtNotificationNotSupported,"User notification for this resource is not supported");
00521 gConsole->Printf(KTxtNotificationNotSupported);
00522 }
00523 }
00524
00525 void GetPowerResourceInfoL()
00526 {
00527 _LIT(KPrintSubMenu,"GetPowerResourceInfo was chosen\n");
00528 _LIT(KPrintSubMenu1," \nDemonstrate the Get Power Resource APIs\n \
00529 *****************************************************\n \
00530 Option 1:GetNoOfResources\n \
00531 Option 2:GetResourceInfo\n \
00532 Option 3:GetAllResourcesInfo\n \
00533 Option 4:GetResourceState\n ");
00534 _LIT(KPrintSubMenu2, "\t \tOption 5:GetNumClientsUsingResource \n \
00535 Option 6:GetNumResourcesInUseByClient\n \
00536 Option 7:GetInfoOnResourcesInUseByClient\n \
00537 Option 8:GetInfoOnClientsUsingResource\n \
00538 Option 9:GetNamesOfAllClients\n \
00539 ******************************************************\n " );
00540 gConsole->ClearScreen();
00541 gConsole->Printf(KPrintSubMenu);
00542 _LIT(KTxtPressMainESC," \nPress 'ESC' key to go back to the Main Menu\n");
00543 gConsole->Printf(KTxtPressMainESC);
00544 gConsole->Printf(KPrintSubMenu1);
00545 gConsole->Printf(KPrintSubMenu2);
00546 _LIT(KChooseSubMenuOption,"\nSelect an option 1 - 9 : ");
00547 gConsole->Printf(KChooseSubMenuOption);
00548 TChar tchar = gConsole->Getch();
00549 while (tchar != EKeyEscape)
00550 {
00551 switch(tchar)
00552 {
00553 case '1':
00554 {
00555 GetNoOfResources();
00556 break;
00557 }
00558 case '2':
00559 {
00560 GetResourceInfo();
00561 break;
00562 }
00563 case '3':
00564 {
00565 GetAllResourcesInfoL();
00566 break;
00567 }
00568 case '4':
00569 {
00570 GetResourceState();
00571 break;
00572 }
00573 case '5':
00574 {
00575 GetNumClientsUsingResource();
00576 break;
00577 }
00578 case '6':
00579 {
00580 GetNumResourcesInUseByClient();
00581 break;
00582 }
00583 case '7':
00584 {
00585 GetInfoOnResourcesInUseByClientL();
00586 break;
00587 }
00588 case '8':
00589 {
00590 GetInfoOnClientsUsingResourceL();
00591 break;
00592 }
00593 case '9':
00594 {
00595 GetNamesOfAllClientsL();
00596 break;
00597 }
00598 default:
00599 {
00600 if(tchar == EKeyEscape)
00601 {
00602 tchar = 'a';
00603 }
00604 else
00605 {
00606 gConsole->Printf(KTxtOptionNotSupported);
00607 }
00608 break;
00609 }
00610 }
00611 gConsole->Printf(KTxtPressAnyKey);
00612 tchar = gConsole->Getch();
00613 gConsole->Printf(KTxtPressMainESC);
00614 gConsole->Printf(KPrintSubMenu1);
00615 gConsole->Printf(KPrintSubMenu2);
00616 gConsole->Printf(KChooseSubMenuOption);
00617 tchar = gConsole->Getch();
00618 }
00619 }
00620
00621 void DoStartL()
00622 {
00623 TInt err= gChannel.Open(gName);
00624 _LIT(KPrintEnterPRMExample,"Power Resource Manager example\n");
00625 gConsole->Printf(KPrintEnterPRMExample);
00626 if (err!=KErrNone)
00627 {
00628 _LIT(KTxtCommonFailure,"\n Note: The application cannot demonstrate the features without a defined PSL \
00629 (Platform Specific Layer) and the necessary ldd and pdd. \n");
00630 gConsole->Printf(KTxtCommonFailure);
00631 gConsole->Printf(KTxtFailed, err);
00632 _LIT(KTxtPressAnyKeyToCloseApp,"Press any key to close the application ");
00633 gConsole->Printf(KTxtPressAnyKeyToCloseApp);
00634 gConsole->Getch();
00635 }
00636 else
00637 {
00638 const TUint8 KNoOfGetStateRequests = 5;
00639 const TUint8 KNoOfSetStateRequests = 4;
00640 const TUint8 KNoOfNotifyRequests = 7;
00649 err=gChannel.Initialise(KNoOfGetStateRequests,KNoOfSetStateRequests,KNoOfNotifyRequests);
00650 if (err!=KErrNone)
00651 {
00652 gConsole->Printf(KTxtFailed, err);
00653 }
00654 _LIT(KTxtPressAnyKey,"Press any key to continue");
00655 gConsole->Printf(KTxtPressAnyKey);
00656 _LIT(KTxtPressESC," \nPress the 'ESC' key to exit\n");
00657 gConsole->Printf(KTxtPressESC);
00658 _LIT(KPrintMainMenu,"\nOptions for various Power Resource Manager Features \n \
00659 **************************************\n \
00660 1:GetPowerResourceInfo \n \
00661 2:ChangeStateOfResource \n \
00662 3:RequestNotification \n \
00663 **************************************\n \n");
00664 TChar tchar = gConsole->Getch();
00665
00666 while (tchar != EKeyEscape)
00667 {
00668 gConsole->Printf(KPrintMainMenu);
00669 _LIT(KChooseMainMenuOption,"Select option 1 - 3 : ");
00670 gConsole->Printf(KChooseMainMenuOption);
00671 tchar = gConsole->Getch();
00672 switch(tchar)
00673 {
00674 case '1':
00675 {
00676 GetPowerResourceInfoL();
00677 break;
00678 }
00679 case '2':
00680 {
00681 ChangeStateOfResource();
00682 break;
00683 }
00684 case '3':
00685 {
00686 RequestNotification();
00687 break;
00688 }
00689 default:
00690 {
00691 if(tchar == EKeyEscape)
00692 {
00693 _LIT(KPrintExitMenu,"\nExit the Menu\n");
00694 gConsole->Printf(KPrintExitMenu);
00695 }
00696 else
00697 {
00698 gConsole->Printf(KTxtOptionNotSupported);
00699 }
00700 break;
00701 }
00702 }
00703 }
00704 gChannel.Close();
00705 }
00706 }
00707 void callExampleL()
00708 {
00709 gConsole=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
00710 CleanupStack::PushL(gConsole);
00711 DoStartL();
00712 CleanupStack::PopAndDestroy(gConsole);
00713 }
00714
00715 extern TInt E32Main()
00716 {
00717 __UHEAP_MARK;
00718 CTrapCleanup* cleanup=CTrapCleanup::New();
00719 if(cleanup!=NULL)
00720 {
00721 TRAPD (error,callExampleL());
00722 __ASSERT_ALWAYS(!error,User::Panic(KTxtExampleCode,error));
00723 }
00724 delete cleanup;
00725 __UHEAP_MARKEND;
00726 return KErrNone;
00727 }