messagingapp/msgutils/unidatautils/unidatamodelplugins/unimmsdataplugin/src/unimmsdataplugin_p.cpp
changeset 25 84d9eb65b26f
child 37 518b245aa84c
equal deleted inserted replaced
23:238255e8b033 25:84d9eb65b26f
       
     1 /*
       
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  * 
       
    14  * Description: 
       
    15  *
       
    16  */
       
    17 
       
    18 //SYSTEM INCLUDES
       
    19 #include <e32cmn.h>
       
    20 #include <mtclreg.h>
       
    21 #include <mtclbase.h>
       
    22 #include <msvids.h>
       
    23 #include <txtetext.h>
       
    24 #include <txtrich.h>
       
    25 #include <txtfmlyr.h>
       
    26 #include <badesca.h>
       
    27 #include <eikrted.h>
       
    28 #include <mmsclient.h>
       
    29 #include <mmssettings.h>
       
    30 #include <mmsheaders.h>
       
    31 #include <MsgMediaInfo.h>
       
    32 #include <MsgMediaResolver.h>
       
    33 #include <QDateTime>
       
    34 
       
    35 #include "convergedmessage.h"
       
    36 #include "s60qconversions.h"
       
    37 #include "convergedmessageaddress.h"
       
    38 #include "unimmsdataplugin_p.h"
       
    39 #include "debugtraces.h"
       
    40 
       
    41 
       
    42 #define KSenduiMtmMmsUidValue 0x100058E1
       
    43 const TUid KSenduiMtmMmsUid = {KSenduiMtmMmsUidValue};
       
    44 
       
    45 _LIT(KUnixEpoch, "19700000:000000.000000");
       
    46 
       
    47 
       
    48 UniMMSDataPluginPrivate::UniMMSDataPluginPrivate():
       
    49     mSession(NULL),
       
    50     mMtmRegistry(NULL),
       
    51     mUniDataModel(NULL),
       
    52     mMmsClient(NULL)
       
    53     {
       
    54     done = EFalse;
       
    55     mSession = CMsvSession::OpenSyncL(*this);
       
    56     }
       
    57 
       
    58 void UniMMSDataPluginPrivate::initL()
       
    59 {
       
    60     mMtmRegistry = CClientMtmRegistry::NewL(*mSession);
       
    61     mMmsClient = static_cast<CMmsClientMtm*> (mMtmRegistry->NewMtmL(KSenduiMtmMmsUid));
       
    62     User::LeaveIfError(mfsSession.Connect());
       
    63     iMessageId = 0;
       
    64 }
       
    65 
       
    66 UniMMSDataPluginPrivate::~UniMMSDataPluginPrivate()
       
    67 {
       
    68    if(mUniDataModel)
       
    69     {
       
    70         delete mUniDataModel;
       
    71     }
       
    72     mfsSession.Close();
       
    73     delete mMmsClient;
       
    74     delete mMtmRegistry;
       
    75     delete mSession;
       
    76 }
       
    77 
       
    78 int UniMMSDataPluginPrivate::setMessageId(int messageId)
       
    79 {
       
    80     TInt error = KErrNone;
       
    81     TRAP(error, setMessageIdL(messageId));
       
    82     return error;
       
    83 }
       
    84 
       
    85 void UniMMSDataPluginPrivate::setMessageIdL(int messageId)
       
    86 {
       
    87     if (done == EFalse)
       
    88     {
       
    89         initL();
       
    90     }
       
    91 
       
    92     if (iMessageId != messageId)
       
    93     {
       
    94         if (done)
       
    95         {
       
    96             reset();
       
    97         }
       
    98         done = ETrue;
       
    99         iMessageId = messageId;
       
   100         mMmsClient->SwitchCurrentEntryL(iMessageId);
       
   101         mMmsClient->LoadMessageL();
       
   102         mUniDataModel = CUniDataModel::NewL(mfsSession, *mMmsClient);
       
   103         mUniDataModel->RestoreL(*this, EFalse);
       
   104     }
       
   105 }
       
   106 
       
   107 void UniMMSDataPluginPrivate::reset()
       
   108 {
       
   109     delete mUniDataModel;
       
   110     mUniDataModel = NULL;
       
   111 }
       
   112 
       
   113 void UniMMSDataPluginPrivate::body(QString& aBodyText)
       
   114 {
       
   115 
       
   116     CRichText& textBody = mMmsClient->Body();
       
   117     TInt len = textBody.DocumentLength();
       
   118     HBufC* buf = HBufC::NewL(len);
       
   119     TPtr bufPtr = buf->Des();
       
   120     aBodyText = S60QConversions::s60DescToQString(bufPtr);
       
   121 }
       
   122 
       
   123 int UniMMSDataPluginPrivate::messageSize()
       
   124 {
       
   125     return mMmsClient->MessageSize();
       
   126 }
       
   127 
       
   128 
       
   129 QString UniMMSDataPluginPrivate::subject()
       
   130 {
       
   131    TPtrC sub =  mMmsClient->SubjectL();
       
   132    return S60QConversions::s60DescToQString(sub);
       
   133 }
       
   134 
       
   135 
       
   136 
       
   137 
       
   138 void UniMMSDataPluginPrivate::toRecipientList(
       
   139     ConvergedMessageAddressList& mAddressList)
       
   140 {
       
   141     CMsvEntry* cEntry = mSession->GetEntryL(KMsvGlobalInBoxIndexEntryIdValue);
       
   142     CleanupStack::PushL(cEntry);
       
   143     TRAPD (error, cEntry->SetEntryL( iMessageId ));
       
   144     if (error != KErrNone)
       
   145     {
       
   146         CleanupStack::PopAndDestroy(); // cEntry
       
   147         return;
       
   148     }
       
   149     CMsvStore* store = cEntry->ReadStoreL();
       
   150     CleanupStack::PushL(store);
       
   151     CMmsSettings* settings = CMmsSettings::NewL();
       
   152     CleanupStack::PushL(settings);
       
   153     CMmsHeaders* mmsHeaders = CMmsHeaders::NewL(settings->MmsVersion());
       
   154     CleanupStack::PushL(mmsHeaders);
       
   155     mmsHeaders->RestoreL(*store);
       
   156     TPtrC name;
       
   157     TPtrC address;
       
   158     TPtrC to;
       
   159     for (TInt id = 0; id < mmsHeaders->ToRecipients().MdcaCount(); id++)
       
   160     {
       
   161         to.Set( (mmsHeaders->ToRecipients())[id]);
       
   162         extractNameAndAddress(to, name, address);
       
   163         // populate address
       
   164         ConvergedMessageAddress
       
   165         * messageAddress =
       
   166             new ConvergedMessageAddress(S60QConversions::s60DescToQString(address),
       
   167                 S60QConversions::s60DescToQString(name));
       
   168         mAddressList.append(messageAddress);
       
   169     }
       
   170 
       
   171     CleanupStack::PopAndDestroy(3); //  mmsHeaders, settings, store
       
   172 
       
   173     CleanupStack::PopAndDestroy(); // cEntry
       
   174 }
       
   175 
       
   176 void UniMMSDataPluginPrivate::ccRecipientList(
       
   177     ConvergedMessageAddressList& mAddressList)
       
   178 {
       
   179     CMsvEntry* cEntry = mSession->GetEntryL(KMsvGlobalInBoxIndexEntryIdValue);
       
   180     CleanupStack::PushL(cEntry);
       
   181     TRAPD (error, cEntry->SetEntryL( iMessageId ));
       
   182     if (error != KErrNone)
       
   183     {
       
   184         CleanupStack::PopAndDestroy(); // cEntry
       
   185         return;
       
   186     }
       
   187     CMsvStore* store = cEntry->ReadStoreL();
       
   188     CleanupStack::PushL(store);
       
   189     CMmsSettings* settings = CMmsSettings::NewL();
       
   190     CleanupStack::PushL(settings);
       
   191     CMmsHeaders* mmsHeaders = CMmsHeaders::NewL(settings->MmsVersion());
       
   192     CleanupStack::PushL(mmsHeaders);
       
   193     mmsHeaders->RestoreL(*store);
       
   194     //CDesCArray& ccList = mmsHeaders->CcRecipients();
       
   195 
       
   196     TPtrC cc;
       
   197     TPtrC name;
       
   198     TPtrC address;
       
   199     for (TInt id = 0; id < mmsHeaders->CcRecipients().MdcaCount(); id++)
       
   200     {
       
   201         cc.Set( (mmsHeaders->CcRecipients())[id]);
       
   202         extractNameAndAddress(cc, name, address);
       
   203         // populate address
       
   204         ConvergedMessageAddress
       
   205         * messageAddress =
       
   206             new ConvergedMessageAddress(S60QConversions::s60DescToQString(address),
       
   207                 S60QConversions::s60DescToQString(name));
       
   208         mAddressList.append(messageAddress);
       
   209     }
       
   210 
       
   211     CleanupStack::PopAndDestroy(3); //  mmsHeaders, settings, store
       
   212 
       
   213     CleanupStack::PopAndDestroy(); // cEntry
       
   214 }
       
   215 
       
   216 void UniMMSDataPluginPrivate::bccRecipientList(
       
   217     ConvergedMessageAddressList& mAddressList)
       
   218 {
       
   219     CMsvEntry* cEntry = mSession->GetEntryL(KMsvGlobalInBoxIndexEntryIdValue);
       
   220     CleanupStack::PushL(cEntry);
       
   221     TRAPD (error, cEntry->SetEntryL( iMessageId ));
       
   222     if (error != KErrNone)
       
   223     {
       
   224         CleanupStack::PopAndDestroy(); // cEntry
       
   225         return;
       
   226     }
       
   227     CMsvStore* store = cEntry->ReadStoreL();
       
   228     CleanupStack::PushL(store);
       
   229     CMmsSettings* settings = CMmsSettings::NewL();
       
   230     CleanupStack::PushL(settings);
       
   231     CMmsHeaders* mmsHeaders = CMmsHeaders::NewL(settings->MmsVersion());
       
   232     CleanupStack::PushL(mmsHeaders);
       
   233     mmsHeaders->RestoreL(*store);
       
   234     //CDesCArray& bccList = mmsHeaders->BccRecipients();
       
   235 
       
   236     TPtrC bcc;
       
   237     TPtrC name;
       
   238     TPtrC address;
       
   239     for (TInt id = 0; id < mmsHeaders->BccRecipients().MdcaCount(); id++)
       
   240     {
       
   241         bcc.Set( (mmsHeaders->BccRecipients())[id]);
       
   242         extractNameAndAddress(bcc, name, address);
       
   243         // populate address
       
   244         ConvergedMessageAddress
       
   245         * messageAddress =
       
   246             new ConvergedMessageAddress(S60QConversions::s60DescToQString(address),
       
   247                 S60QConversions::s60DescToQString(name));
       
   248         mAddressList.append(messageAddress);
       
   249     }
       
   250 
       
   251     CleanupStack::PopAndDestroy(3); //  mmsHeaders, settings, store
       
   252 
       
   253     CleanupStack::PopAndDestroy(); // cEntry
       
   254 }
       
   255 
       
   256 void UniMMSDataPluginPrivate::fromAddress(QString& messageAddress)
       
   257 {
       
   258 
       
   259     TPtrC sender = mMmsClient->Sender();
       
   260     messageAddress = S60QConversions::s60DescToQString(sender);
       
   261 }
       
   262 
       
   263 UniMessageInfoList UniMMSDataPluginPrivate::attachmentList()
       
   264 {
       
   265     UniMessageInfoList attlist;
       
   266     int attcount = mUniDataModel->AttachmentList().Count();
       
   267 
       
   268     QString path;
       
   269     QString mimetype;
       
   270     int size;
       
   271     for (int i = 0; i < attcount; i++)
       
   272     {
       
   273         CUniObject *obj = mUniDataModel->AttachmentList().GetByIndex(i);
       
   274 
       
   275         mimetype = S60QConversions::s60Desc8ToQString(obj->MimeType());
       
   276         path
       
   277         = S60QConversions::s60DescToQString(obj->MediaInfo()->FullFilePath());
       
   278         size = obj->Size(EFalse);
       
   279 
       
   280         UniMessageInfo *msgobj = new UniMessageInfo(path, size, mimetype);
       
   281         attlist << msgobj;
       
   282     }
       
   283 
       
   284     return attlist;
       
   285 }
       
   286 
       
   287 QString UniMMSDataPluginPrivate::messageType()
       
   288 {
       
   289     QString str("mms");
       
   290     return str;
       
   291 }
       
   292 
       
   293 MsgPriority UniMMSDataPluginPrivate::messagePriority()
       
   294 {
       
   295     return Normal;
       
   296 }
       
   297 
       
   298 int UniMMSDataPluginPrivate::attachmentCount()
       
   299 {
       
   300     return mUniDataModel->AttachmentList().Count();
       
   301 }
       
   302 
       
   303 bool UniMMSDataPluginPrivate::hasAttachment()
       
   304 {
       
   305     int count = mUniDataModel->AttachmentList().Count();
       
   306     if (count > 0)
       
   307     {
       
   308         return true;
       
   309     }
       
   310     else
       
   311     {
       
   312         return false;
       
   313     }
       
   314 }
       
   315 
       
   316 int UniMMSDataPluginPrivate::objectCount()
       
   317 {
       
   318     return mUniDataModel->ObjectList().Count();
       
   319 }
       
   320 
       
   321 UniMessageInfoList UniMMSDataPluginPrivate::objectList()
       
   322 {
       
   323     UniMessageInfoList objlist;
       
   324     int objcount = mUniDataModel->ObjectList().Count();
       
   325 
       
   326     QString path;
       
   327     QString mimetype;
       
   328     int size;
       
   329     for (int i = 0; i < objcount; i++)
       
   330     {
       
   331         CUniObject *obj = mUniDataModel->ObjectList().GetByIndex(i);
       
   332 
       
   333         mimetype = S60QConversions::s60Desc8ToQString(obj->MimeType());
       
   334         path
       
   335         = S60QConversions::s60DescToQString(obj->MediaInfo()->FullFilePath());
       
   336         size = obj->Size(EFalse);
       
   337 
       
   338         UniMessageInfo *msgobj = new UniMessageInfo(path, size, mimetype);
       
   339         objlist << msgobj;
       
   340     }
       
   341 
       
   342     return objlist;
       
   343 }
       
   344 
       
   345 /*
       
   346  * For now not reqd
       
   347  */
       
   348 int UniMMSDataPluginPrivate::slideCount()
       
   349 {
       
   350     return mUniDataModel->SmilModel().SlideCount();
       
   351 }
       
   352 
       
   353 UniMessageInfoList UniMMSDataPluginPrivate::slideContent(TInt slidenum)
       
   354 {
       
   355     UniMessageInfoList slidecontent;
       
   356 
       
   357     int slideobjcount = mUniDataModel->SmilModel().SlideObjectCount(slidenum);
       
   358 
       
   359     QString path;
       
   360     QString mimetype;
       
   361     int size;
       
   362     for (int i = 0; i < slideobjcount; i++)
       
   363     {
       
   364         CUniObject *obj = mUniDataModel->SmilModel().GetObjectByIndex(slidenum,
       
   365             i);
       
   366 
       
   367         mimetype = S60QConversions::s60Desc8ToQString(obj->MimeType());
       
   368         path
       
   369         = S60QConversions::s60DescToQString(obj->MediaInfo()->FullFilePath());
       
   370         size = obj->Size(EFalse);
       
   371 
       
   372         UniMessageInfo *msgobj = new UniMessageInfo(path, size, mimetype);
       
   373         slidecontent << msgobj;
       
   374     }
       
   375 
       
   376     return slidecontent;
       
   377 }
       
   378 
       
   379 int UniMMSDataPluginPrivate::timeStamp()
       
   380 {
       
   381     QDateTime retTimeStamp;
       
   382     TTime timeStamp = mMmsClient->Entry().Entry().iDate;
       
   383     TTime unixEpoch(KUnixEpoch);
       
   384     TTimeIntervalSeconds seconds;
       
   385     timeStamp.SecondsFrom(unixEpoch, seconds);
       
   386     return seconds.Int();
       
   387 }
       
   388 
       
   389 void UniMMSDataPluginPrivate::extractNameAndAddress(const TDesC& aMsvAddress,
       
   390     TPtrC& aName,
       
   391     TPtrC& aAddress)
       
   392 {
       
   393     // For address information separation (start)
       
   394     const TUint KMsgMmsAddressStartChar('<');
       
   395 
       
   396     // For address information separation (end)
       
   397     const TUint KMsgMmsAddressEndChar('>');
       
   398 
       
   399     TInt addressStart = aMsvAddress.LocateReverse(KMsgMmsAddressStartChar);
       
   400     TInt addressEnd = aMsvAddress.LocateReverse(KMsgMmsAddressEndChar);
       
   401 
       
   402     if (addressStart != KErrNotFound && addressEnd != KErrNotFound
       
   403             && addressEnd > addressStart)
       
   404     {
       
   405         // verified address, will be used as selected from contacts manager
       
   406         aName.Set(aMsvAddress.Ptr(), addressStart);
       
   407         aAddress.Set(aMsvAddress.Mid(addressStart + 1).Ptr(), (addressEnd
       
   408                 - addressStart) - 1);
       
   409         if (!aAddress.Length())
       
   410         {
       
   411             aAddress.Set(aName);
       
   412             aName.Set(KNullDesC); // empty string
       
   413         }
       
   414     }
       
   415     else
       
   416     {
       
   417         // unverified string, will be used as entered in the header field
       
   418         aName.Set(KNullDesC); // empty string
       
   419         aAddress.Set(aMsvAddress.Ptr(), aMsvAddress.Length()); // a whole string to address
       
   420     }
       
   421 
       
   422     if (aName.CompareF(aAddress) == 0)
       
   423     {
       
   424         aName.Set(KNullDesC); // empty string
       
   425     }
       
   426 }
       
   427 
       
   428 void UniMMSDataPluginPrivate::RestoreReady(TInt /*aParseResult*/, 
       
   429     TInt /*aError*/)
       
   430 {
       
   431 }
       
   432 
       
   433 
       
   434 
       
   435 void UniMMSDataPluginPrivate::restoreL(CBaseMtm& mtm)
       
   436 {
       
   437     initL();	
       
   438     mUniDataModel = CUniDataModel::NewL(mfsSession, mtm);
       
   439     mUniDataModel->RestoreL(*this, ETrue);
       
   440 }
       
   441 
       
   442 CMsvSession* UniMMSDataPluginPrivate::session()
       
   443 {
       
   444     return mSession;
       
   445 }
       
   446 
       
   447 void UniMMSDataPluginPrivate::HandleSessionEventL(TMsvSessionEvent /*aEvent*/,
       
   448                                                   TAny* /*aArg1*/,
       
   449                                                   TAny* /*aArg2*/, TAny* /*aArg3*/)
       
   450 {
       
   451 // do nothing
       
   452 }
       
   453