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

Symbian

开发平台:

C/C++

  1. // Copyright (c) 2006 Nokia Corporation.
  2. #include "ActiveBubbleSorter.h"
  3. #include "BubbleSortNotify.h"
  4. #include <e32math.h>
  5. _LIT(KSortDataInputFileName, "C:\private\0515DFCE\sortdata_in.dat");
  6. _LIT(KSortDataOutputFileName, "C:\private\0515DFCE\sortdata_out.dat");
  7. _LIT8(KNumberOutputFormat, "%drn");
  8. // Constructs a CActiveBubbleSorter object
  9. CActiveBubbleSorter* CActiveBubbleSorter::NewL(MBubbleSortNotify& aNotifier)
  10.     {
  11.     CActiveBubbleSorter* self = new (ELeave) CActiveBubbleSorter(aNotifier);
  12.     CleanupStack::PushL(self);
  13.     self->ConstructL();
  14.     CleanupStack::Pop(self);
  15.     return self;
  16.     }
  17. // C++ Constructor
  18. CActiveBubbleSorter::CActiveBubbleSorter(MBubbleSortNotify& aNotifier)
  19. : CActive(CActive::EPriorityIdle),
  20.       iNotifier(aNotifier)
  21.     {
  22.     CActiveScheduler::Add(this);
  23.     }
  24. // C++ Destructor
  25. CActiveBubbleSorter::~CActiveBubbleSorter()
  26.     {
  27.     Cancel();
  28.     iNumbersArray.Close();
  29.     }
  30. // Symbian 2nd phase construction
  31. void CActiveBubbleSorter::ConstructL()
  32.     {
  33.     // Do nothing
  34.     }
  35. // Handles the cleanup necessary if sorting is cancelled
  36. void CActiveBubbleSorter::DoCancel()
  37.     {
  38.     iNumbersArray.Reset();
  39. iNotifier.SortComplete(KErrCancel);
  40.     }
  41. // Handles each step of the sorting procedure
  42. void CActiveBubbleSorter::RunL()
  43.     {
  44.     if (iNumbersArray[iY] > iNumbersArray[iY+1])
  45. {
  46. TInt temp = iNumbersArray[iY+1];
  47. iNumbersArray[iY+1] = iNumbersArray[iY];
  48. iNumbersArray[iY] = temp;
  49. }
  50. iY++;
  51. TInt count = iNumbersArray.Count();
  52. if (iY >= count-1)
  53. {
  54. iY = 0;
  55. if (iX < count)
  56. {
  57. iX++;
  58. }
  59. else
  60. {
  61. // Finished sorting
  62. WriteNumbersToFileL();
  63. iNumbersArray.Reset();
  64. iNotifier.SortComplete(iStatus.Int());
  65. return;
  66. }
  67. }
  68. TRequestStatus* status = &iStatus;
  69. User::RequestComplete(status, KErrNone);
  70. SetActive();
  71.     }
  72. // Called to begin sorting
  73. void CActiveBubbleSorter::StartL()
  74. {
  75. if (IsActive())
  76.      {
  77.      User::Leave(KErrInUse);
  78.      }
  79.     
  80.     iNumbersArray.Reset();
  81. ReadNumbersFromFileL();
  82. iX = 0;
  83. iY = 0;
  84. TRequestStatus* status = &iStatus;
  85. User::RequestComplete(status, KErrNone);
  86. SetActive();
  87. }
  88. // Reads numbers from an input file into an RArray
  89. void CActiveBubbleSorter::ReadNumbersFromFileL()
  90.     {
  91.     // Read contents of the input file into a descriptor
  92.     RFs fs;
  93.     User::LeaveIfError(fs.Connect());
  94.     CleanupClosePushL(fs);
  95.     
  96.     RFile file;
  97.     User::LeaveIfError(file.Open(fs, KSortDataInputFileName, EFileStreamText | EFileRead));
  98.     CleanupClosePushL(fs);
  99.     
  100.     TInt sz = 0;
  101.     User::LeaveIfError(file.Size(sz));
  102.     
  103.     HBufC8* buf = HBufC8::NewLC(sz);
  104.     TPtr8 ptr = buf->Des();
  105.     User::LeaveIfError(file.Read(ptr));
  106.     
  107.     // Extract numbers from the descriptor containing the contents of the input file
  108.     TLex8 lx(ptr);
  109.     TBool finshed = EFalse;
  110.     while (!finshed)
  111.      {
  112.      if (lx.Eos())
  113.      {
  114.      finshed = ETrue;
  115.      }
  116.      else if ((lx.Peek()).IsDigit()) 
  117.      {
  118.      TInt num;
  119.      TInt err = lx.Val(num);
  120.      iNumbersArray.Append(num);
  121.      }
  122.      else
  123.      {
  124.      lx.Inc();
  125.      }
  126.      }
  127.     
  128.     CleanupStack::PopAndDestroy(3); // automatically closes fs and file
  129.     }
  130. // Writes the numbers in the RArray to an output file
  131. void CActiveBubbleSorter::WriteNumbersToFileL()
  132.     {
  133.     RFs fs;
  134.     User::LeaveIfError(fs.Connect());
  135.     CleanupClosePushL(fs);
  136.     
  137.     TInt ret = fs.Delete(KSortDataOutputFileName);
  138.     if (!(ret == KErrNone || ret == KErrNotFound))
  139.      {
  140.      User::Leave(ret);
  141.      } 
  142.     
  143.     RFile file;
  144.     User::LeaveIfError(file.Create(fs, KSortDataOutputFileName, EFileStreamText | EFileWrite));
  145.     CleanupClosePushL(fs);
  146.     
  147.     TBuf8<10> buf;
  148.     
  149.     for (TInt i = 0; i < iNumbersArray.Count(); i++)
  150.      {
  151.      buf.Format(KNumberOutputFormat, iNumbersArray[i]);
  152.      file.Write(buf);
  153.      }
  154.     
  155.     CleanupStack::PopAndDestroy(2); // automatically closes fs and file
  156.     }
  157.     
  158.     
  159. // Called in the event the RunL function leaves
  160. TInt CActiveBubbleSorter::RunError(TInt aError)
  161. {
  162.     iNumbersArray.Reset();
  163. iNotifier.SortComplete(aError);
  164. return KErrNone;
  165. }
  166. // End of file