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

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()
  10.     {
  11.     CActiveBubbleSorter* self = new (ELeave) CActiveBubbleSorter();
  12.     CleanupStack::PushL(self);
  13.     self->ConstructL();
  14.     CleanupStack::Pop(self);
  15.     return self;
  16.     }
  17. // C++ Constructor
  18. CActiveBubbleSorter::CActiveBubbleSorter()
  19. : CActive(CActive::EPriorityIdle)
  20.     {
  21.     }
  22. // C++ Destructor
  23. CActiveBubbleSorter::~CActiveBubbleSorter()
  24.     {
  25.     }
  26. // Symbian 2nd phase construction
  27. void CActiveBubbleSorter::ConstructL()
  28.     {
  29.     // Do nothing
  30.     }
  31. // Handles the cleanup necessary if sorting is cancelled
  32. void CActiveBubbleSorter::DoCancel()
  33.     {
  34.     }
  35. // Handles each step of the sorting procedure
  36. void CActiveBubbleSorter::RunL()
  37.     {
  38.     }
  39. // Called to begin sorting
  40. void CActiveBubbleSorter::StartL()
  41. {
  42. }
  43. // Reads numbers from an input file into an RArray
  44. void CActiveBubbleSorter::ReadNumbersFromFileL()
  45.     {
  46.     // Read contents of the input file into a descriptor
  47.     RFs fs;
  48.     User::LeaveIfError(fs.Connect());
  49.     CleanupClosePushL(fs);
  50.     
  51.     RFile file;
  52.     User::LeaveIfError(file.Open(fs, KSortDataInputFileName, EFileStreamText | EFileRead));
  53.     CleanupClosePushL(fs);
  54.     
  55.     TInt sz = 0;
  56.     User::LeaveIfError(file.Size(sz));
  57.     
  58.     HBufC8* buf = HBufC8::NewLC(sz);
  59.     TPtr8 ptr = buf->Des();
  60.     User::LeaveIfError(file.Read(ptr));
  61.     
  62.     // Extract numbers from the descriptor containing the contents of the input file
  63.     TLex8 lx(ptr);
  64.     TBool finshed = EFalse;
  65.     while (!finshed)
  66.      {
  67.      if (lx.Eos())
  68.      {
  69.      finshed = ETrue;
  70.      }
  71.      else if ((lx.Peek()).IsDigit()) 
  72.      {
  73.      TInt num;
  74.      TInt err = lx.Val(num);
  75.      iNumbersArray.Append(num);
  76.      }
  77.      else
  78.      {
  79.      lx.Inc();
  80.      }
  81.      }
  82.     
  83.     CleanupStack::PopAndDestroy(3); // automatically closes fs and file
  84.     }
  85. // Writes the numbers in the RArray to an output file
  86. void CActiveBubbleSorter::WriteNumbersToFileL()
  87.     {
  88.     RFs fs;
  89.     User::LeaveIfError(fs.Connect());
  90.     CleanupClosePushL(fs);
  91.     
  92.     TInt ret = fs.Delete(KSortDataOutputFileName);
  93.     if (!(ret == KErrNone || ret == KErrNotFound))
  94.      {
  95.      User::Leave(ret);
  96.      } 
  97.     
  98.     RFile file;
  99.     User::LeaveIfError(file.Create(fs, KSortDataOutputFileName, EFileStreamText | EFileWrite));
  100.     CleanupClosePushL(fs);
  101.     
  102.     TBuf8<10> buf;
  103.     
  104.     for (TInt i = 0; i < iNumbersArray.Count(); i++)
  105.      {
  106.      buf.Format(KNumberOutputFormat, iNumbersArray[i]);
  107.      file.Write(buf);
  108.      }
  109.     
  110.     CleanupStack::PopAndDestroy(2); // automatically closes fs and file
  111.     }
  112.     
  113.     
  114. // Called in the event the RunL function leaves
  115. TInt CActiveBubbleSorter::RunError(TInt aError)
  116. {
  117.     iNumbersArray.Reset();
  118. iNotifier.SortComplete(aError);
  119. return KErrNone;
  120. }
  121. // End of file