为什么这块会有内存泄漏???
CMtmsEngine* CMtmsEngine::NewL(MMtmsEngineObserver& aObserver)
{
CMtmsEngine* self = new (ELeave) CMtmsEngine(aObserver);
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(self);
return self;
}
CMtmsEngine::CMtmsEngine(MMtmsEngineObserver& aObserver)
: CActive(0),
iObserver(aObserver),
iIdArray(NULL),
iSmsId(KMsvNullIndexEntryId)
{
m_bReverMsgFlag = EFalse;
iMsvEntry = NULL;
}
void CMtmsEngine::ConstructL()
{
CActiveScheduler::Add(this);
iEntrySelection = new (ELeave) CMsvEntrySelection;
iSession = CMsvSession::OpenAsyncL(*this);
}
void CMtmsEngine::CreateMtmClientL()
{
// Client-side MTM registry.
iClientMtmReg = CClientMtmRegistry::NewL(*iSession);
// Get the SMS Mtm client from the registry
iSmsMtm = static_cast<CSmsClientMtm*>(iClientMtmReg->NewMtmL(KUidMsgTypeSMS));
}
CMtmsEngine::~CMtmsEngine()
{
Cancel();
delete iMsvOper;
delete iEntrySelection;
delete iSmsMtm;
delete iClientMtmReg;
MEMORY_FREE(iMsvEntry );
delete iSession;
if (iIdArray)
{
iIdArray->Reset();
delete iIdArray;
iIdArray = NULL;
}
}
void CMtmsEngine::DoCancel()
{
if (iMsvOper)
{
iMsvOper->Cancel();
delete iMsvOper;
iMsvOper = NULL;
}
}
void CMtmsEngine::RunL()
{
iObserver.HandleMessageSentL(iStatus.Int());
}
TMsvEntry CMtmsEngine::CreateSMSMessageL(const TDesC& aAddress, const TDesC& aMessage)
{
TMsvEntry indexEntry;
indexEntry.SetInPreparation(ETrue);
indexEntry.iMtm = KUidMsgTypeSMS;
indexEntry.iType = KUidMsvMessageEntry;
indexEntry.iServiceId = iSmsMtm->ServiceId();
indexEntry.iDate.UniversalTime();
iSmsMtm->SwitchCurrentEntryL(KMsvDraftEntryId);
iSmsMtm->Entry().CreateL(indexEntry);
iSmsId = indexEntry.Id();
iSmsMtm->SwitchCurrentEntryL(iSmsId);
CSmsHeader& header = iSmsMtm->SmsHeader();
CSmsSettings* sendOptions = CSmsSettings::NewL();
CleanupStack::PushL(sendOptions);
sendOptions->CopyL(iSmsMtm->ServiceSettings()); // restore existing settings
sendOptions->SetDelivery(ESmsDeliveryImmediately); // set to be delivered immediately
sendOptions->SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabetUCS2) ;
header.SetSmsSettingsL(*sendOptions);
CleanupStack::PopAndDestroy(sendOptions);
CRichText& body = iSmsMtm->Body();
body.Reset();
body.InsertL(0, aMessage);
indexEntry.iDescription.Set(aMessage);
CSuperSMSBookEngine* iBookEngine = CSuperSMSBookEngine::NewL();
TBuf<32> iName;
if (iBookEngine->GetNameByMobile(aAddress, iName))
{
indexEntry.iDetails.Set(iName);
iSmsMtm->AddAddresseeL(aAddress, indexEntry.iDetails);
}
else
{
indexEntry.iDetails.Set(aAddress);
iSmsMtm->AddAddresseeL(aAddress);
}
delete iBookEngine;
iSmsMtm->Entry().ChangeL(indexEntry);
iSmsMtm->SaveMessageL();
return indexEntry;
}
TBool CMtmsEngine::ValidateCreatedSMS()
{
TMsvPartList partsToBeChecked = KMsvMessagePartBody | KMsvMessagePartRecipient |
KMsvMessagePartOriginator | KMsvMessagePartDate;
TMsvPartList failedParts = iSmsMtm->ValidateMessage(partsToBeChecked);
if (failedParts == KMsvMessagePartNone)
{
return ETrue;
}
else
{
return EFalse;
}
}
void CMtmsEngine::SendSMSL()
{
iSmsMtm->SwitchCurrentEntryL(iSmsId);
iSmsMtm->LoadMessageL();
CSmsSettings& serviceSettings = iSmsMtm->ServiceSettings();
const TInt numSCAddresses = serviceSettings.ServiceCenterCount();
if (numSCAddresses > 0)
{
TInt scIndex=0;
scIndex = serviceSettings.DefaultServiceCenter();
if ((scIndex < 0) || (scIndex >= numSCAddresses))
{
scIndex = 0; //???
}
TPtrC serviceCentreNumber =
serviceSettings.GetServiceCenter(scIndex).Address();
iSmsMtm->SmsHeader().SetServiceCenterAddressL(serviceCentreNumber);
}
iSmsMtm->SaveMessageL();
TMsvEntry indexEntry = iSmsMtm->Entry().Entry();
indexEntry.SetInPreparation(EFalse);
indexEntry.SetSendingState(KMsvSendStateWaiting);
iSmsMtm->Entry().ChangeL(indexEntry);
Cancel(); // prepare iMsvOper for use
iEntrySelection->Reset();
iEntrySelection->AppendL(iSmsId);
CMsvEntry* entry = iSession->GetEntryL(KMsvDraftEntryId);//====从这块开始有内存泄漏,就算把entry delete掉也有内存泄漏,到底是哪出错了?
TRAPD(err,entry->CopyL(iSmsMtm->Entry().EntryId(), iSmsMtm->ServiceId(), iStatus));
SetActive();
}
//.h文件=====
#ifndef MTMS_ENGINE
#define MTMS_ENGINE
// INCLUDES
#include <e32base.h> // CBase
#include <msvapi.h> // MMsvSessionObserver
#include <badesca.h> // CDesCArrayFlat
#define MEMORY_FREE(a) if(a){delete a; a=NULL;}
// FORWARD DECLARATIONS
class CClientMtmRegistry;
class CSmsClientMtm;
class MMtmsEngineObserver;
class MMtmsEngineObserver
{
public:
virtual void HandleMessageSentL(TInt aError) = 0;
virtual void MessageReceived(const TDesC& addr, const TDesC& aMobile, const TDesC& msg, const TDesC& adate)=0;
};
class CMtmsEngine : public CActive, public MMsvSessionObserver
{
public:
static CMtmsEngine* NewL(MMtmsEngineObserver& aObserver);
~CMtmsEngine();
public:
void DeleteMessageL(TInt aIndex, TMsvId aFolderId);
void DeleteAllMessage(TMsvId aFolderId);
void SendSMSL();
TMsvEntry CreateSMSMessageL(const TDesC& aAddress, const TDesC& aMessage);
TBool ValidateCreatedSMS();
TTime ParseDateTime(const TDesC& aDateTime);
void ParseDateTime(TTime& time, TDes& aDateTime);
TBool WriteMessageToInbox(CDesCArrayFlat*& aAddr, CDesCArrayFlat*& aMobile,
CDesCArrayFlat*& aMessage,CDesCArrayFlat*& aDateTime);
TBool WriteMessageToOutbox(CDesCArrayFlat*& aAddr, CDesCArrayFlat*& aMobile,
CDesCArrayFlat*& aMessage,CDesCArrayFlat*& aDateTime);
void GetFolderSMSMessageInformation( TMsvId aFolderID,CDesCArrayFlat*& aMobile,
CDesCArrayFlat*& aAddress, CDesCArrayFlat*& aTime,
CDesCArrayFlat*& aMessage);
CMtmsEngine(MMtmsEngineObserver& aObserver);
void ConstructL();
void CreateMtmClientL();
private: // from CActive
virtual void DoCancel();
virtual void RunL();
private: // from MMsvSessionObserver
void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3);
private:
CSmsClientMtm* iSmsMtm;
MMtmsEngineObserver& iObserver;
CMsvOperation* iMsvOper;
CMsvEntrySelection* iEntrySelection;
CMsvSession* iSession;
CClientMtmRegistry* iClientMtmReg;
RArray<TMsvId>* iIdArray;
// Id of an SMS message
TMsvId iSmsId;
TMsvId iNewMessageId;
CMsvEntry* iMsvEntry;
TBool m_bReverMsgFlag;
};
#endif // MTMS_ENGINE