diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/msgutils/unidatamodel/unismsdataplugin/src/unismsdataplugin_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgutils/unidatamodel/unismsdataplugin/src/unismsdataplugin_p.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +//SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include + +#include +#include "debugtraces.h" + +#include + +#include +//USER INCLUDES +#include "s60qconversions.h" +#include "convergedmessageaddress.h" +#include "convergedmessage.h" + +#include "unismsdataplugin_p.h" +#include "sessioneventhandler.h" + +#define KSmsMtmUidValue 0x1000102C +const TUid KSmsMtmUid = +{KSmsMtmUidValue}; +_LIT(KUnixEpoch, "19700000:000000.000000"); + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::~UniSMSDataPluginPrivate +// @see header +//--------------------------------------------------------------- +UniSMSDataPluginPrivate::~UniSMSDataPluginPrivate() +{ + q_ptr = NULL; + delete iSmsClient; + delete iMtmReg; + delete iSessionHandler; + delete iMSession; +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::UniSMSDataPluginPrivate +// @see header +//--------------------------------------------------------------- +UniSMSDataPluginPrivate::UniSMSDataPluginPrivate(UniSMSDataPlugin* plugin) : + iMSession(NULL), + iMtmReg(NULL), + iSmsClient(NULL), + q_ptr(plugin), + iSessionHandler(NULL) +{ + iSessionHandler = new SessionEventHandler(); + iMSession = CMsvSession::OpenSyncL(*iSessionHandler); + iSessionHandler->start(); + done = EFalse; +} + +void UniSMSDataPluginPrivate::initL() +{ + + iMtmReg = CClientMtmRegistry::NewL(*iMSession); + TMsvSelectionOrdering ordering; + + CMsvEntry* root = CMsvEntry::NewL(*iMSession, + KMsvRootIndexEntryId, + ordering); + CleanupStack::PushL(root); + + TMsvId firstId; + TRAPD(err, TSmsUtilities::ServiceIdL(*root,firstId)); + + if (err == KErrNotFound) + { + TMsvEntry entry; + entry.iMtm = KUidMsgTypeSMS; + entry.iType = KUidMsvServiceEntry; + entry.SetReadOnly(EFalse); + entry.SetVisible(EFalse); + entry.iDate.UniversalTime(); + entry.iDetails.Set(_L("SMS Service")); + + root->SetEntryL(KMsvRootIndexEntryId); + root->CreateL(entry); + } + + CleanupStack::PopAndDestroy(root); + iSmsClient = static_cast (iMtmReg->NewMtmL(KSmsMtmUid)); + done = ETrue; + iMessageId = 0; +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::reset +// @see header +//--------------------------------------------------------------- +void UniSMSDataPluginPrivate::reset() +{ +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::setMessageId +// @see header +//--------------------------------------------------------------- +int UniSMSDataPluginPrivate::setMessageId(int mId) +{ + TInt error = KErrNone; + TRAP(error, setMessageIdL(mId)); + return error; + +} + +void UniSMSDataPluginPrivate::setMessageIdL(int mId) +{ + if (done == EFalse) + { + initL(); + } + if (iMessageId != mId) + { + iMessageId = (TMsvId) mId; + iSmsClient->SwitchCurrentEntryL(iMessageId); + iSmsClient->LoadMessageL(); + } + +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::body +// @see header +//--------------------------------------------------------------- +void UniSMSDataPluginPrivate::body(QString& aBodyText) +{ + CRichText& textBody = iSmsClient->Body(); + TInt len = textBody.DocumentLength(); + HBufC* buf = HBufC::NewL(len); + TPtr bufPtr = buf->Des(); + textBody.ExtractSelectively(bufPtr, 0, len, CPlainText::EExtractAll); + aBodyText = S60QConversions::s60DescToQString(*buf); + delete buf; +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::messageSize +// @see header +//--------------------------------------------------------------- +qint32 UniSMSDataPluginPrivate::messageSize() +{ + return iSmsClient->Entry().Entry().iSize; +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::toRecipientList +// @see header +//--------------------------------------------------------------- +void UniSMSDataPluginPrivate::toRecipientList( + ConvergedMessageAddressList& mAddressList) +{ + TPtrC name; + TPtrC address; + // Get the recipient list from the client mtm + const CMsvRecipientList& smsRecipients = iSmsClient->AddresseeList(); + + for (TInt id = 0; id < smsRecipients.Count(); ++id) + { + extractNameAndAddress(smsRecipients[id], name, address); + // populate address + ConvergedMessageAddress + * messageAddress = + new ConvergedMessageAddress(S60QConversions::s60DescToQString(address), + S60QConversions::s60DescToQString(name)); + mAddressList.append(messageAddress); + } + + const CSmsEmailFields& emailFields = iSmsClient->SmsHeader().EmailFields(); + // check if it is a EOS + if (emailFields.HasAddress()) + { + const MDesCArray& emailRecipients = emailFields.Addresses(); + for (TInt id = 0; id < emailRecipients.MdcaCount(); ++id) + { + extractNameAndAddress(emailRecipients.MdcaPoint(id), name, address); + ConvergedMessageAddress + * messageAddress = + new ConvergedMessageAddress(S60QConversions::s60DescToQString(address), + S60QConversions::s60DescToQString(name)); + mAddressList.append(messageAddress); + } + } + +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::fromAddress +// @see header +//--------------------------------------------------------------- +void UniSMSDataPluginPrivate::fromAddress(QString& messageAddress) +{ + CPlainText* pText = CPlainText::NewL(); + CleanupStack::PushL(pText); + + CSmsHeader* smsHeader = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *pText); + CleanupStack::PushL(smsHeader); + + CMsvEntry *cEntry = CMsvEntry::NewL(iSmsClient->Session(), + iMessageId, + TMsvSelectionOrdering()); + CleanupStack::PushL(cEntry); + + CMsvStore* store = cEntry->ReadStoreL(); + CleanupStack::PushL(store); + + smsHeader->RestoreL(*store); + + messageAddress + = S60QConversions::s60DescToQString(smsHeader->FromAddress()); + CleanupStack::PopAndDestroy(4, pText); +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::timeStamp +// @see header +//--------------------------------------------------------------- +int UniSMSDataPluginPrivate::timeStamp() +{ + QDateTime retTimeStamp; + TTime timeStamp = iSmsClient->Entry().Entry().iDate; + TTime unixEpoch(KUnixEpoch); + TTimeIntervalSeconds seconds; + timeStamp.SecondsFrom(unixEpoch, seconds); + return seconds.Int(); +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::session +// @see header +//--------------------------------------------------------------- +CMsvSession* UniSMSDataPluginPrivate::session() +{ + return iMSession; +} + +//--------------------------------------------------------------- +// UniSMSDataPluginPrivate::extractNameAndAddress +// @see header +//--------------------------------------------------------------- +void UniSMSDataPluginPrivate::extractNameAndAddress(const TDesC& aMsvAddress, + TPtrC& aName, + TPtrC& aAddress) +{ + // For address information separation (start) + const TUint KMsgSmsAddressStartChar('<'); + + // For address information separation (end) + const TUint KMsgSmsAddressEndChar('>'); + + TInt addressStart = aMsvAddress.LocateReverse(KMsgSmsAddressStartChar); + TInt addressEnd = aMsvAddress.LocateReverse(KMsgSmsAddressEndChar); + + if (addressStart != KErrNotFound && addressEnd != KErrNotFound + && addressEnd > addressStart) + { + // verified address, will be used as selected from contacts manager + aName.Set(aMsvAddress.Ptr(), addressStart); + aAddress.Set(aMsvAddress.Mid(addressStart + 1).Ptr(), (addressEnd + - addressStart) - 1); + if (!aAddress.Length()) + { + aAddress.Set(aName); + aName.Set(KNullDesC); // empty string + } + } + else + { + // unverified string, will be used as entered in the header field + aName.Set(KNullDesC); // empty string + aAddress.Set(aMsvAddress.Ptr(), aMsvAddress.Length()); // a whole string to address + } + + if (aName.CompareF(aAddress) == 0) + { + aName.Set(KNullDesC); // empty string + } +} +