www.pudn.com > symbianex.rar > HBufC2.cpp
// HBufC2.cpp // // Copyright (c) 2005 Neusoft Institute of Information Technology.Chengdu // All rights reserved. // written by hewei // // version 1.0 // Date: 2005-10-12 // This program demostrate how to use HBufC. // NOTE: the structure of this example is different to standard E32 examples #include// All messages written to this LOCAL_D CConsoleBase* console; // Function prototypes void callExampleL(); void doExampleL(); ////////////////////////////////////////////////////////////////////////////// // // -----> CStudent (definition) // // The class is used by the example code // ////////////////////////////////////////////////////////////////////////////// class CHBufC : public CBase { public: static CHBufC* NewL(const TDesC& aDes,CConsoleBase* aCOnsole); static CHBufC* NewLC(const TDesC& aDes,CConsoleBase* aConsole); public : TInt Length(); //Length; TInt Compare(const TDesC& aDes); //compare two Descriptors TInt FindOut(const TDesC& aDes); //find substring TInt LocateChar(TChar aChar); //lacate char in descriptor TInt HBufCMatch(const TDesC& aDes); //Match two desriptors TPtrC16 MidHbufc(TInt aPos); //Mid TPtrC16 LeftHbufc(TInt aLength); // Left TPtrC16 RightHbufc(TInt aLength); // Right TInt HBufCSize(); // Desvriptor size void otherOperation(); //other operation HBufC* HBufCAppend(const TDesC& aDes); //Append ~CHBufC(); private: CHBufC(CConsoleBase* aConsole); void ConstructL(const TDesC& aDesC); private : HBufC* iBuf; TInt iLength; CConsoleBase* iConsole; }; ////////////////////////////////////////////////////////////////////////////// // // -----> CHBufC (implementation) // ////////////////////////////////////////////////////////////////////////////// CHBufC* CHBufC::NewL(const TDesC& aDes,CConsoleBase* aConsole) { CHBufC* Hbufc=new (ELeave)CHBufC(aConsole); Hbufc->ConstructL(aDes); return Hbufc; } CHBufC* CHBufC::NewLC(const TDesC& aDes,CConsoleBase* aConsole) { CHBufC* Hbufc=CHBufC::NewL(aDes,aConsole); CleanupStack::PushL(Hbufc); return Hbufc; } CHBufC::CHBufC(CConsoleBase* aConsole) { iConsole=aConsole; iLength=0; } void CHBufC::ConstructL(const TDesC& aDes) { iBuf=HBufC::NewLC(aDes.Length()+20); TPtr16 ptr16=iBuf->Des(); ptr16.Copy(aDes); CleanupStack::Pop(); } TInt CHBufC::Length() { iLength=iBuf->Length(); return iLength; } TInt CHBufC::Compare(const TDesC& aDes) { return iBuf->Compare(aDes); } TInt CHBufC::FindOut(const TDesC& aDes) { return iBuf->Find(aDes); } TInt CHBufC::LocateChar(TChar aChar) { return iBuf->Locate(aChar); } TInt CHBufC::HBufCMatch(const TDesC& aDes) { return iBuf->Match(aDes); } TPtrC16 CHBufC::MidHbufc(TInt aPos) { return iBuf->Mid(aPos); } TPtrC16 CHBufC::LeftHbufc(TInt aLength) { return iBuf->Left(aLength); } TPtrC16 CHBufC::RightHbufc(TInt aLength) { return iBuf->Right(aLength); } TInt CHBufC::HBufCSize() { return iBuf->Size(); } void CHBufC::otherOperation() { _LIT(KFORMAT1,"address of HBufC is %x\n"); _LIT(KFORMAT2,"address of data in HBufC is %x\n"); iConsole->Printf(KFORMAT1,iBuf); iConsole->Printf(KFORMAT2,iBuf->Ptr()); } HBufC* CHBufC::HBufCAppend(const TDesC& aDes) { TPtr16 ptr16(iBuf->Des()); ptr16.Append(aDes); return iBuf; } CHBufC::~CHBufC() { delete iBuf; } ////////////////////////////////////////////////////////////////////////////// // // Main function called by E32 // ////////////////////////////////////////////////////////////////////////////// GLDEF_C TInt E32Main() { // Get cleanup stack CTrapCleanup* cleanup=CTrapCleanup::New(); // Some more initialization, then do the example TRAPD(error,doExampleL()); // callExampleL() should never leave. _LIT(KMsgPanicEpoc32ex,"EPOC32EX"); __ASSERT_ALWAYS(!error,User::Panic(KMsgPanicEpoc32ex,error)); // destroy the cleanup stack delete cleanup; // return return 0; } ////////////////////////////////////////////////////////////////////////////// // //doExample() and CallExample() // ////////////////////////////////////////////////////////////////////////////// void doExampleL() { _LIT(KPressAnyKey,"[Press any key...OK]"); //Get Console; _LIT(KMsgExampleCode,"Symbian OS Example Code"); console = Console::NewL(KMsgExampleCode,TSize(KConsFullScreen,KConsFullScreen)); // Put console onto the cleanup stack. CleanupStack::PushL(console); int error; TRAP(error,callExampleL()); //TRAPD(error,callExampleL()); if(error) { _LIT(KERROR,"error occured!\n"); console->Printf(KERROR); } else{ _LIT(KNOLEAVE,"No Leave!\n"); console->Printf(KNOLEAVE); } console->Printf(KPressAnyKey); console->Getch(); // Remove the console object from the cleanupstack // and destroy it. CleanupStack::PopAndDestroy(); } void callExampleL() { _LIT(KSTRING,"hewei"); _LIT(KSTRING2,"heping"); _LIT(KSubString,"we"); _LIT(KLENGTH,"length of HBufC is %d\n"); _LIT(KSIZE,"size of HBufC is %d\n"); _LIT(KINFO1,"bufc is grater than string2.\n"); _LIT(KINFO2,"bufc is equal to string2.\n"); _LIT(KINFO3,"bufc is grater than string2.\n"); _LIT(KFIND,"find!.pos is %d\n"); _LIT(KMATCH,"position of first match is %d\n"); _LIT(KNEWBUF,"New buf is %s\n"); _LIT(KFORMAT,"%s\n"); CHBufC* bufc=CHBufC::NewLC(KSTRING,console); //print length and size of descriptor; console->Printf(KLENGTH,bufc->Length()); console->Printf(KSIZE,bufc->HBufCSize()); //compare two descriptors; if(bufc->Compare(KSTRING2)>0) console->Printf(KINFO1); else if(bufc->Compare(KSTRING2)==0) console->Printf(KINFO2); else console->Printf(KINFO3); //match two descriptors console->Printf(KMATCH,bufc->HBufCMatch(KSTRING2)); // find console->Printf(KFIND,bufc->FindOut(KSubString)); console->Getch(); //leftĦ˘rightĦ˘Mid console->Printf(KFORMAT,bufc->LeftHbufc(1).Ptr()); console->Printf(KFORMAT,bufc->MidHbufc(2).Ptr()); console->Printf(KFORMAT,bufc->RightHbufc(2).Ptr()); //Locate a char TChar ch('e'); console->Printf(KFIND,bufc->LocateChar(ch)); //other operation bufc->otherOperation(); //Append console->Printf(KNEWBUF,bufc->HBufCAppend(KSTRING2)->Ptr()); CleanupStack::PopAndDestroy(); }