00001 // 00002 // © 2004 Nokia Corporation. All rights reserved. 00003 // 00004 00005 // class include 00006 #include "txtmtmcreateop.h" 00007 00008 //system include 00009 #include <apparc.h> // CApaApplication 00010 #include <msvids.h> // KMsvLocalServiceIndexEntryId 00011 #include <msvuids.h> // KUidMsvMessageEntry 00012 #include <ecom.h> 00013 #include <txtrich.h> 00014 // user include 00015 #include "txtupan.h" 00016 #include "txtu.h" 00017 00018 #include "TXTCMDS.HRH" 00019 00020 00021 00022 // constants 00023 _LIT(KTxtGeneratedFilename, "C:\\data\\TextMTMService\\sentmsgbody.txt"); // generated filename base 00024 _LIT(KDefaultMtmName, "My TextMTM"); 00025 CTxtMtmCreateOperation* CTxtMtmCreateOperation::NewL(const TMsvEntry& aEntry, CMsvEntry& aParent, CMsvSession& aMsvSession, CBaseMtmUi& aMtmUi, TRequestStatus& aObserverRequestStatus) 00026 { 00027 CTxtMtmCreateOperation* self = new (ELeave) CTxtMtmCreateOperation(aEntry, aParent, aMsvSession, aMtmUi, aObserverRequestStatus); 00028 CleanupStack::PushL(self); 00029 self->ConstructL(); 00030 CleanupStack::Pop(self); 00031 return self; 00032 } 00033 00034 CTxtMtmCreateOperation::CTxtMtmCreateOperation(const TMsvEntry& aEntry, CMsvEntry& aParent, CMsvSession& aMsvSession, CBaseMtmUi& aMtmUi, TRequestStatus& aObserverRequestStatus) 00035 : CMsvOperation(aMsvSession, EPriorityStandard, aObserverRequestStatus), 00036 iEntry(aEntry), 00037 iParent(aParent), 00038 iMtmUi(aMtmUi) 00039 { 00040 CActiveScheduler::Add(this); 00041 } 00042 00043 void CTxtMtmCreateOperation::ConstructL() 00044 { 00045 // set the obeserver request status as pending so that the observer 00046 // won't complete 00047 iObserverRequestStatus = KRequestPending; 00048 00049 Schedule(KErrNone); 00050 } 00051 00052 CTxtMtmCreateOperation::~CTxtMtmCreateOperation() 00053 { 00054 Cancel(); 00055 delete iOp; 00056 } 00057 00058 const TDesC8& CTxtMtmCreateOperation::ProgressL() 00059 { 00060 if(!IsActive()) 00061 User::Leave(KErrNotReady); 00062 iProgressBuf() = iProgress; 00063 return iProgressBuf; 00064 } 00065 00066 const TDesC8& CTxtMtmCreateOperation::FinalProgress() 00067 { 00068 __ASSERT_ALWAYS(!IsActive(), User::Panic(KTEXTMTMUIPanic, ETextMtmUiOperationActive)); 00069 iProgressBuf() = iProgress; 00070 return iProgressBuf; 00071 } 00072 00073 TInt CTxtMtmCreateOperation::RunError(TInt aError) 00074 { 00075 if(iProgress.iState > TTxtMtmCreateOpProgress::ECreateMessage) 00076 iMsvSession.RemoveEntry(iProgress.iFinalMsgId); 00077 00078 // Populate the progress structure with the error code 00079 iProgress.iError = aError; 00080 // Complete the requesting active object with the error code 00081 TRequestStatus* stat = &iObserverRequestStatus; 00082 User::RequestComplete(stat, aError); 00083 // Returning anything other than KErrNone from this method results in a panic 00084 return KErrNone; 00085 } 00086 00087 void CTxtMtmCreateOperation::DoCancel() 00088 { 00089 if(iOp) 00090 iOp->Cancel(); 00091 00092 if(iProgress.iState > TTxtMtmCreateOpProgress::ECreateMessage) 00093 iMsvSession.RemoveEntry(iProgress.iFinalMsgId); 00094 00095 TRequestStatus* stat = &iObserverRequestStatus; 00096 User::RequestComplete(stat, KErrCancel); 00097 } 00098 00099 void CTxtMtmCreateOperation::RunL() 00100 { 00101 User::LeaveIfError(iStatus.Int()); 00102 00103 switch(iProgress.iState) 00104 { 00105 case TTxtMtmCreateOpProgress::EInit: 00106 iProgress.iState = TTxtMtmCreateOpProgress::ECreateMessage; 00107 CreateMessageL(); // reschedules the active object 00108 break; 00109 00110 case TTxtMtmCreateOpProgress::ECreateMessage: 00111 iProgress.iState = TTxtMtmCreateOpProgress::EEditMessage; 00112 ScheduleEditL(); // reschedules the active object 00113 break; 00114 00115 case TTxtMtmCreateOpProgress::EEditMessage: 00116 iProgress.iState = TTxtMtmCreateOpProgress::EFinished; 00117 00118 00119 default: 00120 break; 00121 } 00122 00123 // When the state machine has been completed, this active object won't 00124 // be scheduled to complete a request 00125 if(!IsActive()) 00126 { 00127 TRequestStatus* stat = &iObserverRequestStatus; 00128 User::RequestComplete(stat, KErrNone); 00129 } 00130 } 00131 00132 00133 void CTxtMtmCreateOperation::CreateMessageL() 00134 { 00135 00136 00137 TFileName filename = KTxtGeneratedFilename(); 00138 if( iEntry.iType == KUidMsvMessageEntry) 00139 { 00140 _LIT(KFilename,"message.txt"); 00141 iEntry.iDescription.Set(KFilename); 00142 iEntry.iDate.UniversalTime(); 00143 iEntry.iServiceId=KMsvLocalServiceIndexEntryId; 00144 iParent.SetEntryL(KMsvDraftEntryId); 00145 iParent.CreateL(iEntry); 00146 iProgress.iFinalMsgId = iEntry.Id(); 00147 } 00148 else 00149 { 00150 if (iEntry.iType ==KUidMsvServiceEntry) 00151 { 00152 iEntry.iDetails.Set(KDefaultMtmName); 00153 iParent.SetEntryL(KMsvRootIndexEntryId); 00154 iParent.CreateL(iEntry); 00155 iProgress.iFinalMsgId = iEntry.Id(); 00156 00157 // Set the root folder setting 00158 _LIT(KRoot, "C:\\data\\TextMTMService\\"); 00159 TMTMTxtSettings set; 00160 CMTMTxtSettings* settings = CMTMTxtSettings::NewL(); 00161 set.SetRootFolder(KRoot); 00162 CleanupStack::PushL(settings); 00163 settings->SaveSettingsL(iEntry.Id(), set); 00164 CleanupStack::PopAndDestroy(settings); 00165 } 00166 } 00167 Schedule(KErrNone); 00168 } 00169 00170 void CTxtMtmCreateOperation::ScheduleEditL() 00171 { 00172 iMtmUi.BaseMtm().SwitchCurrentEntryL(iProgress.iFinalMsgId); 00173 00174 delete iOp; 00175 iOp = NULL; 00176 00177 // The Edit method returns a CMsvOperation that will complete this class's request status 00178 // when editing is complete, resulting in this class's RunL method being called by the active scheduler 00179 SetActive(); 00180 00181 iOp = iMtmUi.EditL(iStatus); 00182 } 00183 00184 void CTxtMtmCreateOperation::Schedule(TInt aError) 00185 { 00186 // Schedules the transaction so that the RunL method of this active 00187 // object will get called again 00188 SetActive(); 00189 TRequestStatus* stat = &iStatus; 00190 User::RequestComplete(stat, aError); 00191 } 00192
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.