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.        
  134.         _LIT(KCharEntered, "%c");
  135.         iConsole->Printf(KCharEntered, key);
  136.         key = CharFromUser();
  137.         }
  138.     }
  139. // ---------------------------------------------------------
  140. // CDescriptorLab::StringFromUserL()
  141. // ---------------------------------------------------------
  142. //
  143. HBufC* CDescriptorLab::StringFromUserL()
  144.     {
  145.     const TInt KGranularity = 10;
  146.     // Edit 12: Declare a HBufC* called heapBuf and construct 
  147.     //          via HBufC::NewL(KGranularity) 
  148.     // Edit 13: Declare a TPtr called ptr that is initialised to heapBuf->Des()
  149.     TText key = CharFromUser();
  150.     while (key != EKeySpace)
  151.         {
  152.         if (ptr.Length() == ptr.MaxLength())
  153.             {
  154.             TInt newLen = ptr.MaxLength() + KGranularity;
  155.             // Edit 14: Uncomment the line below to increase the maxlength of 
  156.             //          heapBuf and retain the existing contents and length
  157.            // heapBuf = heapBuf->ReAllocL(newLen);
  158.             // Edit 15: Reset ptr to point to the new location of heapBuf
  159.             //          Hint: call ptr.Set(heapBuf->Des()) rather than
  160.             //          ptr = heapBuf->Des() as the latter will cause a panic
  161.             }
  162.         ptr.Append(key);
  163.         _LIT(KCharEntered, "%c");
  164.         iConsole->Printf(KCharEntered, key);
  165.         key = CharFromUser();
  166.         }
  167.     return heapBuf;
  168.     }
  169. // ---------------------------------------------------------
  170. // CDescriptorLab::CharFromUser()
  171. // ---------------------------------------------------------
  172. //
  173. TText CDescriptorLab::CharFromUser()
  174.     {
  175.     TKeyCode key = iConsole->Getch();
  176.     TText ret = static_cast<TText>(key);
  177.     return ret;
  178.     }
  179. // ---------------------------------------------------------
  180. // CDescriptorLab::CharOccurance(TDesC& aSearchStr)
  181. // ---------------------------------------------------------
  182. //
  183. void CDescriptorLab::CharOccurance(TDesC& aSearchStr)
  184.     {
  185.     _LIT(KEnterChar, "nEnter search char:");
  186.     iConsole->Printf(KEnterChar);
  187.     TText key = CharFromUser();
  188.     _LIT(KCharEntered, "%c");
  189.     iConsole->Printf(KCharEntered, key);
  190.     TInt numChars = 0;
  191.     // Edit 6: Declare a TPtrC called subStr and initialise it to 
  192.     //          the aSearchStr parameter
  193.     // Edit 7: Uncomment the line of code below to find the position of the 
  194.     //          first occurence of the char entered by the user in aSearchString
  195.     //TInt pos = subStr.Locate(key);
  196.     while (KErrNotFound != pos)
  197.         {
  198.         numChars++;
  199.         // Edit 8: Uncomment the line of code below to reset subStr to point to the 
  200.         //          remainder of aSearchStr after the position of the last found char
  201.         //subStr.Set(subStr.Mid(pos + 1));
  202.         pos = subStr.Locate(key);
  203.         }
  204.     _LIT(KNumChars, "nNumber of '%c's inn"%S" = %dn");
  205.     iConsole->Printf(KNumChars, key, &aSearchStr, numChars);
  206.     }