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 @@ + + +TB10.1 Example Applications: examples/SysLibs/CentRepExample/centrepexample.cpp Source File + + + + +

examples/SysLibs/CentRepExample/centrepexample.cpp

Go to the documentation of this file.
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         }
+

Generated on Thu Jan 21 10:33:00 2010 for TB10.1 Example Applications by  + +doxygen 1.5.3
+ +