diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/txtfwdop_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/txtfwdop_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,200 @@ + + + + +TB9.2 Example Applications: examples/ForumNokia/S60_3rd_Edition_TextMTM_Example/modules/Client/src/txtfwdop.cpp Source File + + + + + +

examples/ForumNokia/S60_3rd_Edition_TextMTM_Example/modules/Client/src/txtfwdop.cpp

00001 // TXTCPAN.H
+00002 //
+00003 // © 2004 Nokia Corporation.  All rights reserved.
+00004 //
+00005 
+00006 // class include
+00007 #include "txtfwdop.h"
+00008 
+00009 //system include
+00010 #include <txtrich.h>
+00011 
+00012 // user include
+00013 #include "txtcpan.h"
+00014 
+00015 CTxtMtmForwardOperation* CTxtMtmForwardOperation::NewL(TMsvId aSourceMessage, TMsvId aDestinationFolder, CMsvSession& aMsvSession, TRequestStatus& aObserverRequestStatus)
+00016     {
+00017     CTxtMtmForwardOperation* self = new (ELeave) CTxtMtmForwardOperation(aSourceMessage, aDestinationFolder, aMsvSession, aObserverRequestStatus);
+00018     CleanupStack::PushL(self);
+00019     self->ConstructL();
+00020     CleanupStack::Pop(self);
+00021     return self;
+00022     }
+00023 
+00024 CTxtMtmForwardOperation::~CTxtMtmForwardOperation()
+00025     {
+00026     delete iMsvEntry;
+00027     }
+00028 
+00029 const TDesC8& CTxtMtmForwardOperation::ProgressL()
+00030     {
+00031     if(!IsActive())
+00032         User::Leave(KErrNotReady);
+00033     iProgressBuf() = iProgress;
+00034     return iProgressBuf;
+00035     }
+00036 
+00037 const TDesC8& CTxtMtmForwardOperation::FinalProgress()
+00038     {
+00039     __ASSERT_ALWAYS(!IsActive(), User::Panic(KTxtCPanic, ETxtcOperationIsActive));
+00040     iProgressBuf() = iProgress;
+00041     return iProgressBuf;
+00042     }
+00043 
+00044 TInt CTxtMtmForwardOperation::RunError(TInt aError)
+00045     {
+00046     // Remove an entry if one's been created by this method
+00047     if(iProgress.iState > TTxtMtmForwardOpProgress::ECreateMessage)
+00048         iMsvSession.RemoveEntry(iProgress.iFinalMsgId);
+00049 
+00050     // Populate the progress structure with the error code
+00051     iProgress.iError = aError;    
+00052     // Complete the requesting active object with the error code
+00053     TRequestStatus* stat = &iObserverRequestStatus;
+00054     User::RequestComplete(stat, aError);
+00055     // Returning anything other than KErrNone from this method results in a panic
+00056     return KErrNone;
+00057     }
+00058 
+00059 void CTxtMtmForwardOperation::DoCancel()
+00060     {
+00061     if(iProgress.iState > TTxtMtmForwardOpProgress::ECreateMessage)
+00062         iMsvSession.RemoveEntry(iProgress.iFinalMsgId);
+00063 
+00064     TRequestStatus* stat = &iObserverRequestStatus;
+00065     User::RequestComplete(stat, KErrCancel);
+00066     }
+00067 
+00068 void CTxtMtmForwardOperation::RunL()
+00069     {
+00070     User::LeaveIfError(iStatus.Int());
+00071 
+00072     switch(iProgress.iState)
+00073         {        
+00074         case TTxtMtmForwardOpProgress::EInit:
+00075             iProgress.iState = TTxtMtmForwardOpProgress::ECreateMessage;
+00076             CreateMessageL();   // reschedules the active object
+00077             break;
+00078 
+00079         case TTxtMtmForwardOpProgress::ECreateMessage:
+00080             iProgress.iState = TTxtMtmForwardOpProgress::EFormatBodyText;
+00081             FormatBodyTextL();  // reschedules the active object
+00082             break;
+00083 
+00084         case TTxtMtmForwardOpProgress::EFormatBodyText:
+00085             iProgress.iState = TTxtMtmForwardOpProgress::EFinished;
+00086         
+00087         default:
+00088             break;
+00089         }
+00090 
+00091     // When the state machine has been completed, this active object won't
+00092     // be scheduled to complete a request
+00093     if(!IsActive())
+00094         {
+00095         TRequestStatus* stat = &iObserverRequestStatus;
+00096         User::RequestComplete(stat, KErrNone);
+00097         }
+00098     }
+00099 
+00100 void CTxtMtmForwardOperation::CreateMessageL()
+00101     {
+00102     delete iMsvEntry;
+00103     iMsvEntry = NULL;
+00104     iMsvEntry = iMsvSession.GetEntryL(iSourceMessage);
+00105         
+00106     // Get the entry to be forwarded    
+00107         TMsvEntry forwardEntry = iMsvEntry->Entry();    
+00108 
+00109     // Set the context to the destination folder
+00110     iMsvEntry->SetEntryL(iDestinationFolder);
+00111 
+00112     // Create the forwarded index entry
+00113     forwardEntry.iDate.HomeTime();
+00114     iMsvEntry->CreateL(forwardEntry);
+00115     iProgress.iFinalMsgId = forwardEntry.Id();
+00116 
+00117     // schedules the active object to complete so that this class's RunL method
+00118     // will be called by the active scheduler
+00119     SetActive();
+00120     TRequestStatus* stat = &iStatus;
+00121     User::RequestComplete(stat, KErrNone);
+00122     }
+00123 
+00124 void CTxtMtmForwardOperation::FormatBodyTextL()
+00125     {
+00126     CParaFormatLayer* paraLayer = CParaFormatLayer::NewL();
+00127     CleanupStack::PushL(paraLayer);
+00128     CCharFormatLayer* charLayer = CCharFormatLayer::NewL();
+00129     CleanupStack::PushL(charLayer);
+00130     CRichText* body = CRichText::NewL(paraLayer, charLayer);
+00131     CleanupStack::PushL(body);
+00132  
+00133     // Get the message store from the source entry
+00134     iMsvEntry->SetEntryL(iSourceMessage);
+00135     CMsvStore* readStore = iMsvEntry->ReadStoreL();
+00136     CleanupStack::PushL(readStore);
+00137         
+00138     // Get the message store from the newly created destination entry
+00139     iMsvEntry->SetEntryL(iProgress.iFinalMsgId);
+00140     CMsvStore* writeStore = iMsvEntry->EditStoreL();
+00141     CleanupStack::PushL(writeStore);
+00142 
+00143     // Get the body text from the source entry and write it
+00144     // to the destination entry, prepending the forward 
+00145     // prefix
+00146     readStore->RestoreBodyTextL(*body);
+00147     body->InsertL(0, KTxtMtmFwdPrefix);
+00148 
+00149         // this method performs a commit for us
+00150      writeStore->StoreBodyTextL(*body);
+00151  
+00152     CleanupStack::PopAndDestroy(5, paraLayer); 
+00153 
+00154     // schedules the active object to complete so that this class's RunL method
+00155     // will be called by the active scheduler
+00156     SetActive();
+00157     TRequestStatus* stat = &iStatus;
+00158     User::RequestComplete(stat, KErrNone);
+00159 
+00160     }
+00161 
+00162 CTxtMtmForwardOperation::CTxtMtmForwardOperation(TMsvId aSourceMessage, TMsvId aDestinationFolder, CMsvSession& aMsvSession, TRequestStatus& aObserverRequestStatus)
+00163  :  CMsvOperation(aMsvSession, EPriorityStandard, aObserverRequestStatus),
+00164     iSourceMessage(aSourceMessage),
+00165     iDestinationFolder(aDestinationFolder)
+00166     {
+00167     CActiveScheduler::Add(this);
+00168     }
+00169 
+00170 void CTxtMtmForwardOperation::ConstructL()
+00171     {
+00172     // set the requesting active object's request status to pending so that
+00173     // it doesn't complete
+00174     iObserverRequestStatus = KRequestPending;
+00175 
+00176     // schedules the active object to complete so that this class's RunL method
+00177     // will be called by the active scheduler
+00178     SetActive();
+00179     TRequestStatus* stat = &iStatus;
+00180     User::RequestComplete(stat, KErrNone);
+00181 
+00182     // Note that the active object is scheduled here instead of calling CreateMessageL() so that 
+00183     // leaves are handled in the RunError method
+00184     }
+
+
Generated by  + +doxygen 1.6.2
+ +