diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/centrepexample_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/centrepexample_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,453 @@ + +
+00001 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +00002 // All rights reserved. +00003 // This component and the accompanying materials are made available +00004 // under the terms of "Eclipse Public License v1.0" +00005 // which accompanies this distribution, and is available +00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". +00007 // +00008 // Initial Contributors: +00009 // Nokia Corporation - initial contribution. +00010 // +00011 // Contributors: +00012 // +00013 // Description: +00014 // This example program demonstrates the use of the Central Repository. +00015 // The code demonstrates how to open this repository, read its settings, +00016 // change them, perform read-write operations in a transaction, +00017 // find settings, restore default settings, request change notifications +00018 // and delete settings. +00019 // The program requires that before it is run a data file representing +00020 // a repository is present in the private\10202be9 directory on the +00021 // emulator. +00022 // The example defines an example repository in the E80000AD.txt file. +00023 // This text file can be installed directly, but it is recommended +00024 // that repository files are first converted to binary format using the +00025 // CentRepConv tool. +00026 // To do this: +00027 // - Copy E80000AD.txt file to the epoc32\winscw\c location on your kit. +00028 // - Start a command line prompt, cd to epoc32\RELEASE\WINSCW\UDEB, and run the +00029 // command CentRepConv C:\E80000AD.txt +00030 // - This then displays that the file has been converted to the new binary file +00031 // E80000AD.cre. +00032 // - Copy this file to the epoc32\RELEASE\WINSCW\UDEB\Z\private\10202be9 +00033 // directory on your kit. +00034 // +00035 +00036 +00037 +00041 #include "centrepexample.h" +00042 #include <e32cons.h> +00043 #include "asyncwaiter.h" +00044 +00045 _LIT(KTitle, "Central repository example"); +00046 _LIT(KTextPressAKey, "\n\nPress any key to step through the example"); +00047 _LIT(KExit,"\nPress any key to exit the application "); +00048 _LIT(KPressAKey,"\nPress any key to continue \n"); +00049 _LIT(KErr,"\nThe repository file has not been set up. Please see the instructions in centrepexample.cpp for how to do this"); +00050 +00051 _LIT(KOpen,"\n\nOpening the repository and displaying some initial settings"); +00052 _LIT(KChangeSet,"\nChanging some settings in the repository"); +00053 _LIT(KReadSet,"\nReading the changed settings"); +00054 _LIT(KTransact,"\n\nPerforming read and write transactions"); +00055 _LIT(KDelete,"\n\nCreating integer and real number settings and deleting them"); +00056 _LIT(KMove,"\n\nMoving the key to target position"); +00057 _LIT(KReset,"\nResetting settings to default values, and getting notifications that the changes have occurred"); +00058 _LIT(KFind,"\nFinding settings for simple and structured data"); +00059 _LIT(KNonExisting,"\n\nValue of new setting is %d"); +00060 _LIT(KInt,"\nValue of setting with key x01 is %d"); +00061 _LIT(KReal,"\nValue of setting with key x02 is %f"); +00062 _LIT(KInteg,"\nValue of setting with key x06 is %d \n"); +00063 _LIT(KIntBefore,"\nValue of setting with key x01 before reset is %d"); +00064 _LIT(KIntAfter,"\nValue of setting with key x01 after reset is %d"); +00065 _LIT(KIdsFound,"\nFound %d settings"); +00066 _LIT(KStringName,"Another string"); +00067 _LIT(KString1_UpdatedValue, "Value of setting with key x05 is %s"); +00068 +00069 static const TUid KUidRepository = { 0xE80000AD }; +00070 const TUint32 KNonExistentSetting = 0x10; +00071 const TUint32 KInt1 = 0x01; +00072 const TUint32 KInt3 = 0x06; +00073 const TUint32 KReal1 = 0x02; +00074 const TUint32 KString1 = 0x05; +00075 const TInt KInt1_InitialValue = 1; +00076 const TInt KInt1_UpdatedValue = 73; +00077 const TReal KReal1_InitialValue = 14.91; +00078 const TReal KReal1_UpdatedValue = 72.8; +00079 const TUint32 KMoveTarget = 0x30; +00080 +00086 CCentRepExample* CCentRepExample::NewLC() +00087 { +00088 CCentRepExample* rep = new(ELeave) CCentRepExample(); +00089 CleanupStack::PushL(rep); +00090 rep->ConstructL(); +00091 return rep; +00092 } +00093 +00097 CCentRepExample::CCentRepExample() +00098 { +00099 } +00100 +00101 void CCentRepExample::ConstructL() +00102 { +00103 +00104 iConsole = Console::NewL(KTitle,TSize(KConsFullScreen,KConsFullScreen)); +00105 iConsole->Printf ( KTextPressAKey ); +00106 iConsole->Getch (); +00107 } +00108 +00112 CCentRepExample::~CCentRepExample() +00113 { +00114 iConsole->Printf(KExit); +00115 iConsole->Getch(); +00116 +00117 delete iConsole; +00118 delete iRepository; +00119 } +00120 +00121 +00128 void CCentRepExample::ResetL() +00129 { +00130 CRepository* repository = NULL; +00131 TRAPD(err, repository = CRepository::NewL(KUidRepository);); +00132 CleanupStack::PushL(repository); +00133 // test if an error has occurred because the repository +00134 // has not been set up: see instructions at the top +00135 // of this file if this occurs. +00136 if (err == KErrNotFound) +00137 { +00138 iConsole->Printf(KErr); +00139 } +00140 User::LeaveIfError(err); +00141 User::LeaveIfError(err = repository->Reset()); +00142 CleanupStack::PopAndDestroy(repository); +00143 } +00144 +00151 void CCentRepExample::OpenRepositoryL() +00152 { +00153 TInt i, k; +00154 TReal j; +00155 TBuf<50> tooShort; +00156 iConsole->Printf(KOpen); +00157 iRepository = CRepository::NewL(KUidRepository); +00158 +00159 User::LeaveIfError(iRepository->Get(KInt1, i)); +00160 iConsole->Printf(KInt,i); +00161 +00162 User::LeaveIfError(iRepository->Get(KReal1, j)); +00163 iConsole->Printf(KReal,j); +00164 +00165 User::LeaveIfError(iRepository->Get(KInt3, k)); +00166 iConsole->Printf(KInteg,k); +00167 +00168 User::LeaveIfError(iRepository->Get(KString1, tooShort)); +00169 iConsole->Printf(KString1_UpdatedValue,tooShort.PtrZ()); +00170 +00171 iConsole->Printf(KPressAKey); +00172 iConsole->Getch(); +00173 +00174 } +00175 +00181 void CCentRepExample::ChangeSettingsL() +00182 { +00183 iConsole->Printf(KChangeSet); +00184 User::LeaveIfError(iRepository->Set(KNonExistentSetting, 10)); +00185 +00186 User::LeaveIfError(iRepository->Set(KInt1, KInt1_UpdatedValue)); +00187 +00188 User::LeaveIfError(iRepository->Set(KReal1, KReal1_InitialValue)); +00189 +00190 User::LeaveIfError(iRepository->Set(KInt3, KInt1_InitialValue)); +00191 +00192 User::LeaveIfError(iRepository->Set(KString1, KStringName)); +00193 +00194 } +00195 +00201 void CCentRepExample::ReadSettingsL() +00202 { +00203 TInt m, i, k; +00204 TReal j; +00205 TBuf<50> tooShort; +00206 iConsole->Printf(KReadSet); +00207 +00208 User::LeaveIfError(iRepository->Get(KNonExistentSetting, m)); +00209 +00210 iConsole->Printf(KNonExisting,m); +00211 +00212 User::LeaveIfError(iRepository->Get(KInt1, i)); +00213 +00214 iConsole->Printf(KInt,i); +00215 +00216 User::LeaveIfError(iRepository->Get(KReal1, j)); +00217 +00218 iConsole->Printf(KReal,j); +00219 +00220 User::LeaveIfError(iRepository->Get(KInt3, k)); +00221 +00222 iConsole->Printf(KInteg,k); +00223 +00224 User::LeaveIfError(iRepository->Get(KString1, tooShort)); +00225 +00226 iConsole->Printf(KString1_UpdatedValue,tooShort.PtrZ()); +00227 +00228 iConsole->Printf(KPressAKey); +00229 iConsole->Getch(); +00230 +00231 } +00232 +00240 void CCentRepExample::FindSettingsL() +00241 { +00242 RArray<TUint32> foundIds; +00243 +00244 // Finds all the settings that exist and match the specification +00245 //given by partialKey and mask. +00246 iConsole->Printf(KFind); +00247 +00248 // These values will instruct Find to return the all settings keys which +00249 //match the pattern 000001XXh where X indicates a ‘don’t care’ state. +00250 +00251 User::LeaveIfError(iRepository->FindL(0x100 /*partialKey*/, 0xF00/*mask*/, foundIds)); +00252 +00253 iConsole->Printf(KIdsFound,foundIds.Count()); +00254 foundIds.Reset(); +00255 +00256 // Finds all the settings that contain a given integer and +00257 //match the specification given by partialKey and mask. +00258 +00259 User::LeaveIfError(iRepository->FindEqL(0x00/*partialKey*/, 0x00/*mask*/,KInt1_InitialValue /*integer value*/, foundIds)); +00260 +00261 iConsole->Printf(KIdsFound,foundIds.Count()); +00262 foundIds.Reset(); +00263 +00264 // Finds all the settings that contain the given floating point value +00265 //and match the specification given by partialKey and mask. +00266 User::LeaveIfError(iRepository->FindEqL(0x00, 0x00,KReal1_InitialValue/*Real value*/, foundIds)); +00267 +00268 iConsole->Printf(KIdsFound,foundIds.Count()); +00269 foundIds.Reset(); +00270 +00271 // Finds all the settings that contain a given string value +00272 //and match the specification given by partialKey and mask. +00273 +00274 User::LeaveIfError(iRepository->FindEqL(0x00, 0x00, KStringName/*string*/, foundIds)); +00275 +00276 iConsole->Printf(KIdsFound,foundIds.Count()); +00277 foundIds.Reset(); +00278 +00279 // Finds all the settings that match the specification given +00280 // by partialKey and mask, but are either not integer values or +00281 //do not have the given value. +00282 +00283 User::LeaveIfError(iRepository->FindNeqL(0x00/*partial key*/, 0x00/*mask*/, KInt1_UpdatedValue, foundIds)); +00284 +00285 iConsole->Printf(KIdsFound,foundIds.Count()); +00286 foundIds.Reset(); +00287 +00288 // Finds all the settings that match the specification given by +00289 //partialKey and mask, but are either not floating point values +00290 //or do not have the given value. +00291 +00292 User::LeaveIfError(iRepository->FindNeqL(0x100, 0x0F0, KReal1_UpdatedValue, foundIds)); +00293 +00294 iConsole->Printf(KIdsFound,foundIds.Count()); +00295 foundIds.Reset(); +00296 +00297 } +00303 void CCentRepExample::ResetAndNotifyL() +00304 { +00305 TInt x; +00306 +00307 // Ensure KInt1 is set to a different value to its initial value +00308 // First change to setting should cause notification +00309 iConsole->Printf(KReset); +00310 +00311 User::LeaveIfError(iRepository->Set(KInt1, KInt1_InitialValue+10)); +00312 +00313 +00314 User::LeaveIfError(iRepository->Get(KInt1, x)); +00315 +00316 iConsole->Printf(KIntBefore, x); +00317 +00318 CAsyncWaiter* waiter = CAsyncWaiter::NewL(); +00319 CleanupStack::PushL(waiter); +00320 +00321 User::LeaveIfError(iRepository->NotifyRequest(KInt1, waiter->iStatus)); +00322 +00323 // Get a notification on a reset as well +00324 +00325 User::LeaveIfError(iRepository->Reset(KInt1)); +00326 +00327 // Check we got a notification +00328 waiter->StartAndWait(); +00329 User::LeaveIfError(waiter->Result()); +00330 +00331 // Check KInt1 now has the right value +00332 User::LeaveIfError(iRepository->Get(KInt1, x)); +00333 iConsole->Printf(KIntAfter, x); +00334 +00335 CleanupStack::PopAndDestroy(waiter); +00336 } +00337 +00342 void CCentRepExample::MoveSettingsL() +00343 { +00344 TUint32 keyInfo; +00345 +00346 iConsole->Printf(KMove); +00347 iConsole->Printf(KPressAKey); +00348 iConsole->Getch(); +00349 // Move the key to the target position +00350 User::LeaveIfError(iRepository->Move(KInt3, KMoveTarget, 0xFFFFFFFF, +00351 keyInfo)); +00352 } +00353 +00358 void CCentRepExample::TransactionFuncL() +00359 { +00360 TUint32 keyId; +00361 TInt intVal; +00362 +00363 iConsole->Printf(KTransact); +00364 +00365 // Attempts to start a read write transaction. +00366 User::LeaveIfError(iRepository->StartTransaction(CRepository::EReadWriteTransaction)); +00367 +00368 // Calls FailTransaction if activated by a Leave or PopAndDestroy. +00369 iRepository->CleanupCancelTransactionPushL(); +00370 +00371 // Creating the variable KNewInt at 0x16 +00372 const TUint32 KNewInt = 0x16; +00373 const TInt KIntValue = 1201; +00374 intVal = KIntValue +33; +00375 +00376 // Perform some write operations. +00377 // Creating KNewInt with the value KIntValue. +00378 User::LeaveIfError(iRepository->Create(KNewInt, KIntValue)); +00379 // Setting KNewInt to the new value +00380 User::LeaveIfError(iRepository->Set(KNewInt,intVal)); +00381 +00382 // Persistence of all values read and written during the transaction +00383 // is only guaranteed after a successful return from CommitTransaction. +00384 User::LeaveIfError(iRepository->CommitTransaction(keyId)); +00385 +00386 // Read the data written. +00387 User::LeaveIfError(iRepository->Get(KNewInt, intVal)); +00388 +00389 // Deleting the data after reading it. +00390 User::LeaveIfError(iRepository->Delete(KNewInt)); +00391 CleanupStack::Pop(); +00392 +00393 CRepository* repository1; +00394 User::LeaveIfNull(repository1 = CRepository::NewLC(KUidRepository)); +00395 +00396 // Begin read transaction for repository1 +00397 User::LeaveIfError(repository1->StartTransaction(CRepository::EReadTransaction)); +00398 +00399 CRepository* repository2; +00400 User::LeaveIfNull(repository2 = CRepository::NewLC(KUidRepository)); +00401 +00402 // Should be able to start another read transaction (Multiple read transactions) +00403 User::LeaveIfError(repository2->StartTransaction(CRepository::EReadTransaction)); +00404 +00405 // Perform some gets using the open transactions and repositories +00406 // Read operation +00407 User::LeaveIfError(repository1->Get(KInt1, intVal)); +00408 // Ensure transaction cancelled if following code Leaves: +00409 repository1->CleanupCancelTransactionPushL(); +00410 +00411 // Commit the transaction +00412 User::LeaveIfError(repository1->CommitTransaction(keyId)); +00413 CleanupStack::Pop(); +00414 +00415 // Calls FailTransaction if activated by a Leave or PopAndDestroy. +00416 repository2->CleanupCancelTransactionPushL(); +00417 User::LeaveIfError(repository2->Get(KInt1, intVal)); +00418 User::LeaveIfError(repository2->CommitTransaction(keyId)); +00419 +00420 // Pop the transaction +00421 CleanupStack::Pop(); +00422 CleanupStack::PopAndDestroy(2,repository1); +00423 +00424 +00425 } +00426 +00431 void CCentRepExample::DeleteL() +00432 { +00433 TInt x; +00434 TReal y; +00435 +00436 iConsole->Printf(KDelete); +00437 +00438 User::LeaveIfError(iRepository->Get(KInt1_InitialValue, x)); +00439 User::LeaveIfError(iRepository->Get(KReal1, y)); +00440 User::LeaveIfError(iRepository->Delete(KInt1_InitialValue)); +00441 User::LeaveIfError(iRepository->Delete(KMoveTarget)); +00442 User::LeaveIfError(iRepository->Delete(KReal1)); +00443 } +00444 +00445 LOCAL_C void MainL() +00446 { +00447 // Create an Active Scheduler to handle asychronous calls +00448 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; +00449 CleanupStack::PushL(scheduler); +00450 CActiveScheduler::Install( scheduler ); +00451 CCentRepExample * app = CCentRepExample ::NewLC(); +00452 +00453 // Reset the repository +00454 app->ResetL(); +00455 +00456 // Open the repository +00457 app->OpenRepositoryL(); +00458 +00459 // Change the existing settings +00460 app->ChangeSettingsL(); +00461 +00462 // Read the changed settings +00463 app->ReadSettingsL(); +00464 +00465 // Find the settings using FindL, FindEqL and FindNeqL +00466 app->FindSettingsL(); +00467 +00468 // Move settings +00469 app->MoveSettingsL(); +00470 +00471 // Reset settings to default values and get notification +00472 app->ResetAndNotifyL(); +00473 +00474 // Perform multiple operations in a transaction +00475 app->TransactionFuncL(); +00476 +00477 // Delete settings +00478 app->DeleteL(); +00479 +00480 CleanupStack::PopAndDestroy(2); //app, scheduler +00481 +00482 } +00483 +00484 GLDEF_C TInt E32Main() +00485 { +00486 __UHEAP_MARK; +00487 CTrapCleanup* cleanup = CTrapCleanup::New(); +00488 if(cleanup == NULL) +00489 { +00490 return KErrNoMemory; +00491 } +00492 TRAPD(err, MainL()); +00493 if(err != KErrNone) +00494 { +00495 User::Panic(_L("Failed to complete"),err); +00496 } +00497 +00498 delete cleanup; +00499 __UHEAP_MARKEND; +00500 return KErrNone; +00501 } +