utilityapps/creator/engine/src/creator_message.cpp
changeset 55 2d9cac8919d3
parent 52 36d60d12b4af
equal deleted inserted replaced
53:819e59dfc032 55:2d9cac8919d3
       
     1 /*
       
     2 * Copyright (c) 2010 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 
       
    19 #include "engine.h"
       
    20 #include "enginewrapper.h"
       
    21 
       
    22 #include "creator_message.h" 
       
    23 #include "creator_traces.h"
       
    24 #include "creator_contactsetcache.h"
       
    25 #include "creator_phonebook.h"
       
    26 #include <apgcli.h>
       
    27 #include <MuiuServiceUtilities.h>
       
    28 #include <utf.h>
       
    29 
       
    30 #include <mmf/common/mmfcontrollerpluginresolver.h> // for CleanupResetAndDestroyPushL
       
    31 
       
    32 //static const TInt KMessagesFieldLength = 1024;
       
    33 
       
    34 //_LIT(KCreatorMessagesPrefixName, "CR_");
       
    35 //_LIT(KCreatorMessagesPrefixFolderName, "CR_FLDR_");
       
    36 
       
    37 
       
    38 const TUid KUidBIOBusinessCardMsg =  {0x10005531}; 
       
    39 _LIT(KEmpty, "");
       
    40 
       
    41 //----------------------------------------------------------------------------
       
    42 
       
    43 CMessagesParameters::CMessagesParameters()
       
    44     {
       
    45     LOGSTRING("Creator: CMessagesParameters::CMessagesParameters");
       
    46 
       
    47     iSenderAddress = HBufC::New(128);
       
    48     iRecipientAddress = HBufC::New(128);
       
    49     iMessageSubject = HBufC::New(128);
       
    50     iMessageBodyText = HBufC::New(10240);
       
    51     TRAP_IGNORE(iAttachments = new(ELeave) CArrayFixFlat<TInt>(64));
       
    52     iCreateAsUnread = ETrue;
       
    53     }
       
    54 
       
    55 CMessagesParameters::~CMessagesParameters()
       
    56     {
       
    57     LOGSTRING("Creator: CMessagesParameters::~CMessagesParameters");
       
    58 
       
    59 
       
    60     delete iMessageBodyText;
       
    61     delete iMessageSubject;
       
    62     delete iRecipientAddress;
       
    63     delete iSenderAddress;
       
    64     delete iAttachments;
       
    65     iAttachmentPaths.ResetAndDestroy();
       
    66     iAttachmentPaths.Close(); 
       
    67     iRecipientAddressArray.ResetAndDestroy();
       
    68     iRecipientAddressArray.Close();
       
    69     iRecipientLinkIds.Close();
       
    70     iSenderLinkIds.Close();
       
    71     }
       
    72 
       
    73 //----------------------------------------------------------------------------
       
    74 
       
    75 CCreatorMessages* CCreatorMessages::NewL(CCreatorEngine* aEngine)
       
    76     {
       
    77     CCreatorMessages* self = CCreatorMessages::NewLC(aEngine);
       
    78     CleanupStack::Pop(self);
       
    79     return self;
       
    80     }
       
    81 
       
    82 CCreatorMessages* CCreatorMessages::NewLC(CCreatorEngine* aEngine)
       
    83     {
       
    84     CCreatorMessages* self = new (ELeave) CCreatorMessages;
       
    85     CleanupStack::PushL(self);
       
    86     self->ConstructL(aEngine);
       
    87     return self;
       
    88     }
       
    89 
       
    90 CCreatorMessages::CCreatorMessages()
       
    91     {
       
    92     }
       
    93 
       
    94 void CCreatorMessages::ConstructL(CCreatorEngine* aEngine)
       
    95     {
       
    96     LOGSTRING("Creator: CCreatorMessages::ConstructL");
       
    97     iEngine = aEngine;
       
    98     
       
    99     TRAP_IGNORE(iAttachments = new(ELeave) CArrayFixFlat<TInt>(64));
       
   100     iWaiter = CAsyncWaiter::NewL();
       
   101     }
       
   102 
       
   103 CCreatorMessages::~CCreatorMessages()
       
   104     {
       
   105     LOGSTRING("Creator: CCreatorMessages::~CCreatorMessages");
       
   106 
       
   107     if ( iEngine && iEntryIds.Count() )
       
   108         {
       
   109         TRAP_IGNORE( iEngine->WriteEntryIdsToStoreL( iEntryIds, KUidDictionaryUidMessages ) );
       
   110         }
       
   111     iEntryIds.Reset();
       
   112     iEntryIds.Close();
       
   113     
       
   114     delete iParameters;
       
   115     delete iWaiter;
       
   116     delete iTmpPhoneNumber;
       
   117     delete iTmpEmail;
       
   118     delete iAttachments;
       
   119 
       
   120     iRecipientArray.ResetAndDestroy();
       
   121     iRecipientArray.Close();
       
   122     iSenderArray.ResetAndDestroy();
       
   123     iSenderArray.Close();
       
   124     }
       
   125 
       
   126 //----------------------------------------------------------------------------
       
   127 
       
   128 void CCreatorMessages::QueryDialogClosedL(TBool aPositiveAction, TInt aUserData)
       
   129     {
       
   130     LOGSTRING("Creator: CCreatorMessages::QueryDialogClosedL");  
       
   131     
       
   132     if( aPositiveAction == EFalse )
       
   133         {
       
   134         iEngine->ShutDownEnginesL();
       
   135         return;
       
   136         }
       
   137     
       
   138     const TDesC* showText = &KSavingText;
       
   139     TBool finished(EFalse);
       
   140     TBool retval(ETrue);
       
   141     switch(aUserData)
       
   142         {
       
   143         case ECreatorMessagesDelete:
       
   144             showText = &KDeletingText;
       
   145             iEntriesToBeCreated = 1;
       
   146             finished = ETrue;
       
   147             break;
       
   148         case ECreatorMessagesStart:
       
   149             // message type query
       
   150             retval = iEngine->GetEngineWrapper()->ListQueryDialog(_L("Message type"), R_MESSAGE_TYPE_QUERY, (TInt*) &iMessageType, this, ECreatorMessagesMessageType);
       
   151             break;
       
   152         case ECreatorMessagesMessageType:
       
   153             retval = iEngine->GetEngineWrapper()->ListQueryDialog(_L("Folder type"), R_FOLDER_TYPE_QUERY, (TInt*) &iFolderType, this, ECreatorMessagesFolderType);
       
   154             break;
       
   155         case ECreatorMessagesFolderType:
       
   156             // query create as unread
       
   157             retval = iEngine->GetEngineWrapper()->ListQueryDialog(_L("Message status"), R_UNREAD_QUERY, (TInt*)&iCreateAsUnread, this, ECreatorMessagesMessageStatus);
       
   158             break;
       
   159         case ECreatorMessagesMessageStatus:
       
   160             if( iMessageType == ESMS || iMessageType == EMMS || iMessageType == EEmail )
       
   161                 {
       
   162                 iDefinedMessageLength = 100;
       
   163                 retval = iEngine->GetEngineWrapper()->EntriesQueryDialog(&iDefinedMessageLength, _L("Amount of characters in message body?"), ETrue, 
       
   164                     this, ECreatorMessagesCharsInBody
       
   165                     );
       
   166                 break;
       
   167                 }
       
   168             else
       
   169                 {
       
   170                 iDefinedMessageLength = 0;
       
   171                 // goto query attachments ... :-) DO NOT break;
       
   172                 }
       
   173         case ECreatorMessagesCharsInBody:
       
   174             // query attachments
       
   175             iAttachments->Reset();
       
   176             if( iMessageType == EMMS || iMessageType == EEmail)
       
   177                 {
       
   178                 retval = iEngine->GetEngineWrapper()->ListQueryDialog(_L("Choose attachment:"), R_ATTACHMENT_MULTI_SELECTION_QUERY, 
       
   179                     iAttachments, this, ECreatorMessagesAttachment
       
   180                     );
       
   181                 }
       
   182             else if( iMessageType == EAMS )
       
   183                 {
       
   184                 iAttachments->AppendL( TInt(0) );
       
   185                 retval = iEngine->GetEngineWrapper()->ListQueryDialog(_L("Choose attachment:"), R_AMS_ATTACHMENT_SINGLE_SELECTION_QUERY, 
       
   186                     &iAttachments->At(0), this, ECreatorMessagesAttachment
       
   187                     );
       
   188                 }
       
   189             else if( iMessageType == EIrMessage || iMessageType == EBTMessage )
       
   190                 {
       
   191                 iAttachments->AppendL( TInt(0) );
       
   192                 retval = iEngine->GetEngineWrapper()->ListQueryDialog(_L("Choose attachment:"), R_ATTACHMENT_SINGLE_SELECTION_QUERY,
       
   193                     &iAttachments->At(0), this, ECreatorMessagesAttachment
       
   194                     );
       
   195                 }
       
   196             else
       
   197                 {
       
   198                 finished = ETrue;
       
   199                 }
       
   200             break;
       
   201         case ECreatorMessagesAttachment:
       
   202             finished = ETrue;
       
   203             if(iMessageType== EMMS || iMessageType == EEmail)
       
   204                 {
       
   205                 // "none" is selected
       
   206                 if (iAttachments->At(0) == 0)
       
   207                     {
       
   208                     iAttachments->Reset();
       
   209                     }
       
   210                 else  // otherwise fix indexes
       
   211                     {
       
   212                     for (TInt i=0; i<iAttachments->Count(); i++)
       
   213                         iAttachments->At(i)--;  // decrease value by one 
       
   214 
       
   215                     }
       
   216                 }
       
   217             break;
       
   218         default:
       
   219             //some error
       
   220             retval = EFalse;
       
   221             break;
       
   222         }
       
   223     if( retval == EFalse )
       
   224         {
       
   225         iEngine->ShutDownEnginesL();
       
   226         }
       
   227     else if( finished )
       
   228         {
       
   229         // add this command to command array
       
   230         iEngine->AppendToCommandArrayL(iCommand, NULL, iEntriesToBeCreated);
       
   231         // started exucuting commands
       
   232         iEngine->ExecuteFirstCommandL( *showText );
       
   233         }
       
   234     }
       
   235 //----------------------------------------------------------------------------
       
   236 
       
   237 TBool CCreatorMessages::AskDataFromUserL(TInt aCommand)
       
   238     {
       
   239     LOGSTRING("Creator: CCreatorMessages::AskDataFromUserL");
       
   240 
       
   241     CCreatorModuleBase::AskDataFromUserL(aCommand);
       
   242     
       
   243     if ( aCommand == ECmdDeleteMessages )
       
   244         {
       
   245         return iEngine->GetEngineWrapper()->YesNoQueryDialog( _L("Delete all messages?"), this, ECreatorMessagesDelete );
       
   246         }
       
   247     else if ( aCommand ==  ECmdDeleteCreatorMessages )
       
   248         {
       
   249         return iEngine->GetEngineWrapper()->YesNoQueryDialog( _L("Delete all messages created with Creator?"), this, ECreatorMessagesDelete  );
       
   250         }
       
   251 
       
   252     return iEngine->GetEngineWrapper()->EntriesQueryDialog( &iEntriesToBeCreated, _L("How many entries to create?"), EFalse, this, ECreatorMessagesStart );
       
   253     }
       
   254 
       
   255 //----------------------------------------------------------------------------
       
   256 
       
   257 TInt CCreatorMessages::CreateRandomMessageEntryL(TInt aCommand)
       
   258     {
       
   259     LOGSTRING2("Creator: CCreatorMessages::CreateRandomMessageEntryL - Command: %d", aCommand);
       
   260 
       
   261     TInt err = KErrNone;
       
   262     
       
   263     iDefinedMessageLength = iEngine->RandomNumber(100, 300);
       
   264 
       
   265 
       
   266     switch (aCommand)
       
   267         {
       
   268 	    case ECmdCreateRandomEntrySMSInbox:     { iMessageType=ESMS; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   269 	    case ECmdCreateRandomEntrySMSDrafts:    { iMessageType=ESMS; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   270 	    case ECmdCreateRandomEntrySMSOutbox:    { iMessageType=ESMS; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}
       
   271 	    case ECmdCreateRandomEntrySMSSent:      { iMessageType=ESMS; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   272 	    
       
   273         case ECmdCreateRandomEntryMMSInbox:     { iMessageType=EMMS; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   274 	    case ECmdCreateRandomEntryMMSDrafts:    { iMessageType=EMMS; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   275 	    case ECmdCreateRandomEntryMMSOutbox:    { iMessageType=EMMS; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}    
       
   276 	    case ECmdCreateRandomEntryMMSSent:      { iMessageType=EMMS; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   277 	    
       
   278         case ECmdCreateRandomEntryEmailInbox:   { iMessageType=EEmail; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   279 	    case ECmdCreateRandomEntryEmailDrafts:  { iMessageType=EEmail; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   280 	    case ECmdCreateRandomEntryEmailOutbox:  { iMessageType=EEmail; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}
       
   281 	    case ECmdCreateRandomEntryEmailSent:    { iMessageType=EEmail; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   282 	    
       
   283         case ECmdCreateRandomEntryBIOInbox:     { iMessageType=ESmartMessage; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   284 	    case ECmdCreateRandomEntryBIODrafts:    { iMessageType=ESmartMessage; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   285 	    case ECmdCreateRandomEntryBIOOutbox:    { iMessageType=ESmartMessage; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}
       
   286 	    case ECmdCreateRandomEntryBIOSent:      { iMessageType=ESmartMessage; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   287 	    
       
   288         case ECmdCreateRandomEntryIRInbox:      { iMessageType=EIrMessage; iFolderType=EInbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   289 	    case ECmdCreateRandomEntryIRDrafts:     { iMessageType=EIrMessage; iFolderType=EDrafts; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   290 	    case ECmdCreateRandomEntryIROutbox:     { iMessageType=EIrMessage; iFolderType=EOutbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   291 	    case ECmdCreateRandomEntryIRSent:       { iMessageType=EIrMessage; iFolderType=ESent; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   292 	    
       
   293         case ECmdCreateRandomEntryBTInbox:      { iMessageType=EBTMessage; iFolderType=EInbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   294 	    case ECmdCreateRandomEntryBTDrafts:     { iMessageType=EBTMessage; iFolderType=EDrafts; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   295 	    case ECmdCreateRandomEntryBTOutbox:     { iMessageType=EBTMessage; iFolderType=EOutbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   296 	    case ECmdCreateRandomEntryBTSent:       { iMessageType=EBTMessage; iFolderType=ESent; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   297         
       
   298 	    case ECmdCreateRandomEntryAMSInbox:     { iMessageType=EAMS; iFolderType=EInbox; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   299 	    case ECmdCreateRandomEntryAMSDrafts:     { iMessageType=EAMS; iFolderType=EDrafts; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   300 	    case ECmdCreateRandomEntryAMSOutbox:     { iMessageType=EAMS; iFolderType=EOutbox; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   301 	    case ECmdCreateRandomEntryAMSSent:     { iMessageType=EAMS; iFolderType=ESent; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   302 
       
   303 	    default: { User::Panic(_L("MessageCommand"), 901);  break;}
       
   304         }
       
   305 
       
   306     return err;
       
   307     }
       
   308 
       
   309 //----------------------------------------------------------------------------
       
   310 
       
   311 TInt CCreatorMessages::CreateMessageEntryL(CMessagesParameters *aParameters, TBool /*aTakeUserGivenParameters*/)
       
   312     {
       
   313     LOGSTRING("Creator: CCreatorMessages::CreateMessageEntryL");
       
   314     
       
   315     delete iParameters;
       
   316     iParameters = 0;   
       
   317     
       
   318     CMessagesParameters* parameters = aParameters;
       
   319            
       
   320     // random data needed if no predefined data available
       
   321     if (!parameters)
       
   322         {
       
   323         iParameters = new(ELeave) CMessagesParameters;
       
   324         parameters = iParameters;
       
   325         // check if values from ui needed
       
   326         //if (aTakeUserGivenParameters)
       
   327         //    {            
       
   328             parameters->iMessageType = iMessageType;
       
   329             parameters->iFolderType = iFolderType;
       
   330             parameters->iDefinedMessageLength = iDefinedMessageLength;
       
   331             parameters->iCreateAsUnread = iCreateAsUnread;
       
   332 
       
   333             for (TInt i=0; i<iAttachments->Count(); i++)
       
   334                 parameters->iAttachments->AppendL(iAttachments->At(i)); 
       
   335         //    }
       
   336         //else
       
   337         //    {
       
   338             // message length
       
   339         //    parameters->iDefinedMessageLength = iEngine->RandomNumber(100, 300);
       
   340         //    }    
       
   341 
       
   342         if (parameters->iMessageType == EEmail)
       
   343             {
       
   344             parameters->iSenderAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   345             parameters->iSenderAddress->Des().Append( _L("@") );
       
   346             parameters->iSenderAddress->Des().Append( iEngine->RandomString(CCreatorEngine::ECompany) );
       
   347             parameters->iSenderAddress->Des().Append( _L(".com") );
       
   348 
       
   349             parameters->iRecipientAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   350             parameters->iRecipientAddress->Des().Append( _L("@") );
       
   351             parameters->iRecipientAddress->Des().Append( iEngine->RandomString(CCreatorEngine::ECompany) );
       
   352             parameters->iRecipientAddress->Des().Append( _L(".net") );
       
   353             }
       
   354         else if (parameters->iMessageType == EIrMessage || parameters->iMessageType == EBTMessage)
       
   355             {
       
   356             parameters->iSenderAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   357             parameters->iRecipientAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   358             }
       
   359         else
       
   360             {
       
   361             parameters->iSenderAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EPhoneNumber) );
       
   362             parameters->iRecipientAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EPhoneNumber) );
       
   363             }
       
   364 
       
   365         // subject
       
   366         parameters->iMessageSubject->Des() = iEngine->RandomString(CCreatorEngine::EMessageSubject);
       
   367 
       
   368         // message body
       
   369         parameters->iMessageBodyText->Des().Copy(_L(""));
       
   370         TPtrC randText = iEngine->RandomString(CCreatorEngine::EMessageText);
       
   371         for (TInt i=0; i<parameters->iDefinedMessageLength / randText.Length() +1; i++)
       
   372             {
       
   373             parameters->iMessageBodyText->Des().Append( randText );
       
   374             parameters->iMessageBodyText->Des().Append( _L(" ") );
       
   375             }
       
   376         parameters->iMessageBodyText->Des() = parameters->iMessageBodyText->Des().Left(parameters->iDefinedMessageLength);
       
   377 
       
   378         // BIO message type (from bitsids.h)  // TO-DO: add support for all BIO message types...
       
   379         parameters->iBIOMessageType = KUidBIOBusinessCardMsg;
       
   380         }
       
   381     
       
   382     
       
   383 
       
   384     TInt err = KErrNone;
       
   385 
       
   386     switch (parameters->iMessageType)
       
   387         {
       
   388         case ESMS:          { err = CreateSMSEntryL(*parameters);  break; }
       
   389         case EMMS:          { err = CreateMMSEntryL(*parameters);  break; }
       
   390         case EAMS:          { err = CreateAMSEntryL(*parameters);  break; }
       
   391         case EEmail:        { err = CreateEmailEntryL(*parameters);  break; }
       
   392         case ESmartMessage: { err = CreateSmartMessageEntryL(*parameters);  break; }
       
   393         case EIrMessage:    { err = CreateObexEntryL( TUid::Uid(KUidMsgTypeIrTInt32), *parameters );  break; }    
       
   394         case EBTMessage:    { err = CreateObexEntryL( TUid::Uid(KUidMsgTypeBtTInt32), *parameters );  break; }
       
   395         default:            { User::Panic(_L("MsgType"), 851);  break;}
       
   396 
       
   397         }
       
   398 
       
   399     iSenderArray.ResetAndDestroy();
       
   400     iRecipientArray.ResetAndDestroy();
       
   401     return err;
       
   402     }
       
   403 
       
   404 //----------------------------------------------------------------------------
       
   405 
       
   406 TInt CCreatorMessages::CreateSMSEntryL(const CMessagesParameters& parameters)
       
   407     {
       
   408     LOGSTRING("Creator: CCreatorMessages::CreateSMSEntryL");
       
   409 
       
   410     TInt err = KErrNone;
       
   411 
       
   412                
       
   413     // init
       
   414     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
   415     CleanupStack::PushL(session);
       
   416     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
   417     CleanupStack::PushL(registry);
       
   418 
       
   419     // get the client mtm and return if it isn't supported in the system        
       
   420     CSmsClientMtm* clientMtm = NULL;
       
   421     TRAP(err, clientMtm = static_cast<CSmsClientMtm*>(registry->NewMtmL(KUidMsgTypeSMS)));
       
   422     if (err || !clientMtm)
       
   423         {
       
   424         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("SMS: Message type module not found"));
       
   425         CleanupStack::PopAndDestroy(2);
       
   426         User::Leave(KErrNotFound);
       
   427         }  
       
   428     CleanupStack::PushL(clientMtm);   
       
   429 
       
   430     // create a new object to access an existing entry
       
   431     CMsvEntry* msvEntry = CMsvEntry::NewL(*session, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
   432     CleanupStack::PushL(msvEntry);
       
   433   
       
   434     // get default service
       
   435     TMsvId defaultServiceId = 0;
       
   436     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
   437     if (err)
       
   438         {
       
   439         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("SMS: Define a SMS centre first"));
       
   440         CleanupStack::PopAndDestroy(2);
       
   441         User::Leave(KErrNotFound);
       
   442         } 
       
   443     
       
   444     // set folder type
       
   445     switch (parameters.iFolderType)
       
   446         {
       
   447         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
   448         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
   449         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
   450         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
   451         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
   452         }
       
   453         
       
   454     // mtm takes ownership of entry context	
       
   455     CleanupStack::Pop(msvEntry);
       
   456     clientMtm->SetCurrentEntryL(msvEntry);    
       
   457     
       
   458     // create a new message
       
   459     clientMtm->CreateMessageL(defaultServiceId);
       
   460 
       
   461     // set the from field to sms header
       
   462     // !!! This will cause CRASH
       
   463     /*if (parameters.iFolderType == EInbox)
       
   464         {
       
   465         CSmsHeader* smsHeader = &clientMtm->SmsHeader();
       
   466         delete smsHeader; // <-- This will cause CRASH
       
   467         smsHeader = NULL;
       
   468         smsHeader = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, clientMtm->Body());        
       
   469         if( parameters.iSenderAddress )
       
   470             {
       
   471             smsHeader->SetFromAddressL( parameters.iSenderAddress->Des() );
       
   472             }
       
   473         else
       
   474             {
       
   475             smsHeader->SetFromAddressL(KEmpty);
       
   476             }
       
   477         }       */
       
   478 
       
   479     // set body
       
   480     clientMtm->Body().Reset();
       
   481     clientMtm->Body().InsertL(0, parameters.iMessageBodyText->Des());        
       
   482 
       
   483     // get the entry of the message
       
   484     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
   485 
       
   486     // set the details field
       
   487     if (parameters.iFolderType == EInbox)
       
   488         {
       
   489         SetSenderToEntryDetailsL(messageEntry, parameters, EFalse);        
       
   490         }
       
   491     else
       
   492         {
       
   493         SetRecipientToEntryDetailsL(messageEntry, parameters, EFalse);
       
   494         // Add all recipients to clientMtm
       
   495         // iRecipientArray is up-to-date so don't call AddRecipientsL here 
       
   496         for( TInt i = 0; i < iRecipientArray.Count(); i++ )
       
   497             {
       
   498             clientMtm->AddAddresseeL( iRecipientArray[i]->Des() );
       
   499             }
       
   500         }
       
   501 
       
   502     // set the sending state for outbox message
       
   503     // to avoid SMSMtmUI:15 panic in messages application
       
   504     if (parameters.iFolderType == EOutbox )
       
   505         {
       
   506         messageEntry.SetSendingState( KMsvSendStateWaiting );
       
   507         }
       
   508 
       
   509     // set the description field same as the first part of the message body
       
   510     messageEntry.iDescription.Set( parameters.iMessageBodyText->Des().Left(KSmsDescriptionLength) );
       
   511 
       
   512     // save the changes done above
       
   513     clientMtm->Entry().ChangeL(messageEntry);
       
   514 
       
   515     // save the message     
       
   516     clientMtm->SaveMessageL();
       
   517     	
       
   518 	// final fine tuning
       
   519     messageEntry.SetAttachment(EFalse);
       
   520     messageEntry.iDate.HomeTime();
       
   521     messageEntry.SetVisible(ETrue);
       
   522     messageEntry.SetInPreparation(EFalse);
       
   523    
       
   524     if (parameters.iCreateAsUnread)
       
   525         {
       
   526         messageEntry.SetUnread(ETrue);
       
   527         messageEntry.SetNew(ETrue);
       
   528         }
       
   529     else
       
   530         {
       
   531         messageEntry.SetUnread(EFalse);
       
   532         messageEntry.SetNew(EFalse);
       
   533         }
       
   534     
       
   535     messageEntry.SetComplete(ETrue);
       
   536     messageEntry.iServiceId = defaultServiceId;
       
   537     messageEntry.iRelatedId = 0;
       
   538     clientMtm->Entry().ChangeL(messageEntry);
       
   539 
       
   540     // id has been generated, store it for being able to delete
       
   541     // only entries created with Creator
       
   542     iEntryIds.AppendL( messageEntry.Id() );
       
   543     
       
   544     CleanupStack::PopAndDestroy(3); //session, registry, clientMtm
       
   545         
       
   546     return err;
       
   547 
       
   548     }
       
   549 
       
   550 //----------------------------------------------------------------------------
       
   551 
       
   552 TInt CCreatorMessages::CreateMMSEntryL(const CMessagesParameters& parameters)
       
   553     {
       
   554     LOGSTRING("Creator: CCreatorMessages::CreateMMSEntryL");
       
   555 
       
   556     TInt err = KErrNone;
       
   557         
       
   558     // init
       
   559     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
   560     CleanupStack::PushL(session);
       
   561     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
   562     CleanupStack::PushL(registry);
       
   563 
       
   564     // get the client mtm and return if it isn't supported in the system        
       
   565     CMmsClientMtm* clientMtm = NULL;
       
   566     TRAP(err, clientMtm = static_cast<CMmsClientMtm*>(registry->NewMtmL(KUidMsgTypeMultimedia)));
       
   567     if (err || !clientMtm)
       
   568         {
       
   569         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("MMS: Message type module not found"));
       
   570         CleanupStack::PopAndDestroy(2);
       
   571         User::Leave(KErrNotFound);
       
   572         }  
       
   573     CleanupStack::PushL(clientMtm);   
       
   574 
       
   575     // create a new object to access an existing entry
       
   576     CMsvEntry* msvEntry = CMsvEntry::NewL(*session, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
   577     CleanupStack::PushL(msvEntry);
       
   578   
       
   579     // get default service
       
   580     TMsvId defaultServiceId = 0;
       
   581     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
   582     if (err)
       
   583         {
       
   584         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("MMS: Define MMS settings first"));
       
   585         CleanupStack::PopAndDestroy(4);
       
   586         User::Leave(KErrNotFound);
       
   587         } 
       
   588     
       
   589     // set folder type
       
   590     switch (parameters.iFolderType)
       
   591         {
       
   592         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
   593         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
   594         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
   595         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
   596         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
   597         }
       
   598         
       
   599     // mtm takes ownership of entry context	
       
   600     CleanupStack::Pop(msvEntry);
       
   601     clientMtm->SetCurrentEntryL(msvEntry);    
       
   602     
       
   603     // create a new message
       
   604     clientMtm->CreateMessageL(defaultServiceId);
       
   605 
       
   606     // set subject
       
   607     clientMtm->SetSubjectL( parameters.iMessageSubject->Des() );
       
   608             
       
   609     // set some mms defaults
       
   610     clientMtm->SetMessageClass(EMmsClassPersonal);
       
   611     clientMtm->SetExpiryInterval(86400);
       
   612     clientMtm->SetDeliveryTimeInterval(3600);
       
   613     clientMtm->SetMessagePriority(EMmsPriorityLow);
       
   614     clientMtm->SetSenderVisibility(EMmsMaximumSenderVisibility);
       
   615     clientMtm->SetDeliveryReport(EMmsDeliveryReportYes);
       
   616     clientMtm->SetReadReply(EMmsReadReplyYes);        
       
   617     
       
   618     // set the sender / addressee field
       
   619     if (parameters.iFolderType == EInbox)
       
   620         {        
       
   621         AddMtmSenderL(*clientMtm, parameters, EFalse);                
       
   622         }
       
   623     
       
   624     // Add all recipients to clientMtm
       
   625     AddRecipientsL( *clientMtm, parameters, EFalse );  
       
   626         
       
   627     // get an access to the message store
       
   628     CMsvStore* store = msvEntry->EditStoreL();
       
   629     CleanupStack::PushL(store);                  
       
   630    
       
   631 
       
   632     // set body as an attachment
       
   633     CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
       
   634     CleanupStack::PushL(mimeHeaders);
       
   635     mimeHeaders->SetContentTypeL( _L8("text") );
       
   636     mimeHeaders->SetContentSubTypeL( _L8("plain") );
       
   637     mimeHeaders->SetMimeCharset( KMmsUtf8 );
       
   638     mimeHeaders->SetSuggestedFilenameL( _L("body.txt") );
       
   639     
       
   640     MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   641     CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   642     CleanupStack::PushL(attachmentInfo);
       
   643     attachmentInfo->SetAttachmentNameL( _L("body.txt") );
       
   644     attachmentInfo->SetMimeTypeL( _L8("text/plain") );
       
   645     mimeHeaders->StoreL( *attachmentInfo );
       
   646     
       
   647     RFile textFile;
       
   648 
       
   649     CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   650     attachMan.CreateAttachmentL(_L("body.txt"), textFile, attachmentInfo, waiter->iStatus );
       
   651     CleanupStack::Pop(); // waiter
       
   652     CleanupStack::Pop(); // attachmentInfo
       
   653     CleanupStack::PushL(waiter);
       
   654     waiter->StartAndWait();
       
   655     CleanupStack::PopAndDestroy(waiter);        
       
   656    
       
   657     HBufC8* tempBuf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( parameters.iMessageBodyText->Des() );
       
   658     CleanupStack::PushL(tempBuf);
       
   659     textFile.Write( tempBuf->Des() );        
       
   660     textFile.Close();
       
   661     CleanupStack::PopAndDestroy(); //tempBuf
       
   662     
       
   663     CleanupStack::PopAndDestroy(); //mimeHeaders
       
   664 
       
   665     
       
   666     // get the entry of the message
       
   667     TMsvEntry messageEntry = clientMtm->Entry().Entry();        
       
   668     
       
   669     // set the details field
       
   670     if (parameters.iFolderType == EInbox)
       
   671         {
       
   672         SetSenderToEntryDetailsL(messageEntry, parameters, EFalse);        
       
   673         }
       
   674     else
       
   675         {
       
   676         SetRecipientToEntryDetailsL(messageEntry, parameters, EFalse);
       
   677         }    
       
   678 
       
   679     // set the description field same as the message subject
       
   680     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
   681 
       
   682     // save the changes done above
       
   683     clientMtm->Entry().ChangeL(messageEntry);        
       
   684     
       
   685 
       
   686       // save the attachments
       
   687     HandleAttachementsL(parameters, store, err );
       
   688 //    for (TInt i=0; i<parameters.iAttachments->Count(); i++)
       
   689 //        {
       
   690 //        TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i) );
       
   691 //
       
   692 //        TParse parser;
       
   693 //        parser.Set(sourceFileName, NULL, NULL);
       
   694 //        TFileName shortFileName = parser.NameAndExt();
       
   695 //
       
   696 //        // get the mime type
       
   697 //        RApaLsSession ls;
       
   698 //        User::LeaveIfError(ls.Connect());
       
   699 //        CleanupClosePushL<RApaLsSession>(ls);
       
   700 //        TUid appUid;
       
   701 //        TDataType dataType;
       
   702 //        ls.AppForDocument(sourceFileName, appUid, dataType);
       
   703 //        CleanupStack::PopAndDestroy(); //ls
       
   704 //        TPtrC8 mimeType = dataType.Des8();
       
   705 //        
       
   706 //        // attachment settings
       
   707 //        MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   708 //        CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   709 //        attachmentInfo->SetAttachmentNameL( shortFileName );        
       
   710 //        attachmentInfo->SetMimeTypeL( mimeType );        
       
   711 //
       
   712 //        // save
       
   713 //        CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   714 //        
       
   715 //        TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
   716 //        if (err == KErrNone)
       
   717 //            waiter->StartAndWait();
       
   718 //        else
       
   719 //            LOGSTRING2("Creator: CCreatorMessages::CreateMMSEntryL failed to attach %S", &sourceFileName);
       
   720 //
       
   721 //        CleanupStack::PopAndDestroy(waiter);  
       
   722 //        }
       
   723 
       
   724     // save the changes made to the message store
       
   725     store->CommitL();
       
   726     CleanupStack::PopAndDestroy(store);   
       
   727            
       
   728     
       
   729     // save the message      
       
   730     clientMtm->SaveMessageL();
       
   731     	
       
   732 	// final fine tuning
       
   733 	messageEntry.SetAttachment(ETrue);
       
   734     messageEntry.iDate.HomeTime();
       
   735     messageEntry.SetVisible(ETrue);
       
   736     messageEntry.SetInPreparation(EFalse);
       
   737     if (parameters.iCreateAsUnread)
       
   738         {
       
   739         messageEntry.SetUnread(ETrue);
       
   740         messageEntry.SetNew(ETrue);
       
   741         }
       
   742     else
       
   743         {
       
   744         messageEntry.SetUnread(EFalse);
       
   745         messageEntry.SetNew(EFalse);
       
   746         }
       
   747     messageEntry.SetComplete(ETrue);
       
   748     messageEntry.iServiceId = defaultServiceId;
       
   749     messageEntry.iRelatedId = 0;
       
   750     
       
   751     if (parameters.iFolderType == EDrafts) 
       
   752         messageEntry.SetReadOnly(EFalse);
       
   753     else
       
   754         messageEntry.SetReadOnly(ETrue);
       
   755 
       
   756 	messageEntry.iMtmData1 = KMmsMessageMRetrieveConf | KMmsMessageMobileTerminated;
       
   757 	
       
   758     clientMtm->Entry().ChangeL(messageEntry);
       
   759     
       
   760     // id has been generated, store it for being able to delete
       
   761     // only entries created with Creator
       
   762     iEntryIds.AppendL( messageEntry.Id() );
       
   763     
       
   764     CleanupStack::PopAndDestroy(3); //session, registry, clientMtm        
       
   765         
       
   766 
       
   767     return err;
       
   768     }
       
   769 
       
   770 //----------------------------------------------------------------------------
       
   771 void CCreatorMessages::HandleAttachementsL(const CMessagesParameters& parameters, CMsvStore* store, TInt err )
       
   772     {
       
   773     // save the attachments (added with id's)
       
   774   for (TInt i=0; i<parameters.iAttachments->Count(); i++)
       
   775       {
       
   776       TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i) );
       
   777       HandleAttachementL(store, err, sourceFileName );
       
   778 
       
   779       }    
       
   780   //Adding attachmentpaths
       
   781   for (TInt i=0; i<parameters.iAttachmentPaths.Count(); i++)
       
   782       {
       
   783       HBufC* point = parameters.iAttachmentPaths[i];
       
   784       TFileName sourceFileName(point->Des());      
       
   785       HandleAttachementL(store, err, sourceFileName );
       
   786       }
       
   787     }
       
   788 //----------------------------------------------------------------------------
       
   789 
       
   790 void CCreatorMessages::HandleAttachementL(CMsvStore* store, TInt err, TFileName& sourceFileName )
       
   791     {
       
   792     TParse parser;
       
   793     parser.Set(sourceFileName, NULL, NULL);
       
   794     TFileName shortFileName = parser.NameAndExt();
       
   795 
       
   796     // get the mime type
       
   797     RApaLsSession ls;
       
   798     User::LeaveIfError(ls.Connect());
       
   799     CleanupClosePushL<RApaLsSession>(ls);
       
   800     TUid appUid;
       
   801     TDataType dataType;
       
   802     ls.AppForDocument(sourceFileName, appUid, dataType);
       
   803     CleanupStack::PopAndDestroy(); //ls
       
   804     TPtrC8 mimeType = dataType.Des8();
       
   805     
       
   806     // attachment settings
       
   807     MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   808     CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   809     CleanupStack::PushL(attachmentInfo);
       
   810     attachmentInfo->SetAttachmentNameL( shortFileName );        
       
   811     attachmentInfo->SetMimeTypeL( mimeType );
       
   812     
       
   813     if ( mimeType == _L8("text/plain") )
       
   814         {
       
   815         // CMsvMimeHeaders needs to be stored in case of text file 
       
   816         CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
       
   817         CleanupStack::PushL(mimeHeaders);
       
   818         mimeHeaders->SetContentTypeL( _L8("text") );
       
   819         mimeHeaders->SetContentSubTypeL( _L8("plain") );
       
   820         mimeHeaders->SetMimeCharset( KMmsUtf8 );
       
   821         mimeHeaders->StoreL( *attachmentInfo );
       
   822         CleanupStack::PopAndDestroy( mimeHeaders );
       
   823         }
       
   824 
       
   825     // save
       
   826     
       
   827     CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   828     TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
   829     if (err == KErrNone)
       
   830     	{
       
   831         waiter->StartAndWait();
       
   832         CleanupStack::PopAndDestroy(waiter);
       
   833         CleanupStack::Pop(); // attachmentInfo, the ownership is transferred
       
   834     	}
       
   835     else
       
   836     	{
       
   837     	CleanupStack::PopAndDestroy(waiter);
       
   838     	CleanupStack::PopAndDestroy(); // attachmentInfo, ownership is not transferred (leave occurs)
       
   839         LOGSTRING2("Creator: CCreatorMessages::HandleAttachementsL failed to attach %S", &sourceFileName);
       
   840     	}
       
   841     }
       
   842       //----------------------------------------------------------------------------
       
   843 
       
   844 TInt CCreatorMessages::CreateAMSEntryL(const CMessagesParameters& parameters)
       
   845     {
       
   846     LOGSTRING("Creator: CCreatorMessages::CreateAMSEntryL");
       
   847 
       
   848     TInt err = KErrNone;
       
   849 
       
   850         
       
   851     // init
       
   852     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
   853     CleanupStack::PushL(session);
       
   854     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
   855     CleanupStack::PushL(registry);
       
   856 
       
   857     // get the client mtm and return if it isn't supported in the system        
       
   858     CMmsClientMtm* clientMtm = NULL;
       
   859     TRAP(err, clientMtm = static_cast<CMmsClientMtm*>(registry->NewMtmL(KUidMsgTypeMultimedia)));
       
   860     if (err || !clientMtm)
       
   861         {
       
   862         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("MMS: Message type module not found"));
       
   863         CleanupStack::PopAndDestroy(2);
       
   864         User::Leave(KErrNotFound);
       
   865         }  
       
   866     CleanupStack::PushL(clientMtm);   
       
   867 
       
   868     // create a new object to access an existing entry
       
   869     CMsvEntry* msvEntry = CMsvEntry::NewL(*session, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
   870     CleanupStack::PushL(msvEntry);
       
   871   
       
   872     // get default service
       
   873     TMsvId defaultServiceId = 0;
       
   874     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
   875     if (err)
       
   876         {
       
   877         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("MMS: Define MMS settings first"));
       
   878         CleanupStack::PopAndDestroy(2);
       
   879         User::Leave(KErrNotFound);
       
   880         } 
       
   881     
       
   882     // set folder type
       
   883     switch (parameters.iFolderType)
       
   884         {
       
   885         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
   886         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
   887         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
   888         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
   889         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
   890         }
       
   891         
       
   892     // mtm takes ownership of entry context	
       
   893     CleanupStack::Pop(msvEntry);
       
   894     clientMtm->SetCurrentEntryL(msvEntry);    
       
   895     
       
   896     // create a new message
       
   897     clientMtm->CreateMessageL(defaultServiceId);
       
   898 
       
   899     // set subject
       
   900     clientMtm->SetSubjectL(parameters.iMessageSubject->Des() );
       
   901             
       
   902     // set some mms defaults
       
   903     clientMtm->SetMessageClass(EMmsClassPersonal);
       
   904     clientMtm->SetExpiryInterval(86400);
       
   905     clientMtm->SetDeliveryTimeInterval(3600);
       
   906     clientMtm->SetMessagePriority(EMmsPriorityLow);
       
   907     clientMtm->SetSenderVisibility(EMmsMaximumSenderVisibility);
       
   908     clientMtm->SetDeliveryReport(EMmsDeliveryReportYes);
       
   909     clientMtm->SetReadReply(EMmsReadReplyYes);        
       
   910     
       
   911     // set the sender / addressee field
       
   912     if (parameters.iFolderType == EInbox)
       
   913         {
       
   914         AddMtmSenderL(*clientMtm, parameters, EFalse);                
       
   915         }
       
   916 
       
   917     // Add all recipients to clientMtm
       
   918     AddRecipientsL( *clientMtm, parameters, EFalse );
       
   919     
       
   920         
       
   921     // get an access to the message store
       
   922     CMsvStore* store = msvEntry->EditStoreL();
       
   923     CleanupStack::PushL(store);                  
       
   924    
       
   925     // get the entry of the message
       
   926     TMsvEntry messageEntry = clientMtm->Entry().Entry();        
       
   927     
       
   928     // set the details field
       
   929     if (parameters.iFolderType == EInbox)
       
   930         {
       
   931         SetSenderToEntryDetailsL(messageEntry, parameters, EFalse);        
       
   932         }  
       
   933     else
       
   934         {
       
   935         SetRecipientToEntryDetailsL(messageEntry, parameters, EFalse);
       
   936         }
       
   937 
       
   938     // set the description field same as the message subject
       
   939     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
   940     messageEntry.iBioType = KUidMsgSubTypeMmsAudioMsg.iUid;
       
   941     
       
   942     // save the changes done above
       
   943     clientMtm->Entry().ChangeL(messageEntry);        
       
   944     
       
   945 
       
   946     TFileName sourceFileName = iEngine->TestDataPathL( CCreatorEngine::EAMR_20kB );
       
   947     TParse parser;
       
   948     parser.Set(sourceFileName, NULL, NULL);
       
   949     TFileName shortFileName = parser.NameAndExt();
       
   950 
       
   951     // get the mime type
       
   952     RApaLsSession ls;
       
   953     User::LeaveIfError(ls.Connect());
       
   954     CleanupClosePushL<RApaLsSession>(ls);
       
   955     TUid appUid;
       
   956     TDataType dataType;
       
   957     ls.AppForDocument(sourceFileName, appUid, dataType);
       
   958     CleanupStack::PopAndDestroy(); //ls
       
   959     TPtrC8 mimeType = dataType.Des8();
       
   960         
       
   961     // attachment settings
       
   962     MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   963     CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   964     attachmentInfo->SetAttachmentNameL( shortFileName );        
       
   965     attachmentInfo->SetMimeTypeL( mimeType );        
       
   966 
       
   967     // save
       
   968     CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   969       
       
   970     TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
   971     if (err == KErrNone)
       
   972         waiter->StartAndWait();
       
   973     else
       
   974         LOGSTRING2("Creator: CCreatorMessages::CreateAMSEntryL failed to attach %S", &sourceFileName);
       
   975 
       
   976     CleanupStack::PopAndDestroy(waiter);  
       
   977 
       
   978     // save the changes made to the message store
       
   979     store->CommitL();
       
   980     CleanupStack::PopAndDestroy(store);   
       
   981            
       
   982     
       
   983     // save the message      
       
   984     clientMtm->SaveMessageL();
       
   985     	
       
   986 	// final fine tuning
       
   987 	messageEntry.SetAttachment(ETrue);
       
   988     messageEntry.iDate.HomeTime();
       
   989     messageEntry.SetVisible(ETrue);
       
   990     messageEntry.SetInPreparation(EFalse);
       
   991     if (parameters.iCreateAsUnread)
       
   992         {
       
   993         messageEntry.SetUnread(ETrue);
       
   994         messageEntry.SetNew(ETrue);
       
   995         }
       
   996     else
       
   997         {
       
   998         messageEntry.SetUnread(EFalse);
       
   999         messageEntry.SetNew(EFalse);
       
  1000         }
       
  1001     messageEntry.SetComplete(ETrue);
       
  1002     messageEntry.iServiceId = defaultServiceId;
       
  1003     messageEntry.iRelatedId = 0;
       
  1004     
       
  1005     if (parameters.iFolderType == EDrafts) 
       
  1006         messageEntry.SetReadOnly(EFalse);
       
  1007     else
       
  1008         messageEntry.SetReadOnly(ETrue);
       
  1009 
       
  1010 	messageEntry.iMtmData1 = KMmsMessageMRetrieveConf | KMmsMessageMobileTerminated;
       
  1011 	
       
  1012     clientMtm->Entry().ChangeL(messageEntry);
       
  1013     
       
  1014     // id has been generated, store it for being able to delete
       
  1015     // only entries created with Creator
       
  1016     iEntryIds.AppendL( messageEntry.Id() );
       
  1017     
       
  1018     CleanupStack::PopAndDestroy(3); //session, registry, clientMtm        
       
  1019         
       
  1020 
       
  1021     return err;
       
  1022     }
       
  1023 
       
  1024 //----------------------------------------------------------------------------
       
  1025 
       
  1026 TInt CCreatorMessages::CreateEmailEntryL(const CMessagesParameters& parameters)
       
  1027     {
       
  1028     LOGSTRING("Creator: CCreatorMessages::CreateEmailEntryL");
       
  1029 
       
  1030     TInt err = KErrNone;
       
  1031 
       
  1032     // init
       
  1033     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
  1034     CleanupStack::PushL(session);
       
  1035     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
  1036     CleanupStack::PushL(registry);
       
  1037     
       
  1038     // get the client mtm and return if it isn't supported in the system        
       
  1039     CSmtpClientMtm* clientMtm = NULL;
       
  1040     TRAP(err, clientMtm = static_cast<CSmtpClientMtm*>(registry->NewMtmL(KUidMsgTypeSMTP)));
       
  1041     
       
  1042     if (err || !clientMtm)
       
  1043         {
       
  1044         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("Email: Message type module not found"));
       
  1045         CleanupStack::PopAndDestroy(2);
       
  1046         User::Leave(KErrNotFound);
       
  1047         }  
       
  1048     CleanupStack::PushL(clientMtm);   
       
  1049 
       
  1050     // create a new object to access an existing entry
       
  1051     CMsvEntry* msvEntry = CMsvEntry::NewL(*session, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1052     CleanupStack::PushL(msvEntry);
       
  1053   
       
  1054     // get default service
       
  1055     TMsvId defaultServiceId(0);
       
  1056     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
  1057     if (err)
       
  1058         {
       
  1059         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("Email: Define a mailbox first"));
       
  1060         CleanupStack::PopAndDestroy(2);
       
  1061         User::Leave(KErrNotFound);
       
  1062         } 
       
  1063                 
       
  1064     // set folder type
       
  1065     switch (parameters.iFolderType)
       
  1066         {
       
  1067         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1068         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1069         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1070         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1071         case EMailbox:  { msvEntry->SetEntryL(iUserSelectedMailbox);          break; }
       
  1072         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1073         }
       
  1074         
       
  1075     // mtm takes ownership of entry context	
       
  1076     CleanupStack::Pop(msvEntry);
       
  1077     clientMtm->SetCurrentEntryL(msvEntry); 
       
  1078 
       
  1079     // create a new message
       
  1080     clientMtm->CreateMessageL(defaultServiceId);
       
  1081 
       
  1082     // set subject
       
  1083     clientMtm->SetSubjectL( parameters.iMessageSubject->Des() );
       
  1084     
       
  1085     // set body
       
  1086     clientMtm->Body().Reset();
       
  1087     clientMtm->Body().InsertL(0, parameters.iMessageBodyText->Des()); 
       
  1088 
       
  1089     // get the entry of the message
       
  1090     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
  1091     
       
  1092     // set the address fields
       
  1093     if (parameters.iFolderType == EInbox)
       
  1094         {
       
  1095         AddSenderToMtmAddresseeL(*clientMtm, parameters, ETrue );
       
  1096         SetSenderToEntryDetailsL(messageEntry, parameters, ETrue);
       
  1097         messageEntry.iMtm = KUidMsgTypeIMAP4;  // or any other than KUidMsgTypeSMTP to display 'from' field instead of 'to' field 
       
  1098         }
       
  1099     else
       
  1100         {
       
  1101         // Add all recipients to clientMtm
       
  1102         AddRecipientsL( *clientMtm, parameters, ETrue );
       
  1103         SetRecipientToEntryDetailsL(messageEntry, parameters, EFalse);        
       
  1104         }
       
  1105 
       
  1106     // set the description field same as the message subject
       
  1107     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1108 
       
  1109     // save the changes done above
       
  1110     clientMtm->Entry().ChangeL(messageEntry);
       
  1111     
       
  1112     // get an access to the message store
       
  1113     CMsvStore* store = msvEntry->EditStoreL();
       
  1114     CleanupStack::PushL(store); 
       
  1115     
       
  1116     // save the attachments
       
  1117     HandleAttachementsL(parameters, store, err);
       
  1118 //    for (TInt i=0; i<parameters.iAttachments->Count(); i++)
       
  1119 //        {
       
  1120 //        TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i) );
       
  1121 //
       
  1122 //        TParse parser;
       
  1123 //        parser.Set(sourceFileName, NULL, NULL);
       
  1124 //        TFileName shortFileName = parser.NameAndExt();
       
  1125 //
       
  1126 //        // get the mime type
       
  1127 //        RApaLsSession ls;
       
  1128 //        User::LeaveIfError(ls.Connect());
       
  1129 //        CleanupClosePushL<RApaLsSession>(ls);
       
  1130 //        TUid appUid;
       
  1131 //        TDataType dataType;
       
  1132 //        ls.AppForDocument(sourceFileName, appUid, dataType);
       
  1133 //        CleanupStack::PopAndDestroy(); //ls
       
  1134 //        TPtrC8 mimeType = dataType.Des8();
       
  1135 //        
       
  1136 //        // attachment settings
       
  1137 //        MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
  1138 //        CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
  1139 //        attachmentInfo->SetAttachmentNameL( shortFileName );        
       
  1140 //        attachmentInfo->SetMimeTypeL( mimeType );        
       
  1141 //
       
  1142 //        // save
       
  1143 //        CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
  1144 //
       
  1145 //        TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
  1146 //        if (err == KErrNone)
       
  1147 //            waiter->StartAndWait();
       
  1148 //        else
       
  1149 //            LOGSTRING2("Creator: CCreatorMessages::CreateEmailEntryL failed to attach %S", &sourceFileName);
       
  1150 //
       
  1151 //        CleanupStack::PopAndDestroy(waiter);  
       
  1152 //        }
       
  1153 
       
  1154     // save the changes made to the message store
       
  1155     store->CommitL();
       
  1156     CleanupStack::PopAndDestroy(store); 
       
  1157             
       
  1158     // save the message      
       
  1159     clientMtm->SaveMessageL();
       
  1160     	
       
  1161 	// final fine tuning
       
  1162 	TMsvEmailEntry temailEntry = static_cast<TMsvEmailEntry>(messageEntry);
       
  1163     temailEntry.SetMessageFolderType(EFolderTypeUnknown);
       
  1164     temailEntry.SetDisconnectedOperation(ENoDisconnectedOperations);
       
  1165     temailEntry.SetEncrypted(EFalse);
       
  1166     temailEntry.SetSigned(EFalse);
       
  1167     temailEntry.SetVCard(EFalse);
       
  1168     temailEntry.SetVCalendar(EFalse);
       
  1169     temailEntry.SetReceipt(EFalse);
       
  1170     temailEntry.SetMHTMLEmail(EFalse);
       
  1171     temailEntry.SetBodyTextComplete(ETrue);
       
  1172     
       
  1173 	if (parameters.iAttachments->Count() > 0)
       
  1174         temailEntry.SetAttachment(ETrue);
       
  1175     else
       
  1176         temailEntry.SetAttachment(EFalse);
       
  1177 	
       
  1178     temailEntry.iDate.HomeTime();
       
  1179     temailEntry.SetVisible(ETrue);
       
  1180     temailEntry.SetInPreparation(EFalse);
       
  1181     if (parameters.iCreateAsUnread)
       
  1182         {
       
  1183         temailEntry.SetUnread(ETrue);
       
  1184         temailEntry.SetNew(ETrue);
       
  1185         }
       
  1186     else
       
  1187         {
       
  1188         temailEntry.SetUnread(EFalse);
       
  1189         temailEntry.SetNew(EFalse);
       
  1190         }
       
  1191     temailEntry.SetComplete(ETrue);
       
  1192     temailEntry.iServiceId = defaultServiceId;
       
  1193     temailEntry.iRelatedId = 0;
       
  1194     
       
  1195     clientMtm->Entry().ChangeL(temailEntry);
       
  1196 
       
  1197     // reset email headers
       
  1198     CImHeader* header = CImHeader::NewLC();
       
  1199     CMsvStore* msvStore = msvEntry->EditStoreL();
       
  1200     CleanupStack::PushL(msvStore);
       
  1201     header->RestoreL(*msvStore);
       
  1202     header->SetSubjectL( parameters.iMessageSubject->Des() );
       
  1203     if( iSenderArray.Count() == 0 )
       
  1204         {
       
  1205         GetSendersL(iSenderArray, parameters, ETrue, KUndef );
       
  1206         }
       
  1207     
       
  1208     if( iSenderArray.Count() > 0 )
       
  1209         {
       
  1210         TInt rndNum = iEngine->RandomNumber( iSenderArray.Count() );
       
  1211         header->SetFromL(iSenderArray[rndNum]->Des());
       
  1212         }
       
  1213     else
       
  1214         {
       
  1215         header->SetFromL( parameters.iSenderAddress->Des() );
       
  1216         }
       
  1217     if( parameters.iRecipientAddress->Length() > 0 )
       
  1218         {
       
  1219         header->SetReceiptAddressL( parameters.iRecipientAddress->Des() );
       
  1220         }
       
  1221     else if( parameters.iRecipientAddressArray.Count() > 0 )
       
  1222         {
       
  1223         header->SetReceiptAddressL( parameters.iRecipientAddressArray[0]->Des());
       
  1224         }
       
  1225     
       
  1226     header->StoreL( *msvStore );
       
  1227     msvStore->CommitL();
       
  1228     CleanupStack::PopAndDestroy(2); // msvStore, header
       
  1229     
       
  1230     // id has been generated, store it for being able to delete
       
  1231     // only entries created with Creator
       
  1232     iEntryIds.AppendL( messageEntry.Id() );
       
  1233     
       
  1234     CleanupStack::PopAndDestroy(3); //session, registry, clientMtm 
       
  1235 
       
  1236     return err;
       
  1237     }
       
  1238 
       
  1239 //----------------------------------------------------------------------------
       
  1240 
       
  1241 TInt CCreatorMessages::CreateSmartMessageEntryL(const CMessagesParameters& parameters)
       
  1242     {
       
  1243     LOGSTRING("Creator: CCreatorMessages::CreateSmartMessageEntryL");
       
  1244 
       
  1245     TInt err = KErrNone;
       
  1246 
       
  1247     // init
       
  1248     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
  1249     CleanupStack::PushL(session);
       
  1250     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
  1251     CleanupStack::PushL(registry);
       
  1252 
       
  1253     // get the client mtm and return if it isn't supported in the system        
       
  1254     CSmsClientMtm* clientMtm = NULL;
       
  1255     TRAP(err, clientMtm = static_cast<CSmsClientMtm*>(registry->NewMtmL(KUidMsgTypeSMS)));
       
  1256     if (err || !clientMtm)
       
  1257         {
       
  1258         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("BIO: Message type module not found"));
       
  1259         CleanupStack::PopAndDestroy(2);
       
  1260         User::Leave(KErrNotFound);
       
  1261         }  
       
  1262     CleanupStack::PushL(clientMtm);   
       
  1263 
       
  1264     // create a new object to access an existing entry
       
  1265     CMsvEntry* msvEntry = CMsvEntry::NewL(*session, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1266     CleanupStack::PushL(msvEntry);
       
  1267   
       
  1268     // get default service
       
  1269     TMsvId defaultServiceId = 0;
       
  1270     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
  1271     if (err)
       
  1272         {
       
  1273         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("SMS: Define a SMS centre first"));
       
  1274         CleanupStack::PopAndDestroy(2);
       
  1275         User::Leave(KErrNotFound);
       
  1276         } 
       
  1277     
       
  1278     // set folder type
       
  1279     switch (parameters.iFolderType)
       
  1280         {
       
  1281         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1282         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1283         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1284         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1285         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1286         }
       
  1287         
       
  1288     // mtm takes ownership of entry context	
       
  1289     CleanupStack::Pop(msvEntry);
       
  1290     clientMtm->SetCurrentEntryL(msvEntry);    
       
  1291     
       
  1292     // create a new message
       
  1293     clientMtm->CreateMessageL(defaultServiceId);
       
  1294 
       
  1295      // set the from field to sms header
       
  1296     if (parameters.iFolderType == EInbox)
       
  1297         {
       
  1298         CSmsHeader* smsHeader = &clientMtm->SmsHeader();
       
  1299         delete smsHeader;
       
  1300         smsHeader = NULL;
       
  1301         smsHeader = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, clientMtm->Body());
       
  1302         if( parameters.iSenderAddress )
       
  1303             {
       
  1304             smsHeader->SetFromAddressL( parameters.iSenderAddress->Des() );
       
  1305             }
       
  1306         else
       
  1307             {
       
  1308             smsHeader->SetFromAddressL(KEmpty);
       
  1309             }
       
  1310         }       
       
  1311 
       
  1312     // set body, the BIO message itself
       
  1313     clientMtm->Body().Reset();
       
  1314     clientMtm->Body().InsertL(0, _L("Business Card\nTester Mike\nThe Company Ltd.\nSoftware Engineer\ntel +358 66 1234567\n")); 
       
  1315 
       
  1316     // get the entry of the message
       
  1317     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
  1318 
       
  1319     // TO-DO: Add support for all BIO messages, currently just insert a business card message ... :
       
  1320     // set the message type
       
  1321     // parameters.iBIOMessageType ...
       
  1322     clientMtm->BioTypeChangedL(KUidBIOBusinessCardMsg);
       
  1323     messageEntry.iBioType = KUidBIOBusinessCardMsg.iUid;
       
  1324 
       
  1325     // set the details field
       
  1326     if (parameters.iFolderType == EInbox)
       
  1327         {
       
  1328         SetSenderToEntryDetailsL(messageEntry, parameters, EFalse);        
       
  1329         }        
       
  1330     else
       
  1331         {
       
  1332         SetRecipientToEntryDetailsL(messageEntry, parameters, EFalse);
       
  1333         }
       
  1334 
       
  1335     // set the subject line
       
  1336     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1337 
       
  1338     // set correct MTM type
       
  1339     messageEntry.iMtm= KUidBIOMessageTypeMtm;
       
  1340 
       
  1341     // save the changes done above
       
  1342     clientMtm->Entry().ChangeL(messageEntry);
       
  1343 
       
  1344     // save the message     
       
  1345     clientMtm->SaveMessageL();
       
  1346     	
       
  1347 	// final fine tuning
       
  1348     messageEntry.SetAttachment(EFalse);
       
  1349     messageEntry.iDate.HomeTime();
       
  1350     messageEntry.SetVisible(ETrue);
       
  1351     messageEntry.SetInPreparation(EFalse);
       
  1352     if (parameters.iCreateAsUnread)
       
  1353         {
       
  1354         messageEntry.SetUnread(ETrue);
       
  1355         messageEntry.SetNew(ETrue);
       
  1356         }
       
  1357     else
       
  1358         {
       
  1359         messageEntry.SetUnread(EFalse);
       
  1360         messageEntry.SetNew(EFalse);
       
  1361         }
       
  1362     messageEntry.SetComplete(ETrue);
       
  1363     messageEntry.iServiceId = defaultServiceId;
       
  1364     messageEntry.iRelatedId = 0;
       
  1365     clientMtm->Entry().ChangeL(messageEntry);
       
  1366     
       
  1367     // id has been generated, store it for being able to delete
       
  1368     // only entries created with Creator
       
  1369     iEntryIds.AppendL( messageEntry.Id() );
       
  1370     
       
  1371     CleanupStack::PopAndDestroy(3); //session, registry, clientMtm
       
  1372         
       
  1373     
       
  1374     return err;
       
  1375     }
       
  1376 
       
  1377 //----------------------------------------------------------------------------
       
  1378 
       
  1379 TInt CCreatorMessages::CreateObexEntryL(TUid aMtm, const CMessagesParameters& parameters)
       
  1380     {
       
  1381     LOGSTRING("Creator: CCreatorMessages::CreateObexEntryL");
       
  1382 
       
  1383     TInt err = KErrNone;
       
  1384 
       
  1385     // init
       
  1386     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
  1387     CleanupStack::PushL(session);
       
  1388     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
  1389     CleanupStack::PushL(registry);
       
  1390 
       
  1391     // get the client mtm and return if it isn't supported in the system        
       
  1392     CObexClientMtm* clientMtm = NULL;
       
  1393     TRAP(err, clientMtm = static_cast<CObexClientMtm*>(registry->NewMtmL(aMtm)));
       
  1394     if (err || !clientMtm)
       
  1395         {
       
  1396         iEngine->GetEngineWrapper()->ShowErrorMessage(_L("Obex: Message type module not found"));
       
  1397         CleanupStack::PopAndDestroy(2);
       
  1398         User::Leave(KErrNotFound);
       
  1399         }  
       
  1400     CleanupStack::PushL(clientMtm);   
       
  1401 
       
  1402     // create a new object to access an existing entry
       
  1403     CMsvEntry* msvEntry = CMsvEntry::NewL(*session, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1404     CleanupStack::PushL(msvEntry);
       
  1405   
       
  1406     // define default service
       
  1407     TMsvId defaultServiceId = 0;
       
  1408     
       
  1409     // set folder type
       
  1410     switch (parameters.iFolderType)
       
  1411         {
       
  1412         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1413         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1414         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1415         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1416         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1417         }
       
  1418         
       
  1419     // mtm takes ownership of entry context	
       
  1420     CleanupStack::Pop(msvEntry);
       
  1421     clientMtm->SetCurrentEntryL(msvEntry);    
       
  1422     
       
  1423     // create a new message
       
  1424     clientMtm->CreateMessageL(defaultServiceId);
       
  1425 
       
  1426     // get the entry of the message
       
  1427     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
  1428 
       
  1429     // set subject
       
  1430     clientMtm->SetSubjectL( parameters.iMessageSubject->Des() );
       
  1431     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1432 
       
  1433     // set body, must be empty for obex messages
       
  1434     clientMtm->Body().Reset();
       
  1435 
       
  1436     // set the details field and
       
  1437     if (parameters.iFolderType == EInbox)
       
  1438         {
       
  1439         SetSenderToEntryDetailsL(messageEntry, parameters, EFalse);
       
  1440         }        
       
  1441     else
       
  1442         {
       
  1443         SetRecipientToEntryDetailsL(messageEntry, parameters, EFalse);
       
  1444         }
       
  1445     
       
  1446     // set mtm
       
  1447     messageEntry.iMtm = aMtm;
       
  1448     messageEntry.iType = KUidMsvMessageEntry;
       
  1449     messageEntry.iServiceId = KMsvUnknownServiceIndexEntryId;
       
  1450 
       
  1451     // save the changes done above
       
  1452     clientMtm->Entry().ChangeL(messageEntry);
       
  1453 
       
  1454     // save the message      
       
  1455     clientMtm->SaveMessageL();
       
  1456     	
       
  1457 	// final fine tuning
       
  1458     messageEntry.iDate.HomeTime();
       
  1459     messageEntry.SetVisible(ETrue);
       
  1460     messageEntry.SetInPreparation(EFalse);
       
  1461     if (parameters.iCreateAsUnread)
       
  1462         {
       
  1463         messageEntry.SetUnread(ETrue);
       
  1464         messageEntry.SetNew(ETrue);
       
  1465         }
       
  1466     else
       
  1467         {
       
  1468         messageEntry.SetUnread(EFalse);
       
  1469         messageEntry.SetNew(EFalse);
       
  1470         }
       
  1471     messageEntry.SetComplete(ETrue);
       
  1472     clientMtm->Entry().ChangeL(messageEntry);
       
  1473     
       
  1474     // save the attachment
       
  1475     if (parameters.iAttachments->Count() >= 1)
       
  1476         {
       
  1477         // create a new entry for the attachment
       
  1478         TMsvEntry attachTEntry;
       
  1479         attachTEntry.iType      = KUidMsvAttachmentEntry;
       
  1480         attachTEntry.iServiceId = KMsvUnknownServiceIndexEntryId;   
       
  1481         attachTEntry.iMtm       = KUidMsgTypeBt; //save as bt message
       
  1482         
       
  1483         msvEntry->CreateL(attachTEntry);
       
  1484         
       
  1485         CMsvEntry* attachEntry = session->GetEntryL(attachTEntry.Id());
       
  1486         clientMtm->SetCurrentEntryL(attachEntry);
       
  1487                 
       
  1488         // get source file
       
  1489         TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(0) );
       
  1490 
       
  1491         // get the mime type
       
  1492         RApaLsSession ls;
       
  1493         User::LeaveIfError(ls.Connect());
       
  1494         CleanupClosePushL<RApaLsSession>(ls);
       
  1495         TUid appUid;
       
  1496         TDataType mimeType;
       
  1497         ls.AppForDocument(sourceFileName, appUid, mimeType);
       
  1498         CleanupStack::PopAndDestroy(); //ls
       
  1499         
       
  1500         CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
  1501 
       
  1502         // add an attachment to the current message entry
       
  1503         TRAP(err, clientMtm->AddAttachmentL( sourceFileName, mimeType.Des8(), 0, waiter->iStatus ));
       
  1504         if (err == KErrNone)
       
  1505             waiter->StartAndWait();
       
  1506         else
       
  1507             LOGSTRING2("Creator: CCreatorMessages::CreateObexEntryL failed to attach %S", &sourceFileName);
       
  1508         
       
  1509         CleanupStack::PopAndDestroy(waiter);
       
  1510         }
       
  1511     
       
  1512     // id has been generated, store it for being able to delete
       
  1513     // only entries created with Creator
       
  1514     iEntryIds.AppendL( messageEntry.Id() );
       
  1515     
       
  1516     CleanupStack::PopAndDestroy(3); //session, registry, clientMtm 
       
  1517 
       
  1518 
       
  1519     return err;
       
  1520     }
       
  1521 
       
  1522 //----------------------------------------------------------------------------
       
  1523 
       
  1524 void CCreatorMessages::HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) // from MMsvSessionObserver
       
  1525     {
       
  1526     }
       
  1527 
       
  1528 //----------------------------------------------------------------------------
       
  1529 void CCreatorMessages::SetSenderToEntryDetailsL(TMsvEntry& aMsgEntry, const CMessagesParameters& aParameters, TBool aUseEmailAddress)
       
  1530     {        
       
  1531     // Only one sender allowed:
       
  1532     if( iSenderArray.Count() == 0 )
       
  1533         {
       
  1534         GetSendersL(iSenderArray, aParameters, aUseEmailAddress, KUndef );
       
  1535         }
       
  1536     if( iSenderArray.Count() > 0 )
       
  1537         {        
       
  1538         TInt rnd = iEngine->RandomNumber( iSenderArray.Count() );
       
  1539         aMsgEntry.iDetails.Set( iSenderArray[rnd]->Des() );        
       
  1540         }
       
  1541     else
       
  1542         {
       
  1543         aMsgEntry.iDetails.Set(KEmpty);
       
  1544         }        
       
  1545     }
       
  1546 
       
  1547 //----------------------------------------------------------------------------
       
  1548 void CCreatorMessages::SetRecipientToEntryDetailsL(TMsvEntry& aMsgEntry, const CMessagesParameters& aParameters, TBool aUseEmailAddress)
       
  1549     {        
       
  1550     // Only one sender allowed:
       
  1551     GetAllRecipientsL(iRecipientArray, aParameters, aUseEmailAddress);
       
  1552     if( iRecipientArray.Count() > 0 )
       
  1553         {
       
  1554         const TDesC& temp = iRecipientArray[0]->Des();
       
  1555         aMsgEntry.iDetails.Set( temp );
       
  1556         }
       
  1557     else
       
  1558         {
       
  1559         aMsgEntry.iDetails.Set(KEmpty);
       
  1560         }        
       
  1561     }
       
  1562 
       
  1563 //----------------------------------------------------------------------------
       
  1564 void CCreatorMessages::AddSenderToMtmAddresseeL(CBaseMtm& aMtm, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1565     {    
       
  1566     // Only one sender allowed:
       
  1567     if( iSenderArray.Count() == 0 )
       
  1568         {
       
  1569         GetSendersL(iSenderArray, aParameters, aUseEmailAddress, 1 );
       
  1570         }
       
  1571     
       
  1572     for( TInt i = 0; i < iSenderArray.Count(); ++i )
       
  1573         {
       
  1574         aMtm.AddAddresseeL( iSenderArray[i]->Des() );        
       
  1575         }    
       
  1576     }
       
  1577 
       
  1578 //----------------------------------------------------------------------------
       
  1579 void CCreatorMessages::AddMtmSenderL(CMmsClientMtm& aMtm, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1580     {    
       
  1581     // Only one sender allowed:
       
  1582     if( iSenderArray.Count() == 0 )
       
  1583         {
       
  1584         GetSendersL(iSenderArray, aParameters, aUseEmailAddress, 1 );
       
  1585         }
       
  1586     
       
  1587     if( iSenderArray.Count() > 0 )
       
  1588         {
       
  1589         aMtm.SetSenderL( iSenderArray[0]->Des() );        
       
  1590         }    
       
  1591     }
       
  1592 
       
  1593 //----------------------------------------------------------------------------
       
  1594 void CCreatorMessages::GetSendersL(RPointerArray<HBufC>& aSenderArray, const CMessagesParameters& aParameters, TBool aUseEmailAddress, TInt aMaxNum )
       
  1595     {
       
  1596     TInt counter = 0;
       
  1597     
       
  1598     if( counter < aMaxNum || aMaxNum == KUndef )
       
  1599         {
       
  1600         if( aParameters.iSenderAddress && aParameters.iSenderAddress->Length() > 0 )
       
  1601             {
       
  1602             HBufC* temp = HBufC::NewL(aParameters.iSenderAddress->Length());
       
  1603             CleanupStack::PushL(temp);
       
  1604             temp->Des().Copy(aParameters.iSenderAddress->Des());
       
  1605             aSenderArray.AppendL( temp );
       
  1606             CleanupStack::Pop(); // temp
       
  1607             ++counter;
       
  1608             }
       
  1609         }
       
  1610             
       
  1611     if( counter < aMaxNum || aMaxNum == KUndef )
       
  1612         {
       
  1613         RPointerArray<HBufC> tempArray;
       
  1614         CleanupResetAndDestroyPushL( tempArray );
       
  1615         GetLinkedAddressesL(tempArray, aParameters.iSenderLinkIds, aUseEmailAddress, aParameters.iNumberOfExistingSenders);
       
  1616         for( TInt i = 0; i < tempArray.Count() && (counter < aMaxNum || aMaxNum == KUndef); ++i )
       
  1617             {
       
  1618             HBufC* temp = tempArray[i]->AllocLC();
       
  1619             aSenderArray.AppendL(temp);
       
  1620             CleanupStack::Pop(); // temp
       
  1621             ++counter;
       
  1622             }
       
  1623         CleanupStack::PopAndDestroy(); // tempArray
       
  1624         }    
       
  1625     }
       
  1626 
       
  1627 //----------------------------------------------------------------------------
       
  1628 void CCreatorMessages::AddRecipientsL(CBaseMtm& aMtm, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1629     {
       
  1630     GetAllRecipientsL(iRecipientArray, aParameters, aUseEmailAddress);
       
  1631     for( TInt i = 0; i < iRecipientArray.Count(); ++i )
       
  1632         {
       
  1633         aMtm.AddAddresseeL( iRecipientArray[i]->Des() );        
       
  1634         }    
       
  1635     }
       
  1636 
       
  1637 //----------------------------------------------------------------------------
       
  1638 void CCreatorMessages::GetAllRecipientsL(RPointerArray<HBufC>& aRecipientArray, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1639     {
       
  1640     
       
  1641     // If iRecipientAddress is given, add it to the array:
       
  1642     if( aParameters.iRecipientAddress && aParameters.iRecipientAddress->Length() > 0 )
       
  1643         {
       
  1644         HBufC* temp = HBufC::NewL(aParameters.iRecipientAddress->Length());
       
  1645         CleanupStack::PushL(temp);
       
  1646         temp->Des().Copy(aParameters.iRecipientAddress->Des());
       
  1647         aRecipientArray.AppendL( temp );
       
  1648         CleanupStack::Pop(); // temp
       
  1649         }
       
  1650     
       
  1651     // Add all recipients listed in iRecipientAddressArray:
       
  1652     for( TInt i = 0; i < aParameters.iRecipientAddressArray.Count(); ++i )
       
  1653         {
       
  1654         HBufC* temp = HBufC::NewL(aParameters.iRecipientAddressArray[i]->Length());
       
  1655         CleanupStack::PushL(temp);
       
  1656         temp->Des().Copy(aParameters.iRecipientAddressArray[i]->Des());
       
  1657         aRecipientArray.AppendL( temp );
       
  1658         CleanupStack::Pop(); // temp        
       
  1659         }
       
  1660     
       
  1661     // Get all linked addresses. 
       
  1662     GetLinkedAddressesL(aRecipientArray, aParameters.iRecipientLinkIds, aUseEmailAddress, aParameters.iNumberOfExistingRecipients);
       
  1663     }
       
  1664 
       
  1665 /*
       
  1666  * Get all linked addresses. This method gets addresses that are linked with contact-set id and 
       
  1667  * existing addresses from the contact database, if required.
       
  1668  */
       
  1669 void CCreatorMessages::GetLinkedAddressesL(
       
  1670         RPointerArray<HBufC>& aAddressArray, 
       
  1671         const RArray<TLinkIdParam>& aLinkIds, 
       
  1672         TBool aUseEmailAddress,
       
  1673         TInt /*aNumOfExistingAddresses*/ )
       
  1674     {
       
  1675     CCreatorPhonebook* phonebook = dynamic_cast<CCreatorPhonebook*>(iEngine->GetPhonebook());
       
  1676     User::LeaveIfNull( phonebook );
       
  1677     CCreatorPhonebookWrapper* phonebookWrapper = phonebook->GetPhonebookWrapper();
       
  1678     
       
  1679     for( TInt i = 0; i < aLinkIds.Count(); ++i )
       
  1680         {
       
  1681         const CCreatorContactSet& set = ContactLinkCache::Instance()->ContactSet(aLinkIds[i].iLinkId);
       
  1682         const RArray<TUint32> links = set.ContactLinks();//ContactLinkCache::Instance()->ContactSets();//set.ContactLinks();
       
  1683         TInt numberOfExplicitLinks = links.Count(); // Number of defined contacts in contact-set
       
  1684         for( TInt j = 0; j < numberOfExplicitLinks; ++j )
       
  1685             {
       
  1686             TBuf<128> name;
       
  1687             TBuf<128> email;
       
  1688             TBuf<128> phoneNumber;
       
  1689             phonebookWrapper->GetContactDetailsL( links[j], name, phoneNumber, email );
       
  1690             HBufC* address = ( aUseEmailAddress ? email.AllocLC() : phoneNumber.AllocLC() );
       
  1691             aAddressArray.AppendL( address );
       
  1692             CleanupStack::Pop( address );
       
  1693             }
       
  1694         }
       
  1695     }
       
  1696 
       
  1697 //----------------------------------------------------------------------------
       
  1698 void CCreatorMessages::DeleteAllL()
       
  1699     {
       
  1700     LOGSTRING("Creator: CCreatorMessages::DeleteAllL");
       
  1701     DeleteAllMessagesL( EFalse );
       
  1702     }
       
  1703 
       
  1704 //----------------------------------------------------------------------------
       
  1705 void CCreatorMessages::DeleteAllMessagesL( TBool aOnlyCreatedWithCreator )
       
  1706     {
       
  1707     LOGSTRING("Creator: CCreatorMessages::DeleteAllMessagesL");
       
  1708     TInt err( KErrNone );
       
  1709     
       
  1710     // init
       
  1711     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
  1712     CleanupStack::PushL( session );
       
  1713     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*session);
       
  1714     CleanupStack::PushL( registry );
       
  1715 
       
  1716     // get the client mtm and return if it isn't supported in the system        
       
  1717     CSmsClientMtm* clientMtm( NULL );
       
  1718     TRAP( err, clientMtm = static_cast<CSmsClientMtm*>( registry->NewMtmL( KUidMsgTypeSMS ) ) );
       
  1719     if ( err || !clientMtm )
       
  1720         {
       
  1721         iEngine->GetEngineWrapper()->ShowErrorMessage( _L( "SMS: Message type module not found" ) );
       
  1722         CleanupStack::PopAndDestroy( 2 );
       
  1723         User::Leave( KErrNotFound );
       
  1724         }
       
  1725     CleanupStack::PushL( clientMtm );
       
  1726     
       
  1727     TRAP_IGNORE( DeleteAllFromFolderL( KMsvGlobalInBoxIndexEntryId, session, clientMtm, aOnlyCreatedWithCreator ) );
       
  1728     TRAP_IGNORE( DeleteAllFromFolderL( KMsvDraftEntryId, session, clientMtm, aOnlyCreatedWithCreator ) );
       
  1729     TRAP_IGNORE( DeleteAllFromFolderL( KMsvGlobalOutBoxIndexEntryId, session, clientMtm, aOnlyCreatedWithCreator ) );
       
  1730     TRAP_IGNORE( DeleteAllFromFolderL( KMsvSentEntryId, session, clientMtm, aOnlyCreatedWithCreator ) );
       
  1731     
       
  1732     // reset must be done here, because iEntryIds is stored in destructor
       
  1733     iEntryIds.Reset();
       
  1734     
       
  1735     // all entries deleted, remove the Messages related registry
       
  1736     iEngine->RemoveStoreL( KUidDictionaryUidMessages );
       
  1737 
       
  1738     CleanupStack::PopAndDestroy( clientMtm );
       
  1739     CleanupStack::PopAndDestroy( registry );
       
  1740     CleanupStack::PopAndDestroy( session );
       
  1741     }
       
  1742 
       
  1743 //----------------------------------------------------------------------------
       
  1744 void CCreatorMessages::DeleteAllFromFolderL( const TMsvId aContext, 
       
  1745                                              CMsvSession* aSession,
       
  1746                                              CSmsClientMtm* aClientMtm,
       
  1747                                              TBool aOnlyCreatedWithCreator )
       
  1748     {
       
  1749     LOGSTRING("Creator: CCreatorMessages::DeleteAllFromFolderL");
       
  1750     
       
  1751     TMsvSelectionOrdering sort;
       
  1752     sort.SetShowInvisibleEntries( ETrue );
       
  1753 
       
  1754     CMsvEntry* inboxContext = CMsvEntry::NewL( *aSession, aContext, sort );
       
  1755     CleanupStack::PushL( inboxContext );
       
  1756 
       
  1757     CMsvEntrySelection* entries = inboxContext->ChildrenL();
       
  1758     CleanupStack::PushL( entries );
       
  1759 
       
  1760     TInt msgCount = entries->Count();
       
  1761     for ( TInt i = 0; i < entries->Count(); i++)
       
  1762         {
       
  1763         TMsvId entryID = entries->At(i);
       
  1764         aClientMtm->SwitchCurrentEntryL( entryID );
       
  1765 
       
  1766         if ( !aOnlyCreatedWithCreator || iEntryIds.Find( entryID ) != KErrNotFound )
       
  1767             {
       
  1768             CMsvEntry* entry = aSession->GetEntryL( (*entries)[i] );
       
  1769             CleanupStack::PushL( entry );
       
  1770 
       
  1771             entry->DeleteL( entries->At(i) );
       
  1772             CleanupStack::PopAndDestroy( entry );            
       
  1773             }
       
  1774         }
       
  1775     
       
  1776     CleanupStack::PopAndDestroy( entries );
       
  1777     CleanupStack::PopAndDestroy( inboxContext );
       
  1778     }
       
  1779 
       
  1780 //----------------------------------------------------------------------------
       
  1781 void CCreatorMessages::DeleteAllCreatedByCreatorL()
       
  1782     {
       
  1783     LOGSTRING("Creator: CCreatorMessages::DeleteAllCreatedByCreatorL");
       
  1784     
       
  1785     iEntryIds.Reset();
       
  1786     
       
  1787     // fetch ids of entries created by Creator
       
  1788     iEngine->ReadEntryIdsFromStoreL( iEntryIds, KUidDictionaryUidMessages );
       
  1789     
       
  1790     // delete them
       
  1791     DeleteAllMessagesL( ETrue );
       
  1792     }
       
  1793 
       
  1794 CRecipientInfo::CRecipientInfo() 
       
  1795     {
       
  1796     
       
  1797     }
       
  1798 
       
  1799 CRecipientInfo::~CRecipientInfo()
       
  1800     {
       
  1801     delete iPhoneNumber;
       
  1802     delete iEmailAddress;
       
  1803     }
       
  1804 
       
  1805 void CRecipientInfo::SetPhoneNumber(HBufC* aPhone)
       
  1806     {
       
  1807     delete iPhoneNumber;    
       
  1808     iPhoneNumber = aPhone;    
       
  1809     }
       
  1810 
       
  1811 void CRecipientInfo::SetEmailAddress(HBufC* aEmail)
       
  1812     {
       
  1813     delete iEmailAddress;    
       
  1814     iEmailAddress = aEmail;    
       
  1815     }
       
  1816 
       
  1817 const HBufC* CRecipientInfo::PhoneNumber() const
       
  1818     {
       
  1819     return iPhoneNumber;
       
  1820     }
       
  1821 
       
  1822 const HBufC* CRecipientInfo::EmailAddress() const
       
  1823     {
       
  1824     return iEmailAddress;
       
  1825     }