diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/rbufexample_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/rbufexample_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,550 @@ + + + + +TB9.2 Example Applications: examples/Base/BufsAndStrings/rbufexample/rbufexample.cpp Source File + + + + + +

examples/Base/BufsAndStrings/rbufexample/rbufexample.cpp

Go to the documentation of this file.
00001 // Copyright (c) 2008-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 how to use the resizable buffer descriptor class RBuf.
+00015 //
+00016 
+00017 
+00018 
+00022 #include "rbufexample.h"
+00023 
+00024 const TInt KLargeBufSize = 15;
+00025 const TInt KSmallBufSize = 3;
+00026 const TInt KMedBufSize = 7;
+00027 
+00028 _LIT(KFailed, "\n Error occurred");
+00029 _LIT(KPressAKey, "\n\n Press any key to continue the example\n");
+00030 _LIT(KLength,"\n  Length= %d");
+00031 _LIT(KMaxLength,"\n  MaxLength= %d");
+00032 _LIT(KBuffer1,"11111");
+00033 _LIT(KBuffer2,"22222");
+00034 
+00038 CRBufExample::CRBufExample()
+00039         {
+00040         }
+00041 
+00042 void CRBufExample::ConstructL()
+00043         {
+00044         _LIT(KTitle," RBuf Example");
+00045         iConsole = Console::NewL(KTitle, TSize(KConsFullScreen, KConsFullScreen));
+00046         
+00047         _LIT(KWelcome," Welcome to the RBuf example application");
+00048         iConsole->Printf(KWelcome);
+00049         
+00050         _LIT(KPressAKeyMsg, "\n\n Press any key to step through the example\n");
+00051         iConsole->Printf(KPressAKeyMsg );
+00052         iConsole->Getch();
+00053         }
+00054 
+00058 CRBufExample::~CRBufExample()
+00059         {
+00060         delete iConsole;
+00061         }
+00062 
+00067 CRBufExample* CRBufExample::NewL()
+00068         {
+00069         CRBufExample* self=new(ELeave)CRBufExample();
+00070         CleanupStack::PushL(self);
+00071         self->ConstructL();
+00072         CleanupStack::Pop(self);
+00073         return self;
+00074         }
+00075     
+00079 void CRBufExample::CreateRBufL()
+00080         {
+00081         _LIT(KCreate,"\n Creating an RBuf: \n");
+00082 
+00083         iConsole->Printf(KCreate);
+00084         
+00085         RBuf buf;
+00086         
+00087         // Create an empty buffer descriptor
+00088         // The length is zero, the maxlength is 3
+00089         User::LeaveIfError(buf.Create(KSmallBufSize));
+00090         CleanupClosePushL(buf);
+00091         
+00092         // Get the length of the buffer
+00093         TInt length= buf.Length();
+00094         
+00095         // Get the maximum length of the buffer
+00096         TInt maxLength= buf.MaxLength();
+00097         
+00098         // Check that length and maximum length are not equal because it was created using Create()
+00099         if(length != maxLength)
+00100                 {
+00101                 _LIT(KUsingCreate, "\n Using Create() API: ");
+00102                 iConsole->Printf(KUsingCreate);
+00103                 iConsole->Printf(KLength, length);
+00104                 iConsole->Printf(KMaxLength, maxLength);
+00105                 }
+00106         else
+00107                 {
+00108                 iConsole->Printf(KFailed);
+00109                 }       
+00110 
+00111         // Deallocate the memory assigned to the buffer
+00112         CleanupStack::PopAndDestroy(&buf);
+00113         
+00114         // Create buffer descriptor
+00115         // The length is 3, the maxlength is 3
+00116         User::LeaveIfError(buf.CreateMax(KSmallBufSize));
+00117         CleanupClosePushL(buf);
+00118         
+00119         // Get the length of the buffer.
+00120         length= buf.Length();
+00121         
+00122         // Get the maximum length of the buffer.
+00123         maxLength=buf.MaxLength();
+00124         
+00125         // Check that length and maximum length are equal because it was created using CreateMax().
+00126         if(length == maxLength)
+00127                 {
+00128                 _LIT(KCreateInAdvance, "\n Using CreateMax() API: ");
+00129                 iConsole->Printf(KCreateInAdvance);     
+00130                 iConsole->Printf(KLength, length);
+00131                 iConsole->Printf(KMaxLength, maxLength);
+00132                 }
+00133         else
+00134                 {
+00135                 iConsole->Printf(KFailed);
+00136                 }       
+00137         
+00138         // Deallocate the memory assigned to the buffer.
+00139         CleanupStack::PopAndDestroy(&buf);
+00140         } 
+00141         
+00145 void CRBufExample::CreateRBufFromExistingDesL()
+00146         {
+00147         RBuf buf;
+00148         
+00149         // Create a buffer descriptor, initialised with some text
+00150         buf.CreateL(KBuffer1);
+00151         
+00152         _LIT(KCreateFromExistingDes, "\n From an existing descriptor ");
+00153         iConsole->Printf(KCreateFromExistingDes);
+00154 
+00155         // Deallocates the memory assigned to the buffer
+00156         buf.Close();
+00157         } 
+00158         
+00162 void CRBufExample::CreateRBufFromHBufCL()
+00163         {
+00164         // Create a pointer to a heap descriptor
+00165         HBufC* hptr = HBufC::NewL(KBuffer1().Length());
+00166         
+00167         // Assign some data to the heap descriptor.
+00168         *hptr = KBuffer1; 
+00169         
+00170         RBuf buf;
+00171         
+00172         // Assign the HBufC to the buffer. This transfers ownership of the heap descriptor.
+00173         buf.Assign(hptr);
+00174         
+00175         _LIT(KCreateFromHBufC, "\n From HBufC ");
+00176         iConsole->Printf(KCreateFromHBufC);
+00177         
+00178         // Deallocate the memory assigned to the buffer. 
+00179         // There is no need to free the HBufC because Assign() transferred ownership.
+00180         buf.Close(); 
+00181         }
+00182         
+00186 void CRBufExample::CreateRBufFromAnotherRBufL()
+00187         {
+00188         RBuf buf;
+00189         
+00190         // Create a buffer descriptor, initialised with some text
+00191         User::LeaveIfError(buf.Create(KBuffer1));
+00192                 
+00193         RBuf targetBuf;
+00194         
+00195         // Assign one buffer to the other. 
+00196         // Transfers ownership of the source buffer's memory to the target buffer.
+00197         // Note that targetBuf should have no memory allocated to it beforehand
+00198         // otherwise a memory leak will occur.
+00199         targetBuf.Assign(buf);
+00200         
+00201         _LIT(KCreateFromAnotherRBuf, "\n From another RBuf");
+00202         iConsole->Printf(KCreateFromAnotherRBuf);
+00203 
+00204         // Deallocate the memory assigned to the buffer.
+00205         targetBuf.Close();
+00206         }
+00207                 
+00211 void CRBufExample::CreateRBufUsingRReadStreamL()
+00212         {
+00213         // A handle to a file server session. 
+00214         // This is used to create and write to/read from a file.
+00215         RFs fs;
+00216         
+00217         // Connect to the file server.
+00218         User::LeaveIfError(fs.Connect());
+00219         CleanupClosePushL(fs);
+00220         // Create the session path at the process's private path on the system drive.
+00221         User::LeaveIfError(fs.CreatePrivatePath(RFs::GetSystemDrive()));
+00222 
+00223         // Set the session path to point to the process's private path on the system drive.
+00224         User::LeaveIfError(fs.SetSessionToPrivate(RFs::GetSystemDrive()));
+00225         
+00226         // Declare a file stream to write to.
+00227         RFileWriteStream wStream;
+00228         
+00229         _LIT(KFileName,"stream.dat");
+00230         
+00231         // Create a file, associates it with the stream, and prepares the stream for writing.
+00232         User::LeaveIfError(wStream.Replace(fs, KFileName, EFileWrite));
+00233         CleanupClosePushL(wStream);
+00234         
+00235         _LIT(KText, "RBuf Example");
+00236 
+00237         // Write some text to the stream.
+00238         wStream << KText();
+00239         wStream.CommitL();
+00240         CleanupStack::PopAndDestroy(&wStream);
+00241         
+00242         // Declare a file stream to read from.
+00243         RFileReadStream rStream;
+00244         
+00245         // Open the file
+00246         User::LeaveIfError(rStream.Open(fs, KFileName, EFileRead));
+00247         CleanupClosePushL(rStream);
+00248         
+00249         RBuf buf;
+00250         CleanupClosePushL(buf);
+00251         
+00252         // Create the buffer by passing the open stream object to CreateL().
+00253         buf.CreateL(rStream, KLargeBufSize);
+00254         
+00255         _LIT(KCreateUsingRReadStream, "\n Using RReadStream ");
+00256         iConsole->Printf(KCreateUsingRReadStream);
+00257         
+00258         // Deallocate the memory assigned to the buffer, close the stream and close the file server connection
+00259         CleanupStack::PopAndDestroy(&buf);
+00260         CleanupStack::PopAndDestroy(&rStream);
+00261         CleanupStack::PopAndDestroy(&fs);
+00262         }
+00263 
+00267 void CRBufExample::CreateRBufFromAllocatedMemoryL()
+00268         {
+00269         RBuf buf;
+00270         
+00271         // Allocate some memory.
+00272         TUint16* allocatedMemory = static_cast<TUint16*>( User::Alloc( KLargeBufSize * sizeof( TUint16) ) ) ;
+00273 
+00274         // Transfer ownership of the memory to the descriptor.
+00275         buf.Assign(allocatedMemory, KLargeBufSize);
+00276         
+00277         _LIT(KCreateFromAllocatedMemory, "\n By transferring ownership of allocated memory");
+00278         iConsole->Printf(KCreateFromAllocatedMemory);
+00279         
+00280         iConsole->Printf(KPressAKey);
+00281         iConsole->Getch();
+00282         
+00283         // Deallocate the memory assigned to the buffer.
+00284         // There is no need to free memory here because Assign() transferred ownership.
+00285         buf.Close(); 
+00286         }
+00287 
+00291 void CRBufExample::SwapTwoRBufsL()
+00292         {
+00293         _LIT(KSwapAndCopy,"\n Swapping and copying data: ");
+00294         iConsole->Printf(KSwapAndCopy);
+00295         
+00296         RBuf buf1;
+00297         
+00298         // Create a buffer descriptor, initialised with some text
+00299         User::LeaveIfError(buf1.Create(KBuffer1));
+00300         CleanupClosePushL(buf1);
+00301         
+00302         RBuf buf2;
+00303         
+00304         // Create a second buffer descriptor, initialised with some text
+00305         User::LeaveIfError(buf2.Create(KBuffer2));
+00306         CleanupClosePushL(buf2);
+00307         
+00308         _LIT(KBeforeSwapping, "\n Before swapping: ");
+00309         iConsole->Printf(KBeforeSwapping);
+00310         
+00311         // Print out the contents of the 2 descriptors
+00312         _LIT(KPrintFirstdata,"\n  Data present in first descriptor is: ");
+00313         iConsole->Printf(KPrintFirstdata);      
+00314         iConsole->Printf(buf1);
+00315         
+00316         _LIT(KPrintSecondData,"\n  Data present in second descriptor is: ");
+00317         iConsole->Printf(KPrintSecondData);     
+00318         iConsole->Printf(buf2);
+00319         
+00320         // Swap them and print out the new contents
+00321         buf1.Swap(buf2);
+00322         
+00323         _LIT(KAfterSwapping, "\n After swapping: ");
+00324         iConsole->Printf(KAfterSwapping);
+00325         
+00326         iConsole->Printf(KPrintFirstdata);      
+00327         iConsole->Printf(buf1);
+00328         
+00329         iConsole->Printf(KPrintSecondData);     
+00330         iConsole->Printf(buf2);
+00331         
+00332         _LIT(KSwap, "\n Swapping between two RBufs is successful");
+00333         iConsole->Printf(KSwap);
+00334                         
+00335         // Deallocate memory assigned to the 2 buffer descriptors.
+00336         CleanupStack::PopAndDestroy(2); // buf1, buf2
+00337         }
+00338         
+00342 void CRBufExample::CopyDataUsingAssignmentOperatorL()
+00343         {
+00344         RBuf buf1;
+00345         
+00346         // Create a buffer descriptor, initialised with some text
+00347         buf1.Create(KBuffer1);
+00348         CleanupClosePushL(buf1);
+00349 
+00350         RBuf buf2;
+00351         
+00352         // Create a second buffer descriptor, initialised with some text
+00353         User::LeaveIfError(buf2.Create(KBuffer2));
+00354         CleanupClosePushL(buf2);
+00355 
+00356         // Copy data using assignment operator from one to the other. 
+00357         // Target buffer must be long enough, otherwise a panic occurs.
+00358         buf2= buf1;
+00359         
+00360         // Check the value of the buffers .
+00361         if (buf1==buf2)
+00362                 {
+00363                 _LIT(KCopyDataUsingAssignmentOperator,"\n Copying data using assignment operator from descriptor, and RBuf is successful");
+00364                 iConsole->Printf(KCopyDataUsingAssignmentOperator);
+00365                 }
+00366         else
+00367                 {
+00368                 iConsole->Printf(KFailed);      
+00369                 }       
+00370         
+00371         iConsole->Printf(KPressAKey);
+00372     iConsole->Getch();
+00373         
+00374         // Deallocate memory assigned to the 2 buffer descriptors.
+00375         CleanupStack::PopAndDestroy(2); // buf1, buf2
+00376         }
+00377         
+00381 void CRBufExample::ReallocateAndFreeTheMemoryBufferL()
+00382         {
+00383         _LIT(KReAllocAndFree,"\n Realloc and free:");
+00384         iConsole->Printf(KReAllocAndFree);
+00385         
+00386         RBuf buf;
+00387         
+00388         // Create empty buffer descriptor with max length of KSmallBufSize.
+00389         User::LeaveIfError(buf.Create(KSmallBufSize));
+00390         
+00391         // Get the length of the buffer.
+00392         TInt length= buf.Length();
+00393         
+00394         // Get the maximum length of the buffer.
+00395         TInt maxLength= buf.MaxLength();
+00396         
+00397         _LIT(KBeforeReAlloc,"\n Before ReAlloc: ");
+00398         iConsole->Printf(KBeforeReAlloc);
+00399         
+00400         // Print out the length and max length
+00401         iConsole->Printf(KLength, length);
+00402         iConsole->Printf(KMaxLength, maxLength);        
+00403 
+00404         // Re-allocate the buffer descriptor. Length doesnt change but maxlength does.
+00405         User::LeaveIfError(buf.ReAlloc(KMedBufSize));
+00406         
+00407         // Get the length of the buffer.
+00408         length= buf.Length();
+00409         
+00410         // Get the maximum length of the reallocated buffer.
+00411         maxLength= buf.MaxLength();
+00412         
+00413         _LIT(KAfterReAlloc,"\n After ReAlloc: ");
+00414         iConsole->Printf(KAfterReAlloc);
+00415 
+00416         // Print out the length and new max length
+00417         iConsole->Printf(KLength, length);
+00418         iConsole->Printf(KMaxLength, maxLength);        
+00419         
+00420         // Free the memory buffer. It sets the length and maxlength to zero.
+00421         User::LeaveIfError(buf.ReAlloc(0));
+00422         
+00423         // Get the length of the buffer.
+00424         length= buf.Length();
+00425         
+00426         // Get the maximum length of the buffer.
+00427         maxLength= buf.MaxLength();
+00428         
+00429         _LIT(KFreeBuffer,"\n After free: ");
+00430         iConsole->Printf(KFreeBuffer);
+00431         
+00432         iConsole->Printf(KLength, length);
+00433         iConsole->Printf(KMaxLength, maxLength);
+00434         }
+00435         
+00439 void CRBufExample::ReplaceAndModifyTheDataL()
+00440         {
+00441         RBuf buf;
+00442         
+00443         // Create a buffer descriptor, initialised with some text
+00444         User::LeaveIfError(buf.Create(KBuffer1)); 
+00445         CleanupClosePushL(buf);
+00446                         
+00447         _LIT(KReplaceAndModify,"\n Replace and modify: ");
+00448         iConsole->Printf(KReplaceAndModify);
+00449         
+00450         // Print the original data present in the buffer.
+00451         _LIT(KOriginalData,"\n Data present in RBuf is: ");
+00452         iConsole->Printf(KOriginalData);
+00453         iConsole->Printf(buf);
+00454         
+00455         TInt pos= 1;
+00456         
+00457         _LIT(KReplacedMessage,"22");
+00458         
+00459         TInt length= KReplacedMessage().Length();
+00460 
+00461         // Replace a portion of the data in the buffer descriptor.
+00462         buf.Replace(pos,length, KReplacedMessage);
+00463         
+00464         // Print the buffer's new contents.
+00465         _LIT(KReplacedData,"\n After replacement, data held in RBuf is: ");
+00466         iConsole->Printf(KReplacedData);
+00467         iConsole->Printf(buf);
+00468         
+00469         pos=3;
+00470         length=1;
+00471         
+00472         // Delete the replacement text.
+00473     buf.Delete(pos,length);
+00474     
+00475     // Print the buffer's contents again.
+00476     _LIT(KModifiedData,"\n After modification, data held in RBuf is: ");
+00477     iConsole->Printf(KModifiedData);
+00478     iConsole->Printf(buf);
+00479     
+00480     _LIT(KReplaceAndModifyData,"\n Replacing and modifying the data held in RBuf is successful");
+00481     iConsole->Printf(KReplaceAndModifyData);
+00482     
+00483     // Deallocate the memory assigned to the buffer. 
+00484         CleanupStack::PopAndDestroy(&buf);
+00485         }
+00486         
+00490 void CRBufExample::CleanUpRulesL()
+00491         {
+00492         RBuf buf;
+00493         
+00494         // Create a buffer descriptor, initialised with some text
+00495         User::LeaveIfError(buf.Create(KBuffer1));
+00496         
+00497         // To avoid memory leaks use RBuf::CleanupClosePushL() to push a cleanup item for the RBuf onto the cleanup stack.
+00498         // The effect is to cause Close() to be called on the buffer descriptor if a leave occurs, 
+00499         // or when CleanupStack::PopAndDestroy() is called.
+00500         buf.CleanupClosePushL();
+00501         
+00502         // Causes Close() to be called to deallocate the memory assigned to the buffer.
+00503         CleanupStack::PopAndDestroy(&buf);
+00504         
+00505         _LIT(KCleanUp,"\n RBuf cleanup is successful");
+00506         iConsole->Printf(KCleanUp);
+00507         
+00508         _LIT(KExitMsg, "\n\n Press any key to exit the example");
+00509     iConsole->Printf(KExitMsg);
+00510         iConsole->Getch();
+00511         }       
+00512 
+00513 void MainL()
+00514         {
+00515         CRBufExample* app= CRBufExample::NewL();
+00516         CleanupStack::PushL(app);
+00517         
+00518         // Creates empty RBuf.
+00519         app->CreateRBufL();
+00520         
+00521         // Creates RBuf from an existing descriptor.
+00522         app->CreateRBufFromExistingDesL(); 
+00523         
+00524         // Creates RBuf from an HBufC.
+00525         app->CreateRBufFromHBufCL();
+00526         
+00527         // Creates RBuf from another RBuf.
+00528         app->CreateRBufFromAnotherRBufL();
+00529         
+00530         // Create RBuf using RReadStream
+00531         app->CreateRBufUsingRReadStreamL();
+00532         
+00533         // Creates RBuf from allocated memory.
+00534         app->CreateRBufFromAllocatedMemoryL();
+00535                 
+00536         // Swaps two RBufs.
+00537         app->SwapTwoRBufsL();
+00538         
+00539         // Copies data using assignment operator.
+00540         app->CopyDataUsingAssignmentOperatorL();
+00541         
+00542         // Reallocates and frees the memory buffer.
+00543         app->ReallocateAndFreeTheMemoryBufferL();
+00544         
+00545         // Replaces and modifies the data in the descriptor.
+00546         app->ReplaceAndModifyTheDataL();
+00547         
+00548         // Demonstrates cleanup.
+00549         app->CleanUpRulesL();
+00550         
+00551         CleanupStack::PopAndDestroy(app);
+00552         } 
+00553 
+00554 GLDEF_C TInt E32Main()
+00555         {
+00556         __UHEAP_MARK;
+00557 
+00558         CTrapCleanup* cleanup = CTrapCleanup::New();
+00559         if(cleanup == NULL)
+00560                 {
+00561                 return KErrNoMemory;
+00562                 }
+00563         TRAPD(err, MainL());
+00564         delete cleanup;
+00565 
+00566         if(err !=KErrNone)
+00567                 {
+00568                 User::Panic(KFailed, err);
+00569                 }       
+00570                 
+00571         __UHEAP_MARKEND;
+00572         return KErrNone;
+00573         }
+00574   
+00575   
+00576   
+00577   
+00578  
+00579  
+00580  
+
+
Generated by  + +doxygen 1.6.2
+ +