DescriptorLab.cpp
上传用户:laixiong
上传日期:2007-03-11
资源大小:2994k
文件大小:8k
源码类别:

Symbian

开发平台:

C/C++

  1. // Copyright: (c) 2006 Nokia Ltd.  All rights reserved.
  2. #include <e32cons.h>
  3. #include "descriptorlab.h"
  4. //////////////////////////////////////////////////////////////////////////////
  5. //
  6. // Main function called by E32
  7. //
  8. //////////////////////////////////////////////////////////////////////////////
  9. GLDEF_C TInt E32Main()
  10.     {
  11. CTrapCleanup* cleanup=CTrapCleanup::New();
  12.     // Catch any Leaves thrown 
  13.     TRAPD(
  14.         error, 
  15.         CDescriptorLab* lab = CDescriptorLab::NewLC();
  16.         lab->StartL();
  17.         CleanupStack::PopAndDestroy();
  18.         );
  19. _LIT(KMsgPanic,"Error in Descriptor Lab: ");
  20. __ASSERT_ALWAYS(!error, User::Panic(KMsgPanic, error));
  21.     delete cleanup;
  22. return 0;
  23.     }
  24. // ---------------------------------------------------------
  25. // CDescriptorLab::NewLC()
  26. // Two-phase constructor
  27. // ---------------------------------------------------------
  28. //
  29. CDescriptorLab* CDescriptorLab::NewLC()
  30.     {
  31.     CDescriptorLab* self = new (ELeave) CDescriptorLab;
  32.     CleanupStack::PushL(self);
  33.     self->ConstructL();
  34.     return self;
  35.     }
  36. // ---------------------------------------------------------
  37. // CDescriptorLab::~CDescriptorLab()
  38. // Destructor
  39. // ---------------------------------------------------------
  40. //
  41. CDescriptorLab::~CDescriptorLab()
  42.     {
  43.     delete iConsole;
  44.     }
  45. // ---------------------------------------------------------
  46. // CDescriptorLab::CDescriptorLab()
  47. // Default C++ constructor
  48. // ---------------------------------------------------------
  49. //
  50. CDescriptorLab::CDescriptorLab()
  51.     {
  52.     }
  53. // ---------------------------------------------------------
  54. // CDescriptorLab::ConstructL()
  55. // Second-phase constructor
  56. // ---------------------------------------------------------
  57. //
  58. void CDescriptorLab::ConstructL()
  59.     {
  60.     _LIT(KLabTitle,"Descriptors Lab");
  61.     iConsole = Console::NewL(KLabTitle, TSize(KConsFullScreen, KConsFullScreen));
  62.     }
  63. // ---------------------------------------------------------
  64. // CDescriptorLab::StartL()
  65. // ---------------------------------------------------------
  66. //
  67. void CDescriptorLab::StartL() 
  68.     {
  69.     UseBufferDes();
  70.     UseHeapDesL();
  71.     // Continue
  72. _LIT(KMsgPressAnyKey,"Press any key to end");
  73. iConsole->Printf(KMsgPressAnyKey);
  74. iConsole->Getch();
  75.     
  76.     }
  77. // ---------------------------------------------------------
  78. // CDescriptorLab::UseBufferDes()
  79. // ---------------------------------------------------------
  80. //
  81. void CDescriptorLab::UseBufferDes()
  82.     {
  83.     // Edit 1: Uncomment the following line to declare a literal string 
  84.     // _LIT(KBufferTitle, "BUF DESCRIPTOR EG:n");
  85.     iConsole->Printf(KBufferTitle);
  86.     const TInt KBufSize = 12;
  87.     
  88.     _LIT(KEnterString, "Enter upto %d chars. Finish with space:n");
  89.     iConsole->Printf(KEnterString, KBufSize);
  90.     // Look at key input
  91.     // Edit 2: Declare a TBuf named buf of max size KBufSize.  
  92.     //          Initialise the length of the buffer to 0
  93.     
  94.     // Edit 3: Uncomment the following 2 lines of code to get a string 
  95.     // of upto KBufSize characters from the user.  A character is then 
  96.     // got from the user and the number of occurances of that character 
  97.     // in the string buf printed to the screen.
  98.     // GetStringFromUser(buf);
  99.     // CharOccurance(buf);
  100.     }
  101. // ---------------------------------------------------------
  102. // CDescriptorLab::UseHeapDesL()
  103. // ---------------------------------------------------------
  104. //
  105. void CDescriptorLab::UseHeapDesL()
  106.     {
  107.     _LIT(KHeapTitle, "nHEAP DESCRIPTOR EG:n");
  108.     iConsole->Printf(KHeapTitle);
  109.     _LIT(KEnterString, "Enter as many chars as you wish.nFinish with space:n");
  110.     iConsole->Printf(KEnterString);
  111.     // Edit 9: Declare a HBufC* called buf that is initialised to the return 
  112.     //          value of a call to HBufC* CDescriptorLab::StringFromUserL()
  113.     // Edit 10: Call CDescriptorLab::CharOccurance() passing the dereferenced 
  114.     //          value of buf
  115.     // Edit 11: delete the memory associated with buf
  116.     }
  117. // ---------------------------------------------------------
  118. // CDescriptorLab::GetStringFromUser(TDes& aBuf)
  119. // ---------------------------------------------------------
  120. //
  121. void CDescriptorLab::GetStringFromUser(TDes& aBuf)
  122.     {
  123.     // Get a character from the user
  124.     TText key = CharFromUser();
  125.     // Edit 4: Declare a TInt maxLen that is initialised  
  126.     // to the maximum length of the descriptor parameter.
  127.     // Hint: use aBuf.MaxLength()
  128.     while (key != EKeySpace &&  aBuf.Length() < maxLen)
  129.         {
  130.         // Edit 5: Append the user entered character onto the end 
  131.         // of the descriptor passed in as a parameter
  132.         // Hint: Use aBuf.Append(key)
  133.         _LIT(KCharEntered, "%c");
  134.         iConsole->Printf(KCharEntered, key);
  135.         key = CharFromUser();
  136.         }
  137.     }
  138. // ---------------------------------------------------------
  139. // CDescriptorLab::StringFromUserL()
  140. // ---------------------------------------------------------
  141. //
  142. HBufC* CDescriptorLab::StringFromUserL()
  143.     {
  144.     const TInt KGranularity = 10;
  145.     // Edit 12: Declare a HBufC* called heapBuf and construct 
  146.     //          via HBufC::NewL(KGranularity) 
  147.     // Edit 13: Declare a TPtr called ptr that is initialised to heapBuf->Des()
  148.     TText key = CharFromUser();
  149.     while (key != EKeySpace)
  150.         {
  151.         if (ptr.Length() == ptr.MaxLength())
  152.             {
  153.             TInt newLen = ptr.MaxLength() + KGranularity;
  154.             // Edit 14: Uncomment the line below to increase the maxlength of 
  155.             //          heapBuf and retain the existing contents and length
  156.             // heapBuf = heapBuf->ReAllocL(newLen);
  157.             // Edit 15: Reset ptr to point to the new location of heapBuf
  158.             //          Hint: call ptr.Set(heapBuf->Des()) rather than
  159.             //          ptr = heapBuf->Des() as the latter will cause a panic
  160.             }
  161.         ptr.Append(key);
  162.         _LIT(KCharEntered, "%c");
  163.         iConsole->Printf(KCharEntered, key);
  164.         key = CharFromUser();
  165.         }
  166.     return heapBuf;
  167.     }
  168. // ---------------------------------------------------------
  169. // CDescriptorLab::CharFromUser()
  170. // ---------------------------------------------------------
  171. //
  172. TText CDescriptorLab::CharFromUser()
  173.     {
  174.     TKeyCode key = iConsole->Getch();
  175.     TText ret = static_cast<TText>(key);
  176.     return ret;
  177.     }
  178. // ---------------------------------------------------------
  179. // CDescriptorLab::CharOccurance(TDesC& aSearchStr)
  180. // ---------------------------------------------------------
  181. //
  182. void CDescriptorLab::CharOccurance(TDesC& aSearchStr)
  183.     {
  184.     _LIT(KEnterChar, "nEnter search char:");
  185.     iConsole->Printf(KEnterChar);
  186.     TText key = CharFromUser();
  187.     _LIT(KCharEntered, "%c");
  188.     iConsole->Printf(KCharEntered, key);
  189.     TInt numChars = 0;
  190.     // Edit 6: Declare a TPtrC called subStr and initialise it to 
  191.     //          the aSearchStr parameter
  192.     // Edit 7: Uncomment the line of code below to find the position of the 
  193.     //          first occurence of the char entered by the user in aSearchString
  194.     // TInt pos = subStr.Locate(key);
  195.     while (KErrNotFound != pos)
  196.         {
  197.         numChars++;
  198.         // Edit 8: Uncomment the line of code below to reset subStr to point to the 
  199.         //          remainder of aSearchStr after the position of the last found char
  200.         // subStr.Set(subStr.Mid(pos + 1));
  201.         pos = subStr.Locate(key);
  202.         }
  203.     _LIT(KNumChars, "nNumber of '%c's inn"%S" = %dn");
  204.     iConsole->Printf(KNumChars, key, &aSearchStr, numChars);
  205.     }