creator/src/creator_message.cpp
changeset 0 d6fe6244b863
child 11 4df3a095718c
child 50 9b2cffad4b5e
equal deleted inserted replaced
-1:000000000000 0:d6fe6244b863
       
     1 /*
       
     2 * Copyright (c) 2008 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 
       
    20 #include "creator_message.h" 
       
    21 #include "creator_traces.h"
       
    22 #include "creator_contactsetcache.h"
       
    23 #include <apgcli.h>
       
    24 #include <MuiuMsvUiServiceUtilities.h>
       
    25 
       
    26 #if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
       
    27 #include <MVPbkFieldType.h>
       
    28 #include <MVPbkContactOperationBase.h>
       
    29 #include <MVPbkStoreContactFieldCollection.h>
       
    30 #include <MVPbkContactFieldTextData.h>
       
    31 #include <CVPbkContactManager.h>
       
    32 #include <MVPbkStoreContact.h>
       
    33 
       
    34 #include <CVPbkContactStoreUriArray.h>
       
    35 #include <TVPbkContactStoreUriPtr.h>
       
    36 #include <VPbkContactStoreUris.h>
       
    37 #include <MVPbkContactStoreList.h>
       
    38 #include <MVPbkContactStore.h>
       
    39 #include <MVPbkContactStoreProperties.h>
       
    40 #include <VPbkEng.rsg>
       
    41 #include <cmsvrecipientlist.h>
       
    42 #endif
       
    43 #include <mmf/common/mmfcontrollerpluginresolver.h> // for CleanupResetAndDestroyPushL
       
    44 
       
    45 
       
    46 //static const TInt KMessagesFieldLength = 1024;
       
    47 
       
    48 //_LIT(KCreatorMessagesPrefixName, "CR_");
       
    49 //_LIT(KCreatorMessagesPrefixFolderName, "CR_FLDR_");
       
    50 
       
    51 
       
    52 const TUid KUidBIOBusinessCardMsg =  {0x10005531}; 
       
    53 _LIT(KEmpty, "");
       
    54 
       
    55 //----------------------------------------------------------------------------
       
    56 
       
    57 CMessagesParameters::CMessagesParameters()
       
    58     {
       
    59     LOGSTRING("Creator: CMessagesParameters::CMessagesParameters");
       
    60 
       
    61     iSenderAddress = HBufC::New(128);
       
    62     iRecipientAddress = HBufC::New(128);
       
    63     iMessageSubject = HBufC::New(128);
       
    64     iMessageBodyText = HBufC::New(10240);
       
    65     TRAP_IGNORE(iAttachments = new(ELeave) CArrayFixFlat<TInt>(64));
       
    66     iCreateAsUnread = ETrue;
       
    67     }
       
    68 
       
    69 CMessagesParameters::~CMessagesParameters()
       
    70     {
       
    71     LOGSTRING("Creator: CMessagesParameters::~CMessagesParameters");
       
    72 
       
    73 
       
    74     delete iMessageBodyText;
       
    75     delete iMessageSubject;
       
    76     delete iRecipientAddress;
       
    77     delete iSenderAddress;
       
    78     delete iAttachments;
       
    79     iAttachmentPaths.ResetAndDestroy();
       
    80     iAttachmentPaths.Close(); 
       
    81     iRecipientAddressArray.ResetAndDestroy();
       
    82     iRecipientAddressArray.Close();
       
    83     iRecipientLinkIds.Close();
       
    84     iSenderLinkIds.Close();
       
    85     }
       
    86 
       
    87 //----------------------------------------------------------------------------
       
    88 
       
    89 CCreatorMessages* CCreatorMessages::NewL(CCreatorEngine* aEngine)
       
    90     {
       
    91     CCreatorMessages* self = CCreatorMessages::NewLC(aEngine);
       
    92     CleanupStack::Pop(self);
       
    93     return self;
       
    94     }
       
    95 
       
    96 CCreatorMessages* CCreatorMessages::NewLC(CCreatorEngine* aEngine)
       
    97     {
       
    98     CCreatorMessages* self = new (ELeave) CCreatorMessages;
       
    99     CleanupStack::PushL(self);
       
   100     self->ConstructL(aEngine);
       
   101     return self;
       
   102     }
       
   103 
       
   104 CCreatorMessages::CCreatorMessages()
       
   105 :
       
   106 iSession(0)
       
   107     {
       
   108     }
       
   109 
       
   110 void CCreatorMessages::ConstructL(CCreatorEngine* aEngine)
       
   111     {
       
   112     LOGSTRING("Creator: CCreatorMessages::ConstructL");
       
   113     iEngine = aEngine;
       
   114     
       
   115     TRAP_IGNORE(iAttachments = new(ELeave) CArrayFixFlat<TInt>(64));
       
   116     iWaiter = CAsyncWaiter::NewL();
       
   117     }
       
   118 
       
   119 CCreatorMessages::~CCreatorMessages()
       
   120     {
       
   121     LOGSTRING("Creator: CCreatorMessages::~CCreatorMessages");
       
   122 
       
   123     if ( iEngine && iEntryIds.Count() )
       
   124         {
       
   125         TRAP_IGNORE( iEngine->WriteEntryIdsToStoreL( iEntryIds, KUidDictionaryUidMessages ) );
       
   126         }
       
   127     iEntryIds.Reset();
       
   128     iEntryIds.Close();
       
   129     
       
   130     delete iParameters;
       
   131     delete iWaiter;
       
   132     delete iTmpPhoneNumber;
       
   133     delete iTmpEmail;
       
   134     delete iAttachments;
       
   135 #if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
       
   136     delete iExistingContacts;
       
   137     if( iContactManager )
       
   138     	iContactManager->ContactStoresL().CloseAll(*this);
       
   139     delete iContactManager;
       
   140     delete iTempContact;
       
   141 #endif
       
   142     iRecipientArray.ResetAndDestroy();
       
   143     iRecipientArray.Close();
       
   144     iSenderArray.ResetAndDestroy();
       
   145     iSenderArray.Close();
       
   146     delete iSession;
       
   147     }
       
   148 
       
   149 //----------------------------------------------------------------------------
       
   150 
       
   151 TBool CCreatorMessages::AskDataFromUserL(TInt aCommand, TInt& aNumberOfEntries)
       
   152     {
       
   153     LOGSTRING("Creator: CCreatorMessages::AskDataFromUserL");
       
   154 
       
   155     if ( aCommand == ECmdDeleteMessages )
       
   156         {
       
   157         return iEngine->YesNoQueryDialogL( _L("Delete all messages?") );
       
   158         }
       
   159     else if ( aCommand ==  ECmdDeleteCreatorMessages )
       
   160         {
       
   161         return iEngine->YesNoQueryDialogL( _L("Delete all messages created with Creator?") );
       
   162         }
       
   163 
       
   164     if (iEngine->EntriesQueryDialogL(aNumberOfEntries, _L("How many entries to create?")))
       
   165         {
       
   166         
       
   167         // message type query
       
   168         CAknListQueryDialog* dlg1 = new(ELeave) CAknListQueryDialog( (TInt*) &iMessageType );
       
   169         if (dlg1->ExecuteLD(R_MESSAGE_TYPE_QUERY))
       
   170             {
       
   171             TInt folderTypeQueryResource(R_FOLDER_TYPE_QUERY);
       
   172             
       
   173             /*
       
   174             if (iMessageType == EEmail)
       
   175                 folderTypeQueryResource = R_FOLDER_TYPE_WITH_MAILBOX_QUERY;
       
   176             */
       
   177 
       
   178             // folder query
       
   179             CAknListQueryDialog* dlg2 = new(ELeave) CAknListQueryDialog( (TInt*) &iFolderType );
       
   180             if (dlg2->ExecuteLD(folderTypeQueryResource))
       
   181                 {
       
   182                 /*
       
   183                 if (iFolderType == EMailbox)
       
   184                     {
       
   185                     // array to hold mailbox names
       
   186                     CDesCArray* names = new (ELeave) CDesCArrayFlat(16);
       
   187                     CleanupStack::PushL(names);                    
       
   188                     
       
   189                     CMsvSession* session = CMsvSession::OpenSyncL(*this);
       
   190                     CleanupStack::PushL(session);
       
   191     
       
   192                     // generate list of mailboxes
       
   193                     CMsvEntrySelection* entrySelection = MsvUiServiceUtilities::GetListOfAccountsWithMTML(*session, KUidMsgTypeSMTP, ETrue);
       
   194                     CleanupStack::PushL(entrySelection);
       
   195 
       
   196                     TBool doReturn(EFalse);
       
   197                     
       
   198                     if (entrySelection->Count() == 0)
       
   199                         {
       
   200                         CAknInformationNote* note = new(ELeave) CAknInformationNote;
       
   201                         note->ExecuteLD(_L("No mailboxes found"));
       
   202 
       
   203                         doReturn = ETrue;
       
   204                         }
       
   205                     else
       
   206                         {
       
   207                         // get mailbox names
       
   208                         for (TInt i=0; i<entrySelection->Count(); i++)
       
   209                             {
       
   210                             CMsvEntry* centry = session->GetEntryL(entrySelection->At(i));
       
   211                             CleanupStack::PushL(centry);
       
   212 
       
   213                             TMsvEntry tentry = centry->Entry();
       
   214                             names->AppendL(tentry.iDetails);
       
   215                             CleanupStack::PopAndDestroy(); //centry
       
   216                             }
       
   217                         
       
   218                         // show query
       
   219                         TInt index(0);
       
   220                         CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog(&index);
       
   221                         dlg->PrepareLC(R_MAILBOX_SELECTION_QUERY);
       
   222                         dlg->SetItemTextArray(names);
       
   223                         dlg->SetOwnershipType(ELbmDoesNotOwnItemArray);
       
   224 
       
   225                         if(dlg->RunLD())
       
   226                             {
       
   227                             iUserSelectedMailbox = entrySelection->At(index);
       
   228 
       
   229                             doReturn = EFalse;
       
   230                             }
       
   231                         else
       
   232                             {
       
   233                             doReturn = ETrue;
       
   234                             }    
       
   235                         
       
   236                         }
       
   237                     
       
   238                     CleanupStack::PopAndDestroy(3); // names, session, entrySelection
       
   239                     
       
   240                     if (doReturn)
       
   241                         return EFalse;                    
       
   242                     }
       
   243                 */
       
   244                 
       
   245                 // query create as unread
       
   246                 CAknListQueryDialog* dlg3 = new(ELeave) CAknListQueryDialog( (TInt*) &iCreateAsUnread );
       
   247                 if (dlg3->ExecuteLD(R_UNREAD_QUERY))
       
   248                     {                
       
   249 
       
   250                     // query number of characters in msg body
       
   251                     switch (iMessageType)
       
   252                         {
       
   253                         case ESMS:
       
   254                         case EMMS:
       
   255                         case EEmail:
       
   256                             {
       
   257                             iDefinedMessageLength = 100;
       
   258                             if (iEngine->EntriesQueryDialogL(iDefinedMessageLength, _L("Amount of characters in message body?"), ETrue))
       
   259                                 {
       
   260                                 ;
       
   261                                 }
       
   262                             else
       
   263                                 return EFalse;
       
   264 
       
   265                             break;
       
   266                             }
       
   267                         case EAMS:
       
   268                         	{
       
   269                         	iDefinedMessageLength = 0;
       
   270                         	break;
       
   271                         	}
       
   272                         default: break;
       
   273                         }
       
   274 
       
   275                     // query attachments
       
   276                     iAttachments->Reset();
       
   277               
       
   278                     switch (iMessageType)
       
   279                         {
       
   280                         case EMMS:
       
   281                         case EEmail:
       
   282                             {
       
   283                             CAknListQueryDialog* dlg4 = new(ELeave) CAknListQueryDialog( iAttachments );
       
   284                             if (dlg4->ExecuteLD(R_ATTACHMENT_MULTI_SELECTION_QUERY))
       
   285                                 {
       
   286                                 // "none" is selected
       
   287                                 if (iAttachments->At(0) == 0)
       
   288                                     iAttachments->Reset();
       
   289                                 else  // otherwise fix indexes
       
   290                                     {
       
   291                                     for (TInt i=0; i<iAttachments->Count(); i++)
       
   292                                         iAttachments->At(i)--;  // decrease value by one 
       
   293 
       
   294                                     }
       
   295                                 }
       
   296                             else
       
   297                                 return EFalse;
       
   298                             
       
   299                             break;
       
   300                             }
       
   301                         case EAMS:
       
   302                         	{
       
   303                             iAttachments->AppendL( TInt(0) );
       
   304 
       
   305                             CAknListQueryDialog* dlg5 = new(ELeave) CAknListQueryDialog( &iAttachments->At(0) );
       
   306                             if (dlg5->ExecuteLD(R_AMS_ATTACHMENT_SINGLE_SELECTION_QUERY))
       
   307                                 {
       
   308                                 ;
       
   309                                 }
       
   310                             else
       
   311                                 return EFalse;                        
       
   312 
       
   313                             break;
       
   314                         	}
       
   315                             
       
   316                         case EIrMessage:
       
   317                         case EBTMessage:
       
   318                             {
       
   319                             iAttachments->AppendL( TInt(0) );
       
   320 
       
   321                             CAknListQueryDialog* dlg5 = new(ELeave) CAknListQueryDialog( &iAttachments->At(0) );
       
   322                             if (dlg5->ExecuteLD(R_ATTACHMENT_SINGLE_SELECTION_QUERY))
       
   323                                 {
       
   324                                 ;
       
   325                                 }
       
   326                             else
       
   327                                 return EFalse;                        
       
   328 
       
   329                             break;
       
   330                             }
       
   331                         default: break;
       
   332                         }
       
   333                     
       
   334                     return ETrue;  // all queries accepted
       
   335 
       
   336                     }
       
   337                 else
       
   338                     return EFalse;
       
   339                 }
       
   340             else
       
   341                 return EFalse;
       
   342             }
       
   343         else
       
   344             return EFalse;
       
   345         }
       
   346     else
       
   347         return EFalse;
       
   348     }
       
   349 
       
   350 //----------------------------------------------------------------------------
       
   351 
       
   352 TInt CCreatorMessages::CreateRandomMessageEntryL(TInt aCommand)
       
   353     {
       
   354     LOGSTRING2("Creator: CCreatorMessages::CreateRandomMessageEntryL - Command: %d", aCommand);
       
   355 
       
   356     TInt err = KErrNone;
       
   357     
       
   358     iDefinedMessageLength = iEngine->RandomNumber(100, 300);
       
   359 
       
   360 
       
   361     switch (aCommand)
       
   362         {
       
   363 	    case ECmdCreateRandomEntrySMSInbox:     { iMessageType=ESMS; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   364 	    case ECmdCreateRandomEntrySMSDrafts:    { iMessageType=ESMS; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   365 	    case ECmdCreateRandomEntrySMSOutbox:    { iMessageType=ESMS; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}
       
   366 	    case ECmdCreateRandomEntrySMSSent:      { iMessageType=ESMS; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   367 	    
       
   368         case ECmdCreateRandomEntryMMSInbox:     { iMessageType=EMMS; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   369 	    case ECmdCreateRandomEntryMMSDrafts:    { iMessageType=EMMS; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   370 	    case ECmdCreateRandomEntryMMSOutbox:    { iMessageType=EMMS; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}    
       
   371 	    case ECmdCreateRandomEntryMMSSent:      { iMessageType=EMMS; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   372 	    
       
   373         case ECmdCreateRandomEntryEmailInbox:   { iMessageType=EEmail; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   374 	    case ECmdCreateRandomEntryEmailDrafts:  { iMessageType=EEmail; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   375 	    case ECmdCreateRandomEntryEmailOutbox:  { iMessageType=EEmail; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}
       
   376 	    case ECmdCreateRandomEntryEmailSent:    { iMessageType=EEmail; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   377 	    
       
   378         case ECmdCreateRandomEntryBIOInbox:     { iMessageType=ESmartMessage; iFolderType=EInbox; err=CreateMessageEntryL(NULL); break;}
       
   379 	    case ECmdCreateRandomEntryBIODrafts:    { iMessageType=ESmartMessage; iFolderType=EDrafts; err=CreateMessageEntryL(NULL); break;}
       
   380 	    case ECmdCreateRandomEntryBIOOutbox:    { iMessageType=ESmartMessage; iFolderType=EOutbox; err=CreateMessageEntryL(NULL); break;}
       
   381 	    case ECmdCreateRandomEntryBIOSent:      { iMessageType=ESmartMessage; iFolderType=ESent; err=CreateMessageEntryL(NULL); break;}
       
   382 	    
       
   383         case ECmdCreateRandomEntryIRInbox:      { iMessageType=EIrMessage; iFolderType=EInbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   384 	    case ECmdCreateRandomEntryIRDrafts:     { iMessageType=EIrMessage; iFolderType=EDrafts; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   385 	    case ECmdCreateRandomEntryIROutbox:     { iMessageType=EIrMessage; iFolderType=EOutbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   386 	    case ECmdCreateRandomEntryIRSent:       { iMessageType=EIrMessage; iFolderType=ESent; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   387 	    
       
   388         case ECmdCreateRandomEntryBTInbox:      { iMessageType=EBTMessage; iFolderType=EInbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   389 	    case ECmdCreateRandomEntryBTDrafts:     { iMessageType=EBTMessage; iFolderType=EDrafts; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   390 	    case ECmdCreateRandomEntryBTOutbox:     { iMessageType=EBTMessage; iFolderType=EOutbox; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   391 	    case ECmdCreateRandomEntryBTSent:       { iMessageType=EBTMessage; iFolderType=ESent; iAttachments->Reset(); iAttachments->AppendL( iEngine->RandomNumber(CCreatorEngine::EJPEG_25kB, CCreatorEngine::LAST_FILE_ID-1) ); err=CreateMessageEntryL(NULL); break;}
       
   392         
       
   393 	    case ECmdCreateRandomEntryAMSInbox:     { iMessageType=EAMS; iFolderType=EInbox; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   394 	    case ECmdCreateRandomEntryAMSDrafts:     { iMessageType=EAMS; iFolderType=EDrafts; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   395 	    case ECmdCreateRandomEntryAMSOutbox:     { iMessageType=EAMS; iFolderType=EOutbox; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   396 	    case ECmdCreateRandomEntryAMSSent:     { iMessageType=EAMS; iFolderType=ESent; iAttachments->Reset(); iAttachments->AppendL( CCreatorEngine::EMP3_250kB); err=CreateMessageEntryL(NULL); break;}
       
   397 
       
   398 	    default: { User::Panic(_L("MessageCommand"), 901);  break;}
       
   399         }
       
   400 
       
   401     return err;
       
   402     }
       
   403 
       
   404 //----------------------------------------------------------------------------
       
   405 
       
   406 TInt CCreatorMessages::CreateMessageEntryL(CMessagesParameters *aParameters, TBool /*aTakeUserGivenParameters*/)
       
   407     {
       
   408     LOGSTRING("Creator: CCreatorMessages::CreateMessageEntryL");
       
   409     
       
   410     delete iParameters;
       
   411     iParameters = 0;   
       
   412     
       
   413     CMessagesParameters* parameters = aParameters;
       
   414            
       
   415     // random data needed if no predefined data available
       
   416     if (!parameters)
       
   417         {
       
   418         iParameters = new(ELeave) CMessagesParameters;
       
   419         parameters = iParameters;
       
   420         // check if values from ui needed
       
   421         //if (aTakeUserGivenParameters)
       
   422         //    {            
       
   423             parameters->iMessageType = iMessageType;
       
   424             parameters->iFolderType = iFolderType;
       
   425             parameters->iDefinedMessageLength = iDefinedMessageLength;
       
   426             parameters->iCreateAsUnread = iCreateAsUnread;
       
   427 
       
   428             for (TInt i=0; i<iAttachments->Count(); i++)
       
   429                 parameters->iAttachments->AppendL(iAttachments->At(i)); 
       
   430         //    }
       
   431         //else
       
   432         //    {
       
   433             // message length
       
   434         //    parameters->iDefinedMessageLength = iEngine->RandomNumber(100, 300);
       
   435         //    }    
       
   436 
       
   437         if (parameters->iMessageType == EEmail)
       
   438             {
       
   439             parameters->iSenderAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   440             parameters->iSenderAddress->Des().Append( _L("@") );
       
   441             parameters->iSenderAddress->Des().Append( iEngine->RandomString(CCreatorEngine::ECompany) );
       
   442             parameters->iSenderAddress->Des().Append( _L(".com") );
       
   443 
       
   444             parameters->iRecipientAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   445             parameters->iRecipientAddress->Des().Append( _L("@") );
       
   446             parameters->iRecipientAddress->Des().Append( iEngine->RandomString(CCreatorEngine::ECompany) );
       
   447             parameters->iRecipientAddress->Des().Append( _L(".net") );
       
   448             }
       
   449         else if (parameters->iMessageType == EIrMessage || parameters->iMessageType == EBTMessage)
       
   450             {
       
   451             parameters->iSenderAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   452             parameters->iRecipientAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EFirstName) );
       
   453             }
       
   454         else
       
   455             {
       
   456             parameters->iSenderAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EPhoneNumber) );
       
   457             parameters->iRecipientAddress->Des().Copy( iEngine->RandomString(CCreatorEngine::EPhoneNumber) );
       
   458             }
       
   459 
       
   460         // subject
       
   461         parameters->iMessageSubject->Des() = iEngine->RandomString(CCreatorEngine::EMessageSubject);
       
   462 
       
   463         // message body
       
   464         parameters->iMessageBodyText->Des().Copy(_L(""));
       
   465         TPtrC randText = iEngine->RandomString(CCreatorEngine::EMessageText);
       
   466         for (TInt i=0; i<parameters->iDefinedMessageLength / randText.Length() +1; i++)
       
   467             {
       
   468             parameters->iMessageBodyText->Des().Append( randText );
       
   469             parameters->iMessageBodyText->Des().Append( _L(" ") );
       
   470             }
       
   471         parameters->iMessageBodyText->Des() = parameters->iMessageBodyText->Des().Left(parameters->iDefinedMessageLength);
       
   472 
       
   473         // BIO message type (from bitsids.h)  // TO-DO: add support for all BIO message types...
       
   474         parameters->iBIOMessageType = KUidBIOBusinessCardMsg;
       
   475         }
       
   476     
       
   477     
       
   478 #if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
       
   479     
       
   480     // Get number of existing senders and recipients:
       
   481     for( TInt i = 0; i < parameters->iRecipientLinkIds.Count(); ++i )
       
   482         {       
       
   483         
       
   484         TLinkIdParam recipientId = parameters->iRecipientLinkIds[i];        
       
   485         // Is maximum number limited:
       
   486         if(recipientId.iLinkAmount == KUndef || 
       
   487            recipientId.iLinkAmount >= ContactLinkCache::Instance()->ContactSet(recipientId.iLinkId).NumberOfExistingContacts() )
       
   488             {
       
   489             parameters->iNumberOfExistingRecipients += ContactLinkCache::Instance()->ContactSet(recipientId.iLinkId).NumberOfExistingContacts();
       
   490             }
       
   491         else
       
   492             {
       
   493             parameters->iNumberOfExistingRecipients += recipientId.iLinkAmount;
       
   494             }
       
   495         }
       
   496     for( TInt i = 0; i < parameters->iSenderLinkIds.Count(); ++i )
       
   497         {
       
   498         TLinkIdParam senderId = parameters->iSenderLinkIds[i];
       
   499         // Is maximum number limited:
       
   500         if( senderId.iLinkAmount == KUndef ||
       
   501             senderId.iLinkAmount >= ContactLinkCache::Instance()->ContactSet(senderId.iLinkId).NumberOfExistingContacts())
       
   502             {
       
   503             parameters->iNumberOfExistingSenders += ContactLinkCache::Instance()->ContactSet(senderId.iLinkId).NumberOfExistingContacts();
       
   504             }
       
   505         else
       
   506             {
       
   507             parameters->iNumberOfExistingSenders += senderId.iLinkAmount;
       
   508             }            
       
   509         }
       
   510     
       
   511 #endif
       
   512 
       
   513     TInt err = KErrNone;
       
   514 
       
   515     switch (parameters->iMessageType)
       
   516         {
       
   517         case ESMS:          { err = CreateSMSEntryL(*parameters);  break; }
       
   518         case EMMS:          { err = CreateMMSEntryL(*parameters);  break; }
       
   519         case EAMS:          { err = CreateAMSEntryL(*parameters);  break; }
       
   520         case EEmail:        { err = CreateEmailEntryL(*parameters);  break; }
       
   521         case ESmartMessage: { err = CreateSmartMessageEntryL(*parameters);  break; }
       
   522         case EIrMessage:    { err = CreateObexEntryL( TUid::Uid(KUidMsgTypeIrTInt32), *parameters );  break; }    
       
   523         case EBTMessage:    { err = CreateObexEntryL( TUid::Uid(KUidMsgTypeBtTInt32), *parameters );  break; }
       
   524         default:            { User::Panic(_L("MsgType"), 851);  break;}
       
   525 
       
   526         }
       
   527 
       
   528     iSenderArray.ResetAndDestroy();
       
   529     iRecipientArray.ResetAndDestroy();
       
   530     return err;
       
   531     }
       
   532 
       
   533 //----------------------------------------------------------------------------
       
   534 
       
   535 TInt CCreatorMessages::CreateSMSEntryL(const CMessagesParameters& parameters)
       
   536     {
       
   537     LOGSTRING("Creator: CCreatorMessages::CreateSMSEntryL");
       
   538 
       
   539     TInt err = KErrNone;
       
   540                
       
   541     // init    
       
   542     if( iSession == 0 )
       
   543         {
       
   544         iSession = CMsvSession::OpenSyncL(*this);
       
   545         }
       
   546 
       
   547     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
   548     CleanupStack::PushL(registry);
       
   549 
       
   550     // get the client mtm and return if it isn't supported in the system        
       
   551     CSmsClientMtm* clientMtm = NULL;
       
   552     TRAP(err, clientMtm = static_cast<CSmsClientMtm*>(registry->NewMtmL(KUidMsgTypeSMS)));
       
   553     if (err || !clientMtm)
       
   554         {
       
   555         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
   556         note->ExecuteLD(_L("SMS: Message type module not found"));
       
   557         CleanupStack::PopAndDestroy(2);
       
   558         User::Leave(KErrNotFound);
       
   559         }  
       
   560     CleanupStack::PushL(clientMtm);   
       
   561 
       
   562     // create a new object to access an existing entry
       
   563     CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
   564     CleanupStack::PushL(msvEntry);
       
   565   
       
   566     // get default service
       
   567     TMsvId defaultServiceId = 0;
       
   568     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
   569     if (err)
       
   570         {
       
   571         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
   572         note->ExecuteLD(_L("SMS: Define a SMS centre first"));
       
   573         CleanupStack::PopAndDestroy(2);
       
   574         User::Leave(KErrNotFound);
       
   575         } 
       
   576     
       
   577     // set folder type
       
   578     switch (parameters.iFolderType)
       
   579         {
       
   580         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
   581         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
   582         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
   583         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
   584         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
   585         }
       
   586         
       
   587     // mtm takes ownership of entry context	
       
   588     CleanupStack::Pop(msvEntry);
       
   589     clientMtm->SetCurrentEntryL(msvEntry);    
       
   590     
       
   591     // create a new message
       
   592     clientMtm->CreateMessageL(defaultServiceId);
       
   593 
       
   594     // set the from field to sms header
       
   595     if (parameters.iFolderType == EInbox)
       
   596         {
       
   597         CSmsHeader& smsHeader = clientMtm->SmsHeader();
       
   598 
       
   599         if( parameters.iSenderAddress )
       
   600             {
       
   601             smsHeader.SetFromAddressL( parameters.iSenderAddress->Des() );
       
   602             }
       
   603         else
       
   604             {
       
   605             smsHeader.SetFromAddressL(KEmpty);
       
   606             }
       
   607         }       
       
   608 
       
   609     // set body
       
   610     clientMtm->Body().Reset();
       
   611     clientMtm->Body().InsertL(0, parameters.iMessageBodyText->Des());        
       
   612 
       
   613     // get the entry of the message
       
   614     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
   615 
       
   616     // set the details field
       
   617     if (parameters.iFolderType == EInbox)
       
   618         {
       
   619         SetSenderToEntryDetails(messageEntry, parameters, EFalse);        
       
   620         }
       
   621     else
       
   622         {
       
   623         SetRecipientToEntryDetails(messageEntry, parameters, EFalse);
       
   624         // Add all recipients to clientMtm
       
   625         // iRecipientArray is up-to-date so don't call AddRecipientsL here 
       
   626         for( TInt i = 0; i < iRecipientArray.Count(); i++ )
       
   627             {
       
   628             clientMtm->AddAddresseeL( iRecipientArray[i]->Des() );
       
   629             }
       
   630         }
       
   631 
       
   632     // set the sending state for outbox message
       
   633     // to avoid SMSMtmUI:15 panic in messages application
       
   634     if (parameters.iFolderType == EOutbox )
       
   635         {
       
   636         messageEntry.SetSendingState( KMsvSendStateWaiting );
       
   637         }
       
   638 
       
   639     // set the description field same as the first part of the message body
       
   640     messageEntry.iDescription.Set( parameters.iMessageBodyText->Des().Left(KSmsDescriptionLength) );
       
   641 
       
   642     // save the changes done above
       
   643     clientMtm->Entry().ChangeL(messageEntry);
       
   644 
       
   645     // save the message     
       
   646     clientMtm->SaveMessageL();
       
   647     	
       
   648 	// final fine tuning
       
   649     messageEntry.SetAttachment(EFalse);
       
   650     messageEntry.iDate.HomeTime();
       
   651     messageEntry.SetVisible(ETrue);
       
   652     messageEntry.SetInPreparation(EFalse);
       
   653    
       
   654     if (parameters.iCreateAsUnread)
       
   655         {
       
   656         messageEntry.SetUnread(ETrue);
       
   657         messageEntry.SetNew(ETrue);
       
   658         }
       
   659     else
       
   660         {
       
   661         messageEntry.SetUnread(EFalse);
       
   662         messageEntry.SetNew(EFalse);
       
   663         }
       
   664     
       
   665     messageEntry.SetComplete(ETrue);
       
   666     messageEntry.iServiceId = defaultServiceId;
       
   667     messageEntry.iRelatedId = 0;
       
   668     clientMtm->Entry().ChangeL(messageEntry);
       
   669 
       
   670     // id has been generated, store it for being able to delete
       
   671     // only entries created with Creator
       
   672     iEntryIds.Append( messageEntry.Id() );
       
   673     
       
   674     CleanupStack::PopAndDestroy(2); //registry, clientMtm
       
   675         
       
   676     return err;
       
   677 
       
   678     }
       
   679 
       
   680 //----------------------------------------------------------------------------
       
   681 
       
   682 TInt CCreatorMessages::CreateMMSEntryL(const CMessagesParameters& parameters)
       
   683     {
       
   684     LOGSTRING("Creator: CCreatorMessages::CreateMMSEntryL");
       
   685 
       
   686     TInt err = KErrNone;
       
   687 
       
   688         
       
   689     // init    
       
   690     if( iSession == 0 )
       
   691         {
       
   692         iSession = CMsvSession::OpenSyncL(*this);
       
   693         }
       
   694     
       
   695     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
   696     CleanupStack::PushL(registry);
       
   697 
       
   698     // get the client mtm and return if it isn't supported in the system        
       
   699     CMmsClientMtm* clientMtm = NULL;
       
   700     TRAP(err, clientMtm = static_cast<CMmsClientMtm*>(registry->NewMtmL(KUidMsgTypeMultimedia)));
       
   701     if (err || !clientMtm)
       
   702         {
       
   703         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
   704         note->ExecuteLD(_L("MMS: Message type module not found"));
       
   705         CleanupStack::PopAndDestroy(2);
       
   706         User::Leave(KErrNotFound);
       
   707         }  
       
   708     CleanupStack::PushL(clientMtm);   
       
   709 
       
   710     // create a new object to access an existing entry
       
   711     CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
   712     CleanupStack::PushL(msvEntry);
       
   713   
       
   714     // get default service
       
   715     TMsvId defaultServiceId = 0;
       
   716     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
   717     if (err)
       
   718         {
       
   719         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
   720         note->ExecuteLD(_L("MMS: Define MMS settings first"));
       
   721         CleanupStack::PopAndDestroy(4);
       
   722         User::Leave(KErrNotFound);
       
   723         } 
       
   724     
       
   725     // set folder type
       
   726     switch (parameters.iFolderType)
       
   727         {
       
   728         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
   729         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
   730         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
   731         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
   732         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
   733         }
       
   734         
       
   735     // mtm takes ownership of entry context	
       
   736     CleanupStack::Pop(msvEntry);
       
   737     clientMtm->SetCurrentEntryL(msvEntry);    
       
   738     
       
   739     // create a new message
       
   740     clientMtm->CreateMessageL(defaultServiceId);
       
   741 
       
   742     // set subject
       
   743     clientMtm->SetSubjectL( parameters.iMessageSubject->Des() );
       
   744             
       
   745     // set some mms defaults
       
   746     clientMtm->SetMessageClass(EMmsClassPersonal);
       
   747     clientMtm->SetExpiryInterval(86400);
       
   748     clientMtm->SetDeliveryTimeInterval(3600);
       
   749     clientMtm->SetMessagePriority(EMmsPriorityLow);
       
   750     clientMtm->SetSenderVisibility(EMmsMaximumSenderVisibility);
       
   751     clientMtm->SetDeliveryReport(EMmsDeliveryReportYes);
       
   752     clientMtm->SetReadReply(EMmsReadReplyYes);        
       
   753     
       
   754     // set the sender / addressee field
       
   755     if (parameters.iFolderType == EInbox)
       
   756         {        
       
   757         AddMtmSenderL(*clientMtm, parameters, EFalse);                
       
   758         }
       
   759     
       
   760     // Add all recipients to clientMtm
       
   761     AddRecipientsL( *clientMtm, parameters, EFalse );  
       
   762         
       
   763     // get an access to the message store
       
   764     CMsvStore* store = msvEntry->EditStoreL();
       
   765     CleanupStack::PushL(store);                  
       
   766    
       
   767 
       
   768     // set body as an attachment
       
   769     CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
       
   770     CleanupStack::PushL(mimeHeaders);
       
   771     mimeHeaders->SetContentTypeL( _L8("text") );
       
   772     mimeHeaders->SetContentSubTypeL( _L8("plain") );
       
   773     mimeHeaders->SetMimeCharset( KMmsUtf8 );
       
   774     mimeHeaders->SetSuggestedFilenameL( _L("body.txt") );
       
   775     
       
   776     MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   777     CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   778     CleanupStack::PushL(attachmentInfo);
       
   779     attachmentInfo->SetAttachmentNameL( _L("body.txt") );
       
   780     attachmentInfo->SetMimeTypeL( _L8("text/plain") );
       
   781     mimeHeaders->StoreL( *attachmentInfo );
       
   782     
       
   783     RFile textFile;
       
   784 
       
   785     CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   786     attachMan.CreateAttachmentL(_L("body.txt"), textFile, attachmentInfo, waiter->iStatus );
       
   787     CleanupStack::Pop(); // waiter
       
   788     CleanupStack::Pop(); // attachmentInfo
       
   789     CleanupStack::PushL(waiter);
       
   790     waiter->StartAndWait();
       
   791     CleanupStack::PopAndDestroy(waiter);        
       
   792    
       
   793     HBufC8* tempBuf = HBufC8::NewLC( parameters.iMessageBodyText->Des().Length() );
       
   794     tempBuf->Des().Copy( parameters.iMessageBodyText->Des() );
       
   795     textFile.Write( tempBuf->Des() );        
       
   796     textFile.Close();
       
   797     CleanupStack::PopAndDestroy(); //tempBuf
       
   798     
       
   799     CleanupStack::PopAndDestroy(); //mimeHeaders
       
   800 
       
   801     
       
   802     // get the entry of the message
       
   803     TMsvEntry messageEntry = clientMtm->Entry().Entry();        
       
   804     
       
   805     // set the details field
       
   806     if (parameters.iFolderType == EInbox)
       
   807         {
       
   808         SetSenderToEntryDetails(messageEntry, parameters, EFalse);        
       
   809         }
       
   810     else
       
   811         {
       
   812         SetRecipientToEntryDetails(messageEntry, parameters, EFalse);
       
   813         }    
       
   814 
       
   815     // set the description field same as the message subject
       
   816     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
   817 
       
   818     // save the changes done above
       
   819     clientMtm->Entry().ChangeL(messageEntry);        
       
   820     
       
   821 
       
   822       // save the attachments
       
   823     HandleAttachementsL(parameters, store, err );
       
   824 //    for (TInt i=0; i<parameters.iAttachments->Count(); i++)
       
   825 //        {
       
   826 //        TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i) );
       
   827 //
       
   828 //        TParse parser;
       
   829 //        parser.Set(sourceFileName, NULL, NULL);
       
   830 //        TFileName shortFileName = parser.NameAndExt();
       
   831 //
       
   832 //        // get the mime type
       
   833 //        RApaLsSession ls;
       
   834 //        User::LeaveIfError(ls.Connect());
       
   835 //        CleanupClosePushL<RApaLsSession>(ls);
       
   836 //        TUid appUid;
       
   837 //        TDataType dataType;
       
   838 //        ls.AppForDocument(sourceFileName, appUid, dataType);
       
   839 //        CleanupStack::PopAndDestroy(); //ls
       
   840 //        TPtrC8 mimeType = dataType.Des8();
       
   841 //        
       
   842 //        // attachment settings
       
   843 //        MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   844 //        CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   845 //        attachmentInfo->SetAttachmentNameL( shortFileName );        
       
   846 //        attachmentInfo->SetMimeTypeL( mimeType );        
       
   847 //
       
   848 //        // save
       
   849 //        CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   850 //        
       
   851 //        TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
   852 //        if (err == KErrNone)
       
   853 //            waiter->StartAndWait();
       
   854 //        else
       
   855 //            LOGSTRING2("Creator: CCreatorMessages::CreateMMSEntryL failed to attach %S", &sourceFileName);
       
   856 //
       
   857 //        CleanupStack::PopAndDestroy(waiter);  
       
   858 //        }
       
   859 
       
   860     // save the changes made to the message store
       
   861     store->CommitL();
       
   862     CleanupStack::PopAndDestroy(store);   
       
   863            
       
   864     
       
   865     // save the message      
       
   866     clientMtm->SaveMessageL();
       
   867     	
       
   868 	// final fine tuning
       
   869 	messageEntry.SetAttachment(ETrue);
       
   870     messageEntry.iDate.HomeTime();
       
   871     messageEntry.SetVisible(ETrue);
       
   872     messageEntry.SetInPreparation(EFalse);
       
   873     if (parameters.iCreateAsUnread)
       
   874         {
       
   875         messageEntry.SetUnread(ETrue);
       
   876         messageEntry.SetNew(ETrue);
       
   877         }
       
   878     else
       
   879         {
       
   880         messageEntry.SetUnread(EFalse);
       
   881         messageEntry.SetNew(EFalse);
       
   882         }
       
   883     messageEntry.SetComplete(ETrue);
       
   884     messageEntry.iServiceId = defaultServiceId;
       
   885     messageEntry.iRelatedId = 0;
       
   886     
       
   887     if (parameters.iFolderType == EDrafts) 
       
   888         messageEntry.SetReadOnly(EFalse);
       
   889     else
       
   890         messageEntry.SetReadOnly(ETrue);
       
   891 
       
   892 	messageEntry.iMtmData1 = KMmsMessageMRetrieveConf | KMmsMessageMobileTerminated;
       
   893 	
       
   894     clientMtm->Entry().ChangeL(messageEntry);
       
   895     
       
   896     // id has been generated, store it for being able to delete
       
   897     // only entries created with Creator
       
   898     iEntryIds.Append( messageEntry.Id() );
       
   899     
       
   900     CleanupStack::PopAndDestroy(2); // registry, clientMtm        
       
   901         
       
   902 
       
   903     return err;
       
   904     }
       
   905 
       
   906 //----------------------------------------------------------------------------
       
   907 void CCreatorMessages::HandleAttachementsL(const CMessagesParameters& parameters, CMsvStore* store, TInt err )
       
   908     {
       
   909     // save the attachments (added with id's)
       
   910   for (TInt i=0; i<parameters.iAttachments->Count(); i++)
       
   911       {
       
   912       TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i) );
       
   913       HandleAttachementL(store, err, sourceFileName );
       
   914 
       
   915       }    
       
   916   //Adding attachmentpaths
       
   917   for (TInt i=0; i<parameters.iAttachmentPaths.Count(); i++)
       
   918       {
       
   919       HBufC* point = parameters.iAttachmentPaths[i];
       
   920       TFileName sourceFileName(point->Des());      
       
   921       HandleAttachementL(store, err, sourceFileName );
       
   922       }
       
   923     }
       
   924 //----------------------------------------------------------------------------
       
   925 
       
   926 void CCreatorMessages::HandleAttachementL(CMsvStore* store, TInt err, TFileName& sourceFileName )
       
   927     {
       
   928     TParse parser;
       
   929     parser.Set(sourceFileName, NULL, NULL);
       
   930     TFileName shortFileName = parser.NameAndExt();
       
   931 
       
   932     // get the mime type
       
   933     RApaLsSession ls;
       
   934     User::LeaveIfError(ls.Connect());
       
   935     CleanupClosePushL<RApaLsSession>(ls);
       
   936     TUid appUid;
       
   937     TDataType dataType;
       
   938     ls.AppForDocument(sourceFileName, appUid, dataType);
       
   939     CleanupStack::PopAndDestroy(); //ls
       
   940     TPtrC8 mimeType = dataType.Des8();
       
   941     
       
   942     // attachment settings
       
   943     MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
   944     CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
   945     CleanupStack::PushL(attachmentInfo);
       
   946     attachmentInfo->SetAttachmentNameL( shortFileName );        
       
   947     attachmentInfo->SetMimeTypeL( mimeType );
       
   948     
       
   949     if ( mimeType == _L8("text/plain") )
       
   950         {
       
   951         // CMsvMimeHeaders needs to be stored in case of text file 
       
   952         CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
       
   953         CleanupStack::PushL(mimeHeaders);
       
   954         mimeHeaders->SetContentTypeL( _L8("text") );
       
   955         mimeHeaders->SetContentSubTypeL( _L8("plain") );
       
   956         mimeHeaders->SetMimeCharset( KMmsUtf8 );
       
   957         mimeHeaders->StoreL( *attachmentInfo );
       
   958         CleanupStack::PopAndDestroy( mimeHeaders );
       
   959         }
       
   960 
       
   961     // save
       
   962     
       
   963     CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
   964     TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
   965     if (err == KErrNone)
       
   966     	{
       
   967         waiter->StartAndWait();
       
   968         CleanupStack::PopAndDestroy(waiter);
       
   969         CleanupStack::Pop(); // attachmentInfo, the ownership is transferred
       
   970     	}
       
   971     else
       
   972     	{
       
   973     	CleanupStack::PopAndDestroy(waiter);
       
   974     	CleanupStack::PopAndDestroy(); // attachmentInfo, ownership is not transferred (leave occurs)
       
   975         LOGSTRING2("Creator: CCreatorMessages::HandleAttachementsL failed to attach %S", &sourceFileName);
       
   976     	}
       
   977     }
       
   978       //----------------------------------------------------------------------------
       
   979 
       
   980 TInt CCreatorMessages::CreateAMSEntryL(const CMessagesParameters& parameters)
       
   981     {
       
   982     LOGSTRING("Creator: CCreatorMessages::CreateAMSEntryL");
       
   983 
       
   984     TInt err = KErrNone;
       
   985 
       
   986         
       
   987     // init    
       
   988     if( iSession == 0 )
       
   989         {
       
   990         iSession = CMsvSession::OpenSyncL(*this);
       
   991         }
       
   992 
       
   993     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
   994     CleanupStack::PushL(registry);
       
   995 
       
   996     // get the client mtm and return if it isn't supported in the system        
       
   997     CMmsClientMtm* clientMtm = NULL;
       
   998     TRAP(err, clientMtm = static_cast<CMmsClientMtm*>(registry->NewMtmL(KUidMsgTypeMultimedia)));
       
   999     if (err || !clientMtm)
       
  1000         {
       
  1001         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1002         note->ExecuteLD(_L("MMS: Message type module not found"));
       
  1003         CleanupStack::PopAndDestroy(2);
       
  1004         User::Leave(KErrNotFound);
       
  1005         }  
       
  1006     CleanupStack::PushL(clientMtm);   
       
  1007 
       
  1008     // create a new object to access an existing entry
       
  1009     CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1010     CleanupStack::PushL(msvEntry);
       
  1011   
       
  1012     // get default service
       
  1013     TMsvId defaultServiceId = 0;
       
  1014     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
  1015     if (err)
       
  1016         {
       
  1017         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1018         note->ExecuteLD(_L("MMS: Define MMS settings first"));
       
  1019         CleanupStack::PopAndDestroy(2);
       
  1020         User::Leave(KErrNotFound);
       
  1021         } 
       
  1022     
       
  1023     // set folder type
       
  1024     switch (parameters.iFolderType)
       
  1025         {
       
  1026         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1027         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1028         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1029         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1030         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1031         }
       
  1032         
       
  1033     // mtm takes ownership of entry context	
       
  1034     CleanupStack::Pop(msvEntry);
       
  1035     clientMtm->SetCurrentEntryL(msvEntry);    
       
  1036     
       
  1037     // create a new message
       
  1038     clientMtm->CreateMessageL(defaultServiceId);
       
  1039 
       
  1040     // set subject
       
  1041     clientMtm->SetSubjectL(parameters.iMessageSubject->Des() );
       
  1042             
       
  1043     // set some mms defaults
       
  1044     clientMtm->SetMessageClass(EMmsClassPersonal);
       
  1045     clientMtm->SetExpiryInterval(86400);
       
  1046     clientMtm->SetDeliveryTimeInterval(3600);
       
  1047     clientMtm->SetMessagePriority(EMmsPriorityLow);
       
  1048     clientMtm->SetSenderVisibility(EMmsMaximumSenderVisibility);
       
  1049     clientMtm->SetDeliveryReport(EMmsDeliveryReportYes);
       
  1050     clientMtm->SetReadReply(EMmsReadReplyYes);        
       
  1051     
       
  1052     // set the sender / addressee field
       
  1053     if (parameters.iFolderType == EInbox)
       
  1054         {
       
  1055         AddMtmSenderL(*clientMtm, parameters, EFalse);                
       
  1056         }
       
  1057 
       
  1058     // Add all recipients to clientMtm
       
  1059     AddRecipientsL( *clientMtm, parameters, EFalse );
       
  1060     
       
  1061         
       
  1062     // get an access to the message store
       
  1063     CMsvStore* store = msvEntry->EditStoreL();
       
  1064     CleanupStack::PushL(store);                  
       
  1065    
       
  1066     // get the entry of the message
       
  1067     TMsvEntry messageEntry = clientMtm->Entry().Entry();        
       
  1068     
       
  1069     // set the details field
       
  1070     if (parameters.iFolderType == EInbox)
       
  1071         {
       
  1072         SetSenderToEntryDetails(messageEntry, parameters, EFalse);        
       
  1073         }  
       
  1074     else
       
  1075         {
       
  1076         SetRecipientToEntryDetails(messageEntry, parameters, EFalse);
       
  1077         }
       
  1078 
       
  1079     // set the description field same as the message subject
       
  1080     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1081     messageEntry.iBioType = KUidMsgSubTypeMmsAudioMsg.iUid;
       
  1082     
       
  1083     // save the changes done above
       
  1084     clientMtm->Entry().ChangeL(messageEntry);        
       
  1085     
       
  1086 
       
  1087     TFileName sourceFileName = iEngine->TestDataPathL( CCreatorEngine::EAMR_20kB );
       
  1088     TParse parser;
       
  1089     parser.Set(sourceFileName, NULL, NULL);
       
  1090     TFileName shortFileName = parser.NameAndExt();
       
  1091 
       
  1092     // get the mime type
       
  1093     RApaLsSession ls;
       
  1094     User::LeaveIfError(ls.Connect());
       
  1095     CleanupClosePushL<RApaLsSession>(ls);
       
  1096     TUid appUid;
       
  1097     TDataType dataType;
       
  1098     ls.AppForDocument(sourceFileName, appUid, dataType);
       
  1099     CleanupStack::PopAndDestroy(); //ls
       
  1100     TPtrC8 mimeType = dataType.Des8();
       
  1101         
       
  1102     // attachment settings
       
  1103     MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
  1104     CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
  1105     attachmentInfo->SetAttachmentNameL( shortFileName );        
       
  1106     attachmentInfo->SetMimeTypeL( mimeType );        
       
  1107 
       
  1108     // save
       
  1109     CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
  1110       
       
  1111     TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
  1112     if (err == KErrNone)
       
  1113         waiter->StartAndWait();
       
  1114     else
       
  1115         LOGSTRING2("Creator: CCreatorMessages::CreateAMSEntryL failed to attach %S", &sourceFileName);
       
  1116 
       
  1117     CleanupStack::PopAndDestroy(waiter);  
       
  1118 
       
  1119     // save the changes made to the message store
       
  1120     store->CommitL();
       
  1121     CleanupStack::PopAndDestroy(store);   
       
  1122            
       
  1123     
       
  1124     // save the message      
       
  1125     clientMtm->SaveMessageL();
       
  1126     	
       
  1127 	// final fine tuning
       
  1128 	messageEntry.SetAttachment(ETrue);
       
  1129     messageEntry.iDate.HomeTime();
       
  1130     messageEntry.SetVisible(ETrue);
       
  1131     messageEntry.SetInPreparation(EFalse);
       
  1132     if (parameters.iCreateAsUnread)
       
  1133         {
       
  1134         messageEntry.SetUnread(ETrue);
       
  1135         messageEntry.SetNew(ETrue);
       
  1136         }
       
  1137     else
       
  1138         {
       
  1139         messageEntry.SetUnread(EFalse);
       
  1140         messageEntry.SetNew(EFalse);
       
  1141         }
       
  1142     messageEntry.SetComplete(ETrue);
       
  1143     messageEntry.iServiceId = defaultServiceId;
       
  1144     messageEntry.iRelatedId = 0;
       
  1145     
       
  1146     if (parameters.iFolderType == EDrafts) 
       
  1147         messageEntry.SetReadOnly(EFalse);
       
  1148     else
       
  1149         messageEntry.SetReadOnly(ETrue);
       
  1150 
       
  1151 	messageEntry.iMtmData1 = KMmsMessageMRetrieveConf | KMmsMessageMobileTerminated;
       
  1152 	
       
  1153     clientMtm->Entry().ChangeL(messageEntry);
       
  1154     
       
  1155     // id has been generated, store it for being able to delete
       
  1156     // only entries created with Creator
       
  1157     iEntryIds.Append( messageEntry.Id() );
       
  1158     
       
  1159     CleanupStack::PopAndDestroy(2); // registry, clientMtm        
       
  1160         
       
  1161 
       
  1162     return err;
       
  1163     }
       
  1164 
       
  1165 //----------------------------------------------------------------------------
       
  1166 
       
  1167 TInt CCreatorMessages::CreateEmailEntryL(const CMessagesParameters& parameters)
       
  1168     {
       
  1169     LOGSTRING("Creator: CCreatorMessages::CreateEmailEntryL");
       
  1170 
       
  1171     TInt err = KErrNone;
       
  1172 
       
  1173     // init    
       
  1174     if( iSession == 0 )
       
  1175         {
       
  1176         iSession = CMsvSession::OpenSyncL(*this);
       
  1177         }
       
  1178     
       
  1179     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
  1180     CleanupStack::PushL(registry);
       
  1181     
       
  1182     // get the client mtm and return if it isn't supported in the system        
       
  1183     CSmtpClientMtm* clientMtm = NULL;
       
  1184     TRAP(err, clientMtm = static_cast<CSmtpClientMtm*>(registry->NewMtmL(KUidMsgTypeSMTP)));
       
  1185     
       
  1186     if (err || !clientMtm)
       
  1187         {
       
  1188         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1189         note->ExecuteLD(_L("Email: Message type module not found"));
       
  1190         CleanupStack::PopAndDestroy(2);
       
  1191         User::Leave(KErrNotFound);
       
  1192         }  
       
  1193     CleanupStack::PushL(clientMtm);   
       
  1194 
       
  1195     // create a new object to access an existing entry
       
  1196     CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1197     CleanupStack::PushL(msvEntry);
       
  1198   
       
  1199     // get default service
       
  1200     TMsvId defaultServiceId(0);
       
  1201     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
  1202     if (err)
       
  1203         {
       
  1204         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1205         note->ExecuteLD(_L("Email: Define a mailbox first"));
       
  1206         CleanupStack::PopAndDestroy(2);
       
  1207         User::Leave(KErrNotFound);
       
  1208         } 
       
  1209                 
       
  1210     // set folder type
       
  1211     switch (parameters.iFolderType)
       
  1212         {
       
  1213         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1214         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1215         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1216         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1217         case EMailbox:  { msvEntry->SetEntryL(iUserSelectedMailbox);          break; }
       
  1218         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1219         }
       
  1220         
       
  1221     // mtm takes ownership of entry context	
       
  1222     CleanupStack::Pop(msvEntry);
       
  1223     clientMtm->SetCurrentEntryL(msvEntry); 
       
  1224 
       
  1225     // create a new message
       
  1226     clientMtm->CreateMessageL(defaultServiceId);
       
  1227 
       
  1228     // set subject
       
  1229     clientMtm->SetSubjectL( parameters.iMessageSubject->Des() );
       
  1230     
       
  1231     // set body
       
  1232     clientMtm->Body().Reset();
       
  1233     clientMtm->Body().InsertL(0, parameters.iMessageBodyText->Des()); 
       
  1234 
       
  1235     // get the entry of the message
       
  1236     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
  1237     
       
  1238     // set the address fields
       
  1239     if (parameters.iFolderType == EInbox)
       
  1240         {
       
  1241         AddSenderToMtmAddresseeL(*clientMtm, parameters, ETrue );
       
  1242         SetSenderToEntryDetails(messageEntry, parameters, ETrue);
       
  1243         messageEntry.iMtm = KUidMsgTypeIMAP4;  // or any other than KUidMsgTypeSMTP to display 'from' field instead of 'to' field 
       
  1244         }
       
  1245     else
       
  1246         {
       
  1247         // Add all recipients to clientMtm
       
  1248         AddRecipientsL( *clientMtm, parameters, ETrue );
       
  1249         SetRecipientToEntryDetails(messageEntry, parameters, EFalse);        
       
  1250         }
       
  1251 
       
  1252     // set the description field same as the message subject
       
  1253     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1254 
       
  1255     // save the changes done above
       
  1256     clientMtm->Entry().ChangeL(messageEntry);
       
  1257     
       
  1258     // get an access to the message store
       
  1259     CMsvStore* store = msvEntry->EditStoreL();
       
  1260     CleanupStack::PushL(store); 
       
  1261     
       
  1262     // save the attachments
       
  1263     HandleAttachementsL(parameters, store, err);
       
  1264 //    for (TInt i=0; i<parameters.iAttachments->Count(); i++)
       
  1265 //        {
       
  1266 //        TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i) );
       
  1267 //
       
  1268 //        TParse parser;
       
  1269 //        parser.Set(sourceFileName, NULL, NULL);
       
  1270 //        TFileName shortFileName = parser.NameAndExt();
       
  1271 //
       
  1272 //        // get the mime type
       
  1273 //        RApaLsSession ls;
       
  1274 //        User::LeaveIfError(ls.Connect());
       
  1275 //        CleanupClosePushL<RApaLsSession>(ls);
       
  1276 //        TUid appUid;
       
  1277 //        TDataType dataType;
       
  1278 //        ls.AppForDocument(sourceFileName, appUid, dataType);
       
  1279 //        CleanupStack::PopAndDestroy(); //ls
       
  1280 //        TPtrC8 mimeType = dataType.Des8();
       
  1281 //        
       
  1282 //        // attachment settings
       
  1283 //        MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
       
  1284 //        CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); // ownership of attachmentInfo will be transferred
       
  1285 //        attachmentInfo->SetAttachmentNameL( shortFileName );        
       
  1286 //        attachmentInfo->SetMimeTypeL( mimeType );        
       
  1287 //
       
  1288 //        // save
       
  1289 //        CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
  1290 //
       
  1291 //        TRAP(err, attachMan.AddAttachmentL(sourceFileName, attachmentInfo, waiter->iStatus ));
       
  1292 //        if (err == KErrNone)
       
  1293 //            waiter->StartAndWait();
       
  1294 //        else
       
  1295 //            LOGSTRING2("Creator: CCreatorMessages::CreateEmailEntryL failed to attach %S", &sourceFileName);
       
  1296 //
       
  1297 //        CleanupStack::PopAndDestroy(waiter);  
       
  1298 //        }
       
  1299 
       
  1300     // save the changes made to the message store
       
  1301     store->CommitL();
       
  1302     CleanupStack::PopAndDestroy(store); 
       
  1303             
       
  1304     // save the message      
       
  1305     clientMtm->SaveMessageL();
       
  1306     	
       
  1307 	// final fine tuning
       
  1308 	TMsvEmailEntry temailEntry = static_cast<TMsvEmailEntry>(messageEntry);
       
  1309     temailEntry.SetMessageFolderType(EFolderTypeUnknown);
       
  1310     temailEntry.SetDisconnectedOperation(ENoDisconnectedOperations);
       
  1311     temailEntry.SetEncrypted(EFalse);
       
  1312     temailEntry.SetSigned(EFalse);
       
  1313     temailEntry.SetVCard(EFalse);
       
  1314     temailEntry.SetVCalendar(EFalse);
       
  1315     temailEntry.SetReceipt(EFalse);
       
  1316     temailEntry.SetMHTMLEmail(EFalse);
       
  1317     temailEntry.SetBodyTextComplete(ETrue);
       
  1318     
       
  1319 	if (parameters.iAttachments->Count() > 0)
       
  1320         temailEntry.SetAttachment(ETrue);
       
  1321     else
       
  1322         temailEntry.SetAttachment(EFalse);
       
  1323 	
       
  1324     temailEntry.iDate.HomeTime();
       
  1325     temailEntry.SetVisible(ETrue);
       
  1326     temailEntry.SetInPreparation(EFalse);
       
  1327     if (parameters.iCreateAsUnread)
       
  1328         {
       
  1329         temailEntry.SetUnread(ETrue);
       
  1330         temailEntry.SetNew(ETrue);
       
  1331         }
       
  1332     else
       
  1333         {
       
  1334         temailEntry.SetUnread(EFalse);
       
  1335         temailEntry.SetNew(EFalse);
       
  1336         }
       
  1337     temailEntry.SetComplete(ETrue);
       
  1338     temailEntry.iServiceId = defaultServiceId;
       
  1339     temailEntry.iRelatedId = 0;
       
  1340     
       
  1341     clientMtm->Entry().ChangeL(temailEntry);
       
  1342 
       
  1343     // reset email headers
       
  1344     CImHeader* header = CImHeader::NewLC();
       
  1345     CMsvStore* msvStore = msvEntry->EditStoreL();
       
  1346     CleanupStack::PushL(msvStore);
       
  1347     header->RestoreL(*msvStore);
       
  1348     header->SetSubjectL( parameters.iMessageSubject->Des() );
       
  1349     if( iSenderArray.Count() == 0 )
       
  1350         {
       
  1351         GetSendersL(iSenderArray, parameters, ETrue, 1 );
       
  1352         }
       
  1353     
       
  1354     if( iSenderArray.Count() > 0 )
       
  1355         {
       
  1356         header->SetFromL(iSenderArray[0]->Des());
       
  1357         }
       
  1358     else
       
  1359         {
       
  1360         header->SetFromL( parameters.iSenderAddress->Des() );
       
  1361         }
       
  1362     if( parameters.iRecipientAddress->Length() > 0 )
       
  1363         {
       
  1364         header->SetReceiptAddressL( parameters.iRecipientAddress->Des() );
       
  1365         }
       
  1366     else if( parameters.iRecipientAddressArray.Count() > 0 )
       
  1367         {
       
  1368         header->SetReceiptAddressL( parameters.iRecipientAddressArray[0]->Des());
       
  1369         }
       
  1370     
       
  1371     header->StoreL( *msvStore );
       
  1372     msvStore->CommitL();
       
  1373     CleanupStack::PopAndDestroy(2); // msvStore, header
       
  1374     
       
  1375     // id has been generated, store it for being able to delete
       
  1376     // only entries created with Creator
       
  1377     iEntryIds.Append( messageEntry.Id() );
       
  1378     
       
  1379     CleanupStack::PopAndDestroy(2); // registry, clientMtm 
       
  1380 
       
  1381     return err;
       
  1382     }
       
  1383 
       
  1384 //----------------------------------------------------------------------------
       
  1385 
       
  1386 TInt CCreatorMessages::CreateSmartMessageEntryL(const CMessagesParameters& parameters)
       
  1387     {
       
  1388     LOGSTRING("Creator: CCreatorMessages::CreateSmartMessageEntryL");
       
  1389 
       
  1390     TInt err = KErrNone;
       
  1391 
       
  1392     // init    
       
  1393     if( iSession == 0 )
       
  1394         {
       
  1395         iSession = CMsvSession::OpenSyncL(*this);
       
  1396         }
       
  1397     
       
  1398     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
  1399     CleanupStack::PushL(registry);
       
  1400 
       
  1401     // get the client mtm and return if it isn't supported in the system        
       
  1402     CSmsClientMtm* clientMtm = NULL;
       
  1403     TRAP(err, clientMtm = static_cast<CSmsClientMtm*>(registry->NewMtmL(KUidMsgTypeSMS)));
       
  1404     if (err || !clientMtm)
       
  1405         {
       
  1406         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1407         note->ExecuteLD(_L("BIO: Message type module not found"));
       
  1408         CleanupStack::PopAndDestroy(2);
       
  1409         User::Leave(KErrNotFound);
       
  1410         }  
       
  1411     CleanupStack::PushL(clientMtm);   
       
  1412 
       
  1413     // create a new object to access an existing entry
       
  1414     CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1415     CleanupStack::PushL(msvEntry);
       
  1416   
       
  1417     // get default service
       
  1418     TMsvId defaultServiceId = 0;
       
  1419     TRAP(err, defaultServiceId = clientMtm->DefaultServiceL());
       
  1420     if (err)
       
  1421         {
       
  1422         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1423         note->ExecuteLD(_L("SMS: Define a SMS centre first"));
       
  1424         CleanupStack::PopAndDestroy(2);
       
  1425         User::Leave(KErrNotFound);
       
  1426         } 
       
  1427     
       
  1428     // set folder type
       
  1429     switch (parameters.iFolderType)
       
  1430         {
       
  1431         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1432         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1433         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1434         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1435         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1436         }
       
  1437         
       
  1438     // mtm takes ownership of entry context	
       
  1439     CleanupStack::Pop(msvEntry);
       
  1440     clientMtm->SetCurrentEntryL(msvEntry);    
       
  1441     
       
  1442     // create a new message
       
  1443     clientMtm->CreateMessageL(defaultServiceId);
       
  1444 
       
  1445      // set the from field to sms header
       
  1446     if (parameters.iFolderType == EInbox)
       
  1447         {
       
  1448         CSmsHeader& smsHeader = clientMtm->SmsHeader();
       
  1449         
       
  1450         if( parameters.iSenderAddress )
       
  1451             {
       
  1452             smsHeader.SetFromAddressL( parameters.iSenderAddress->Des() );
       
  1453             }
       
  1454         else
       
  1455             {
       
  1456             smsHeader.SetFromAddressL(KEmpty);
       
  1457             }
       
  1458         }       
       
  1459 
       
  1460     // set body, the BIO message itself
       
  1461     clientMtm->Body().Reset();
       
  1462     clientMtm->Body().InsertL(0, _L("Business Card\nTester Mike\nThe Company Ltd.\nSoftware Engineer\ntel +358 66 1234567\n")); 
       
  1463 
       
  1464     // get the entry of the message
       
  1465     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
  1466 
       
  1467     // TO-DO: Add support for all BIO messages, currently just insert a business card message ... :
       
  1468     // set the message type
       
  1469     // parameters.iBIOMessageType ...
       
  1470     clientMtm->BioTypeChangedL(KUidBIOBusinessCardMsg);
       
  1471     messageEntry.iBioType = KUidBIOBusinessCardMsg.iUid;
       
  1472 
       
  1473     // set the details field
       
  1474     if (parameters.iFolderType == EInbox)
       
  1475         {
       
  1476         SetSenderToEntryDetails(messageEntry, parameters, EFalse);        
       
  1477         }        
       
  1478     else
       
  1479         {
       
  1480         SetRecipientToEntryDetails(messageEntry, parameters, EFalse);
       
  1481         }
       
  1482 
       
  1483     // set the subject line
       
  1484     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1485 
       
  1486     // set correct MTM type
       
  1487     messageEntry.iMtm= KUidBIOMessageTypeMtm;
       
  1488 
       
  1489     // save the changes done above
       
  1490     clientMtm->Entry().ChangeL(messageEntry);
       
  1491 
       
  1492     // save the message     
       
  1493     clientMtm->SaveMessageL();
       
  1494     	
       
  1495 	// final fine tuning
       
  1496     messageEntry.SetAttachment(EFalse);
       
  1497     messageEntry.iDate.HomeTime();
       
  1498     messageEntry.SetVisible(ETrue);
       
  1499     messageEntry.SetInPreparation(EFalse);
       
  1500     if (parameters.iCreateAsUnread)
       
  1501         {
       
  1502         messageEntry.SetUnread(ETrue);
       
  1503         messageEntry.SetNew(ETrue);
       
  1504         }
       
  1505     else
       
  1506         {
       
  1507         messageEntry.SetUnread(EFalse);
       
  1508         messageEntry.SetNew(EFalse);
       
  1509         }
       
  1510     messageEntry.SetComplete(ETrue);
       
  1511     messageEntry.iServiceId = defaultServiceId;
       
  1512     messageEntry.iRelatedId = 0;
       
  1513     clientMtm->Entry().ChangeL(messageEntry);
       
  1514     
       
  1515     // id has been generated, store it for being able to delete
       
  1516     // only entries created with Creator
       
  1517     iEntryIds.Append( messageEntry.Id() );
       
  1518     
       
  1519     CleanupStack::PopAndDestroy(2); // registry, clientMtm
       
  1520         
       
  1521     
       
  1522     return err;
       
  1523     }
       
  1524 
       
  1525 //----------------------------------------------------------------------------
       
  1526 
       
  1527 TInt CCreatorMessages::CreateObexEntryL(TUid aMtm, const CMessagesParameters& parameters)
       
  1528     {
       
  1529     LOGSTRING("Creator: CCreatorMessages::CreateObexEntryL");
       
  1530 
       
  1531     TInt err = KErrNone;
       
  1532 
       
  1533     // init    
       
  1534     if( iSession == 0 )
       
  1535         {
       
  1536         iSession = CMsvSession::OpenSyncL(*this);
       
  1537         }    
       
  1538     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
  1539     CleanupStack::PushL(registry);
       
  1540 
       
  1541     // get the client mtm and return if it isn't supported in the system        
       
  1542     CObexClientMtm* clientMtm = NULL;
       
  1543     TRAP(err, clientMtm = static_cast<CObexClientMtm*>(registry->NewMtmL(aMtm)));
       
  1544     if (err || !clientMtm)
       
  1545         {
       
  1546         CAknErrorNote* note = new(ELeave) CAknErrorNote;
       
  1547         note->ExecuteLD(_L("Obex: Message type module not found"));
       
  1548         CleanupStack::PopAndDestroy(2);
       
  1549         User::Leave(KErrNotFound);
       
  1550         }  
       
  1551     CleanupStack::PushL(clientMtm);   
       
  1552 
       
  1553     // create a new object to access an existing entry
       
  1554     CMsvEntry* msvEntry = CMsvEntry::NewL(*iSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
       
  1555     CleanupStack::PushL(msvEntry);
       
  1556   
       
  1557     // define default service
       
  1558     TMsvId defaultServiceId = 0;
       
  1559     
       
  1560     // set folder type
       
  1561     switch (parameters.iFolderType)
       
  1562         {
       
  1563         case EInbox:    { msvEntry->SetEntryL(KMsvGlobalInBoxIndexEntryId);   break; }
       
  1564         case EDrafts:   { msvEntry->SetEntryL(KMsvDraftEntryId);              break; }
       
  1565         case EOutbox:   { msvEntry->SetEntryL(KMsvGlobalOutBoxIndexEntryId);  break; }
       
  1566         case ESent:     { msvEntry->SetEntryL(KMsvSentEntryId);               break; }
       
  1567         default:        { User::Panic(_L("Folder Type"), 871);                break; } 
       
  1568         }
       
  1569         
       
  1570     // mtm takes ownership of entry context	
       
  1571     CleanupStack::Pop(msvEntry);
       
  1572     clientMtm->SetCurrentEntryL(msvEntry);    
       
  1573     
       
  1574     // create a new message
       
  1575     clientMtm->CreateMessageL(defaultServiceId);
       
  1576 
       
  1577     // get the entry of the message
       
  1578     TMsvEntry messageEntry = clientMtm->Entry().Entry();
       
  1579 
       
  1580     // set subject
       
  1581     clientMtm->SetSubjectL( parameters.iMessageSubject->Des() );
       
  1582     messageEntry.iDescription.Set( parameters.iMessageSubject->Des().Left(KSmsDescriptionLength) );
       
  1583 
       
  1584     // set body, must be empty for obex messages
       
  1585     clientMtm->Body().Reset();
       
  1586 
       
  1587     // set the details field and
       
  1588     if (parameters.iFolderType == EInbox)
       
  1589         {
       
  1590         SetSenderToEntryDetails(messageEntry, parameters, EFalse);
       
  1591         }        
       
  1592     else
       
  1593         {
       
  1594         SetRecipientToEntryDetails(messageEntry, parameters, EFalse);
       
  1595         }
       
  1596     
       
  1597     // set mtm
       
  1598     messageEntry.iMtm = aMtm;
       
  1599     messageEntry.iType = KUidMsvMessageEntry;
       
  1600     messageEntry.iServiceId = KMsvUnknownServiceIndexEntryId;
       
  1601 
       
  1602     // save the changes done above
       
  1603     clientMtm->Entry().ChangeL(messageEntry);
       
  1604 
       
  1605     // save the message      
       
  1606     clientMtm->SaveMessageL();
       
  1607     	
       
  1608 	// final fine tuning
       
  1609     messageEntry.iDate.HomeTime();
       
  1610     messageEntry.SetVisible(ETrue);
       
  1611     messageEntry.SetInPreparation(EFalse);
       
  1612     if (parameters.iCreateAsUnread)
       
  1613         {
       
  1614         messageEntry.SetUnread(ETrue);
       
  1615         messageEntry.SetNew(ETrue);
       
  1616         }
       
  1617     else
       
  1618         {
       
  1619         messageEntry.SetUnread(EFalse);
       
  1620         messageEntry.SetNew(EFalse);
       
  1621         }
       
  1622     messageEntry.SetComplete(ETrue);
       
  1623     clientMtm->Entry().ChangeL(messageEntry);
       
  1624     
       
  1625     // save the attachment
       
  1626     if (parameters.iAttachments->Count() >= 1)
       
  1627         {
       
  1628         // create a new entry for the attachment
       
  1629         TMsvEntry attachTEntry;
       
  1630         attachTEntry.iType      = KUidMsvAttachmentEntry;
       
  1631         attachTEntry.iServiceId = KMsvUnknownServiceIndexEntryId;   
       
  1632         attachTEntry.iMtm       = KUidMsgTypeBt; //save as bt message
       
  1633         
       
  1634         msvEntry->CreateL(attachTEntry);
       
  1635         
       
  1636         CMsvEntry* attachEntry = iSession->GetEntryL(attachTEntry.Id());
       
  1637         clientMtm->SetCurrentEntryL(attachEntry);
       
  1638                 
       
  1639         // get source file
       
  1640         TFileName sourceFileName = iEngine->TestDataPathL( (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(0) );
       
  1641 
       
  1642         // get the mime type
       
  1643         RApaLsSession ls;
       
  1644         User::LeaveIfError(ls.Connect());
       
  1645         CleanupClosePushL<RApaLsSession>(ls);
       
  1646         TUid appUid;
       
  1647         TDataType mimeType;
       
  1648         ls.AppForDocument(sourceFileName, appUid, mimeType);
       
  1649         CleanupStack::PopAndDestroy(); //ls
       
  1650         
       
  1651         CAsyncWaiter* waiter = CAsyncWaiter::NewLC();
       
  1652 
       
  1653         // add an attachment to the current message entry
       
  1654         TRAP(err, clientMtm->AddAttachmentL( sourceFileName, mimeType.Des8(), 0, waiter->iStatus ));
       
  1655         if (err == KErrNone)
       
  1656             waiter->StartAndWait();
       
  1657         else
       
  1658             LOGSTRING2("Creator: CCreatorMessages::CreateObexEntryL failed to attach %S", &sourceFileName);
       
  1659         
       
  1660         CleanupStack::PopAndDestroy(waiter);
       
  1661         }
       
  1662     
       
  1663     // id has been generated, store it for being able to delete
       
  1664     // only entries created with Creator
       
  1665     iEntryIds.Append( messageEntry.Id() );
       
  1666     
       
  1667     CleanupStack::PopAndDestroy(2); // registry, clientMtm 
       
  1668 
       
  1669 
       
  1670     return err;
       
  1671     }
       
  1672 
       
  1673 //----------------------------------------------------------------------------
       
  1674 
       
  1675 void CCreatorMessages::HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) // from MMsvSessionObserver
       
  1676     {
       
  1677     }
       
  1678 
       
  1679 //----------------------------------------------------------------------------
       
  1680 void CCreatorMessages::SetSenderToEntryDetails(TMsvEntry& aMsgEntry, const CMessagesParameters& aParameters, TBool aUseEmailAddress)
       
  1681     {        
       
  1682     // Only one sender allowed:
       
  1683     if( iSenderArray.Count() == 0 )
       
  1684         {
       
  1685         GetSendersL(iSenderArray, aParameters, aUseEmailAddress, 1 );
       
  1686         }
       
  1687     if( iSenderArray.Count() > 0 )
       
  1688         {        
       
  1689         aMsgEntry.iDetails.Set( iSenderArray[0]->Des() );        
       
  1690         }
       
  1691     else
       
  1692         {
       
  1693         aMsgEntry.iDetails.Set(KEmpty);
       
  1694         }        
       
  1695     }
       
  1696 
       
  1697 //----------------------------------------------------------------------------
       
  1698 void CCreatorMessages::SetRecipientToEntryDetails(TMsvEntry& aMsgEntry, const CMessagesParameters& aParameters, TBool aUseEmailAddress)
       
  1699     {        
       
  1700     // Only one sender allowed:
       
  1701     GetAllRecipientsL(iRecipientArray, aParameters, aUseEmailAddress);
       
  1702     if( iRecipientArray.Count() > 0 )
       
  1703         {
       
  1704         const TDesC& temp = iRecipientArray[0]->Des();
       
  1705         aMsgEntry.iDetails.Set( temp );
       
  1706         }
       
  1707     else
       
  1708         {
       
  1709         aMsgEntry.iDetails.Set(KEmpty);
       
  1710         }        
       
  1711     }
       
  1712 
       
  1713 //----------------------------------------------------------------------------
       
  1714 void CCreatorMessages::AddSenderToMtmAddresseeL(CBaseMtm& aMtm, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1715     {    
       
  1716     // Only one sender allowed:
       
  1717     if( iSenderArray.Count() == 0 )
       
  1718         {
       
  1719         GetSendersL(iSenderArray, aParameters, aUseEmailAddress, 1 );
       
  1720         }
       
  1721     
       
  1722     for( TInt i = 0; i < iSenderArray.Count(); ++i )
       
  1723         {
       
  1724         aMtm.AddAddresseeL( iSenderArray[i]->Des() );        
       
  1725         }    
       
  1726     }
       
  1727 
       
  1728 //----------------------------------------------------------------------------
       
  1729 void CCreatorMessages::AddMtmSenderL(CMmsClientMtm& aMtm, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1730     {    
       
  1731     // Only one sender allowed:
       
  1732     if( iSenderArray.Count() == 0 )
       
  1733         {
       
  1734         GetSendersL(iSenderArray, aParameters, aUseEmailAddress, 1 );
       
  1735         }
       
  1736     
       
  1737     if( iSenderArray.Count() > 0 )
       
  1738         {
       
  1739         aMtm.SetSenderL( iSenderArray[0]->Des() );        
       
  1740         }    
       
  1741     }
       
  1742 
       
  1743 //----------------------------------------------------------------------------
       
  1744 void CCreatorMessages::GetSendersL(RPointerArray<HBufC>& aSenderArray, const CMessagesParameters& aParameters, TBool aUseEmailAddress, TInt aMaxNum )
       
  1745     {
       
  1746     TInt counter = 0;
       
  1747     
       
  1748     if( counter < aMaxNum || aMaxNum == KUndef )
       
  1749         {
       
  1750         if( aParameters.iSenderAddress && aParameters.iSenderAddress->Length() > 0 )
       
  1751             {
       
  1752             HBufC* temp = HBufC::NewL(aParameters.iSenderAddress->Length());
       
  1753             CleanupStack::PushL(temp);
       
  1754             temp->Des().Copy(aParameters.iSenderAddress->Des());
       
  1755             aSenderArray.AppendL( temp );
       
  1756             CleanupStack::Pop(); // temp
       
  1757             ++counter;
       
  1758             }
       
  1759         }
       
  1760             
       
  1761     if( counter < aMaxNum || aMaxNum == KUndef )
       
  1762         {
       
  1763         RPointerArray<HBufC> tempArray;
       
  1764         CleanupResetAndDestroyPushL( tempArray );
       
  1765         GetLinkedAddressesL(tempArray, aParameters.iSenderLinkIds, aUseEmailAddress, aParameters.iNumberOfExistingSenders);
       
  1766         for( TInt i = 0; i < tempArray.Count() && (counter < aMaxNum || aMaxNum == KUndef); ++i )
       
  1767             {
       
  1768             HBufC* temp = tempArray[i]->AllocLC();
       
  1769             aSenderArray.AppendL(temp);
       
  1770             CleanupStack::Pop(); // temp
       
  1771             ++counter;
       
  1772             }
       
  1773         CleanupStack::PopAndDestroy(); // tempArray
       
  1774         }    
       
  1775     }
       
  1776 
       
  1777 //----------------------------------------------------------------------------
       
  1778 void CCreatorMessages::AddRecipientsL(CBaseMtm& aMtm, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1779     {
       
  1780     GetAllRecipientsL(iRecipientArray, aParameters, aUseEmailAddress);
       
  1781     for( TInt i = 0; i < iRecipientArray.Count(); ++i )
       
  1782         {
       
  1783         aMtm.AddAddresseeL( iRecipientArray[i]->Des() );        
       
  1784         }    
       
  1785     }
       
  1786 
       
  1787 //----------------------------------------------------------------------------
       
  1788 void CCreatorMessages::GetAllRecipientsL(RPointerArray<HBufC>& aRecipientArray, const CMessagesParameters& aParameters, TBool aUseEmailAddress )
       
  1789     {
       
  1790     
       
  1791     // If iRecipientAddress is given, add it to the array:
       
  1792     if( aParameters.iRecipientAddress && aParameters.iRecipientAddress->Length() > 0 )
       
  1793         {
       
  1794         HBufC* temp = HBufC::NewL(aParameters.iRecipientAddress->Length());
       
  1795         CleanupStack::PushL(temp);
       
  1796         temp->Des().Copy(aParameters.iRecipientAddress->Des());
       
  1797         aRecipientArray.AppendL( temp );
       
  1798         CleanupStack::Pop(); // temp
       
  1799         }
       
  1800     
       
  1801     // Add all recipients listed in iRecipientAddressArray:
       
  1802     for( TInt i = 0; i < aParameters.iRecipientAddressArray.Count(); ++i )
       
  1803         {
       
  1804         HBufC* temp = HBufC::NewL(aParameters.iRecipientAddressArray[i]->Length());
       
  1805         CleanupStack::PushL(temp);
       
  1806         temp->Des().Copy(aParameters.iRecipientAddressArray[i]->Des());
       
  1807         aRecipientArray.AppendL( temp );
       
  1808         CleanupStack::Pop(); // temp        
       
  1809         }
       
  1810     
       
  1811     // Get all linked addresses. 
       
  1812     GetLinkedAddressesL(aRecipientArray, aParameters.iRecipientLinkIds, aUseEmailAddress, aParameters.iNumberOfExistingRecipients);
       
  1813     }
       
  1814 
       
  1815 /*
       
  1816  * Get all linked addresses. This method gets addresses that are linked with contact-set id and 
       
  1817  * existing addresses from the contact database, if required.
       
  1818  */
       
  1819 void CCreatorMessages::GetLinkedAddressesL(
       
  1820         RPointerArray<HBufC>& aAddressArray, 
       
  1821         const RArray<TLinkIdParam>& aLinkIds, 
       
  1822         TBool aUseEmailAddress,
       
  1823         TInt aNumOfExistingAddresses )
       
  1824     {
       
  1825 #if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
       
  1826     
       
  1827     if( aNumOfExistingAddresses > 0 || aLinkIds.Count() > 0 )
       
  1828         {
       
  1829         // First create contact manager:
       
  1830         if( iContactManager == 0)
       
  1831         	{
       
  1832         	CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
       
  1833         	uriArray->AppendL( TVPbkContactStoreUriPtr(VPbkContactStoreUris::DefaultCntDbUri()));
       
  1834         	iContactManager = CVPbkContactManager::NewL( *uriArray, &CCoeEnv::Static()->FsSession());
       
  1835         	CleanupStack::PopAndDestroy(uriArray);
       
  1836 
       
  1837         
       
  1838             // Then open the stores:
       
  1839                 
       
  1840             MVPbkContactStoreList& storeList = iContactManager->ContactStoresL();              
       
  1841             storeList.OpenAllL(*this);
       
  1842             iWaiter->StartAndWait(); 
       
  1843             _LIT(dbUri, "cntdb://c:contacts.cdb");
       
  1844             TVPbkContactStoreUriPtr uri(dbUri);                   
       
  1845             iStore = storeList.Find(uri);
       
  1846         	}
       
  1847         // Existing attendees:
       
  1848         if( aNumOfExistingAddresses > 0 )
       
  1849         	{        	
       
  1850         	if( iStore )
       
  1851         		{
       
  1852         		const MVPbkFieldTypeList& fieldList = iStore->StoreProperties().SupportedFields();
       
  1853 
       
  1854         		// get contacts, results will be set to iExistingContacts
       
  1855         		MVPbkContactOperationBase* operation = iContactManager->FindL(_L(""), fieldList , *this);
       
  1856         		if (operation)
       
  1857         			{
       
  1858         			CleanupDeletePushL( operation );
       
  1859         			iWaiter->StartAndWait();//Making asynchronous FindL to synchronous
       
  1860         			CleanupStack::Pop(operation);
       
  1861         			delete operation;
       
  1862         			}
       
  1863         		if( iExistingContacts )
       
  1864         			{
       
  1865         			// Loop the links pointing to the existing contacts:
       
  1866         			TInt addedContacts = 0;
       
  1867         			for( TInt i = 0; i < iExistingContacts->Count() && addedContacts < aNumOfExistingAddresses; ++i )
       
  1868         				{
       
  1869         				// Get the address of the actual contact based on the contact link. Results are stored in
       
  1870         				// iTmpEmail and iTmpPhoneNumber
       
  1871         				MVPbkContactOperationBase* operation = iContactManager->RetrieveContactL( iExistingContacts->At(i), *this );
       
  1872         				if (operation)
       
  1873         					{
       
  1874         					CleanupDeletePushL( operation );
       
  1875         					iWaiter->StartAndWait(); // Making asynchronous RetrieveContactL to synchronous
       
  1876         					CleanupStack::Pop(); // operation
       
  1877         					delete operation;
       
  1878         					operation = 0;
       
  1879         					HandleSingleContactResultL();
       
  1880         					if( aUseEmailAddress && iTmpEmail && iTmpEmail->Length() > 0 )
       
  1881         						{
       
  1882         						HBufC* temp = HBufC::NewL(iTmpEmail->Length());
       
  1883         						CleanupStack::PushL(temp);
       
  1884         						temp->Des().Copy(iTmpEmail->Des());
       
  1885         						aAddressArray.AppendL(temp);
       
  1886         						CleanupStack::Pop(); // temp
       
  1887         						delete iTmpEmail;
       
  1888         						iTmpEmail = 0; // The pointer is owned by the aAddressArray now.    
       
  1889         						++addedContacts;
       
  1890         						}
       
  1891         					else if( !aUseEmailAddress && iTmpPhoneNumber && iTmpPhoneNumber->Length() > 0 )
       
  1892         						{
       
  1893         						HBufC* temp = HBufC::NewL(iTmpPhoneNumber->Length());
       
  1894         						CleanupStack::PushL(temp);
       
  1895         						temp->Des().Copy(iTmpPhoneNumber->Des());
       
  1896         						aAddressArray.AppendL(temp);
       
  1897         						CleanupStack::Pop(); // temp
       
  1898         						delete iTmpPhoneNumber;
       
  1899         						iTmpPhoneNumber = 0; // The pointer is owned by the aAddressArray now.
       
  1900         						++addedContacts;
       
  1901         						}
       
  1902         					}                            
       
  1903         				}
       
  1904         			}
       
  1905         		} 
       
  1906         	}
       
  1907 
       
  1908         // Loop linked contact-set ids:
       
  1909         for( TInt i = 0; i < aLinkIds.Count(); ++i )
       
  1910         	{
       
  1911         	TLinkIdParam id = aLinkIds[i];
       
  1912         	// Get all contact links in the contact-set...
       
  1913         	RPointerArray<MVPbkContactLink>& links = ContactLinkCache::Instance()->ContactLinks(id.iLinkId);
       
  1914         	// ... and loop the links:
       
  1915         	TInt addedContacts = 0;
       
  1916         	for( TInt j = 0; j < links.Count() && (id.iLinkAmount < 0 || addedContacts < id.iLinkAmount); ++j )
       
  1917         		{
       
  1918         		// Again retrieve contact based on the contact link. Results are stored in
       
  1919         		// iTmpEmail and iTmpPhoneNumber:
       
  1920         		MVPbkContactOperationBase* operation = iContactManager->RetrieveContactL( *(links[j]), *this );
       
  1921         		if (operation)
       
  1922         			{
       
  1923         			CleanupDeletePushL( operation );
       
  1924         			iWaiter->StartAndWait(); // Making asynchronous RetrieveContactL to synchronous
       
  1925         			CleanupStack::Pop(operation);
       
  1926         			delete operation;
       
  1927         			operation = 0;
       
  1928         			HandleSingleContactResultL();
       
  1929         			if( aUseEmailAddress && iTmpEmail && iTmpEmail->Length() > 0 )
       
  1930         				{                                    
       
  1931         				aAddressArray.AppendL(iTmpEmail);
       
  1932         				iTmpEmail = 0; // The pointer is owned by the aAddressArray now.
       
  1933         				++addedContacts;
       
  1934         				}
       
  1935         			else if( !aUseEmailAddress && iTmpPhoneNumber && iTmpPhoneNumber->Length() > 0 )
       
  1936         				{
       
  1937         				aAddressArray.AppendL(iTmpPhoneNumber);
       
  1938         				iTmpPhoneNumber = 0; // The pointer is owned by the aAddressArray now.
       
  1939         				++addedContacts;
       
  1940         				}
       
  1941         			}                 
       
  1942         		}
       
  1943         	}
       
  1944 
       
  1945         //if( iContactManager )
       
  1946         //	iContactManager->ContactStoresL().CloseAll(*this);
       
  1947         }
       
  1948 #endif
       
  1949 }
       
  1950 
       
  1951 //----------------------------------------------------------------------------
       
  1952 #if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
       
  1953 void CCreatorMessages::VPbkSingleContactOperationComplete(
       
  1954             MVPbkContactOperationBase& /*aOperation*/,
       
  1955             MVPbkStoreContact* aContact )
       
  1956     {
       
  1957     LOGSTRING("Creator: CCreatorMessages::VPbkSingleContactOperationComplete" );
       
  1958     iWaiter->Cancel();
       
  1959     delete iTempContact;    
       
  1960     iTempContact = aContact;
       
  1961     }
       
  1962 
       
  1963 void CCreatorMessages::HandleSingleContactResultL()
       
  1964 	{
       
  1965     if( iTempContact )
       
  1966         {        
       
  1967         TPtrC phoneNumber;        
       
  1968         TPtrC email;
       
  1969        
       
  1970         // Put contact's name to temporary member:
       
  1971         delete iTmpPhoneNumber;
       
  1972         iTmpPhoneNumber = 0;
       
  1973         delete iTmpEmail;
       
  1974         iTmpEmail = 0;
       
  1975        
       
  1976         TBool phFound = EFalse;
       
  1977         TBool emailFound = EFalse;
       
  1978         
       
  1979         MVPbkStoreContactFieldCollection& fields = iTempContact->Fields();
       
  1980         TInt fieldCount = fields.FieldCount();
       
  1981         for (TInt i = 0; i < fieldCount; ++i)
       
  1982             {
       
  1983             MVPbkStoreContactField& field = fields.FieldAt(i);
       
  1984             MVPbkContactFieldData& fieldData = field.FieldData();
       
  1985             const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
  1986             
       
  1987             if( fieldType ) 
       
  1988                 {
       
  1989                 // Find phone number and email:
       
  1990                 TInt fieldId( fieldType->FieldTypeResId() );
       
  1991             
       
  1992                 TVPbkFieldStorageType dataType = fieldData.DataType();
       
  1993                 if( dataType == EVPbkFieldStorageTypeText)
       
  1994                     {
       
  1995                     MVPbkContactFieldTextData& textData = MVPbkContactFieldTextData::Cast(fieldData);                
       
  1996                     if( !phFound &&
       
  1997                         (fieldId == R_VPBK_FIELD_TYPE_LANDPHONEGEN ||
       
  1998                         fieldId == R_VPBK_FIELD_TYPE_LANDPHONEHOME ||
       
  1999                         fieldId == R_VPBK_FIELD_TYPE_LANDPHONEWORK ||                      
       
  2000                         fieldId == R_VPBK_FIELD_TYPE_MOBILEPHONEGEN ||
       
  2001                         fieldId == R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ||
       
  2002                         fieldId == R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ))
       
  2003                         {                    
       
  2004                         phoneNumber.Set(textData.Text());
       
  2005                         phFound = ETrue;
       
  2006                         }
       
  2007                     else if( !emailFound &&
       
  2008                             (fieldId == R_VPBK_FIELD_TYPE_EMAILGEN ||
       
  2009                             fieldId == R_VPBK_FIELD_TYPE_EMAILHOME ||
       
  2010                             fieldId == R_VPBK_FIELD_TYPE_EMAILWORK ))
       
  2011                         {
       
  2012                         email.Set(textData.Text());
       
  2013                         emailFound = ETrue;
       
  2014                         }
       
  2015                     
       
  2016                     if( phFound && emailFound )
       
  2017                         break; // No need to loop more fields.
       
  2018                     }            
       
  2019                 }
       
  2020             }
       
  2021         if( phoneNumber.Length() > 0 )
       
  2022             {
       
  2023             delete iTmpPhoneNumber;
       
  2024             iTmpPhoneNumber = 0;
       
  2025             iTmpPhoneNumber = HBufC::NewL(phoneNumber.Length());
       
  2026             iTmpPhoneNumber->Des().Copy(phoneNumber); 
       
  2027             }                
       
  2028         if( email.Length() > 0 )
       
  2029             {
       
  2030             delete iTmpEmail;
       
  2031             iTmpEmail = 0;
       
  2032             iTmpEmail = HBufC::NewL(email.Length());            	
       
  2033             iTmpEmail->Des().Copy(email);
       
  2034             }
       
  2035         delete iTempContact;
       
  2036         iTempContact = 0;
       
  2037         }
       
  2038     }
       
  2039     
       
  2040 void CCreatorMessages::VPbkSingleContactOperationFailed(
       
  2041             MVPbkContactOperationBase& /*aOperation*/, 
       
  2042             TInt aError )
       
  2043     {
       
  2044     LOGSTRING2("Creator: CCreatorMessages::VPbkSingleContactOperationFailed - Error: %d", aError );
       
  2045     iWaiter->Cancel();
       
  2046     }
       
  2047 
       
  2048 void CCreatorMessages::OpenComplete()
       
  2049     {    
       
  2050     LOGSTRING("Creator: CCreatorMessages::OpenComplete()");
       
  2051     iWaiter->Cancel();
       
  2052     }
       
  2053 
       
  2054 void CCreatorMessages::StoreReady(MVPbkContactStore& /*aContactStore*/)
       
  2055     {
       
  2056     LOGSTRING("Creator: CCreatorMessages::StoreReady()");
       
  2057     iWaiter->Cancel();
       
  2058     }
       
  2059 
       
  2060 void CCreatorMessages::StoreUnavailable(MVPbkContactStore& /*aContactStore*/, 
       
  2061         TInt /*aReason*/)
       
  2062     {
       
  2063     LOGSTRING("Creator: CCreatorMessages::StoreUnavailable()");
       
  2064     iWaiter->Cancel();
       
  2065     }
       
  2066 
       
  2067 
       
  2068 void CCreatorMessages::HandleStoreEventL(
       
  2069         MVPbkContactStore& /*aContactStore*/, 
       
  2070         TVPbkContactStoreEvent /*aStoreEvent*/)
       
  2071     {
       
  2072     LOGSTRING("Creator: CCreatorMessages::HandleStoreEventL()");
       
  2073     iWaiter->Cancel();
       
  2074     }
       
  2075 
       
  2076 void CCreatorMessages::FindCompleteL( MVPbkContactLinkArray* aResults )
       
  2077     {
       
  2078     LOGSTRING("Creator: CCreatorMessages::FindCompleteL()");
       
  2079     iWaiter->Cancel();
       
  2080     delete iExistingContacts;
       
  2081     iExistingContacts = aResults;
       
  2082     }
       
  2083 
       
  2084 void CCreatorMessages::FindFailed( TInt aError )
       
  2085     {
       
  2086     LOGSTRING2("Creator: CCreatorMessages:FindFailed() - Error: %d", aError);    
       
  2087     iWaiter->Cancel();
       
  2088     delete iExistingContacts;
       
  2089     iExistingContacts = 0;
       
  2090     }
       
  2091 #endif
       
  2092 
       
  2093 
       
  2094 //----------------------------------------------------------------------------
       
  2095 void CCreatorMessages::DeleteAllL()
       
  2096     {
       
  2097     LOGSTRING("Creator: CCreatorMessages::DeleteAllL");
       
  2098     DeleteAllMessagesL( EFalse );
       
  2099     }
       
  2100 
       
  2101 //----------------------------------------------------------------------------
       
  2102 void CCreatorMessages::DeleteAllMessagesL( TBool aOnlyCreatedWithCreator )
       
  2103     {
       
  2104     LOGSTRING("Creator: CCreatorMessages::DeleteAllMessagesL");
       
  2105     TInt err( KErrNone );
       
  2106     
       
  2107     // init    
       
  2108     if( iSession == 0 )
       
  2109         {
       
  2110         iSession = CMsvSession::OpenSyncL(*this);
       
  2111         }
       
  2112     
       
  2113     CClientMtmRegistry* registry = CClientMtmRegistry::NewL(*iSession);
       
  2114     CleanupStack::PushL( registry );
       
  2115 
       
  2116     // get the client mtm and return if it isn't supported in the system        
       
  2117     CSmsClientMtm* clientMtm( NULL );
       
  2118     TRAP( err, clientMtm = static_cast<CSmsClientMtm*>( registry->NewMtmL( KUidMsgTypeSMS ) ) );
       
  2119     if ( err || !clientMtm )
       
  2120         {
       
  2121         CAknErrorNote* note = new (ELeave) CAknErrorNote();
       
  2122         note->ExecuteLD( _L( "SMS: Message type module not found" ) );
       
  2123         CleanupStack::PopAndDestroy( 2 );
       
  2124         User::Leave( KErrNotFound );
       
  2125         }
       
  2126     CleanupStack::PushL( clientMtm );
       
  2127     
       
  2128     TRAP_IGNORE( DeleteAllFromFolderL( KMsvGlobalInBoxIndexEntryId, iSession, clientMtm, aOnlyCreatedWithCreator ) );
       
  2129     TRAP_IGNORE( DeleteAllFromFolderL( KMsvDraftEntryId, iSession, clientMtm, aOnlyCreatedWithCreator ) );
       
  2130     TRAP_IGNORE( DeleteAllFromFolderL( KMsvGlobalOutBoxIndexEntryId, iSession, clientMtm, aOnlyCreatedWithCreator ) );
       
  2131     TRAP_IGNORE( DeleteAllFromFolderL( KMsvSentEntryId, iSession, clientMtm, aOnlyCreatedWithCreator ) );
       
  2132     
       
  2133     // reset must be done here, because iEntryIds is stored in destructor
       
  2134     iEntryIds.Reset();
       
  2135     
       
  2136     // all entries deleted, remove the Messages related registry
       
  2137     iEngine->RemoveStoreL( KUidDictionaryUidMessages );
       
  2138 
       
  2139     CleanupStack::PopAndDestroy( clientMtm );
       
  2140     CleanupStack::PopAndDestroy( registry );    
       
  2141     }
       
  2142 
       
  2143 //----------------------------------------------------------------------------
       
  2144 void CCreatorMessages::DeleteAllFromFolderL( const TMsvId aContext, 
       
  2145                                              CMsvSession* aSession,
       
  2146                                              CSmsClientMtm* aClientMtm,
       
  2147                                              TBool aOnlyCreatedWithCreator )
       
  2148     {
       
  2149     LOGSTRING("Creator: CCreatorMessages::DeleteAllFromFolderL");
       
  2150     
       
  2151     TMsvSelectionOrdering sort;
       
  2152     sort.SetShowInvisibleEntries( ETrue );
       
  2153 
       
  2154     CMsvEntry* inboxContext = CMsvEntry::NewL( *aSession, aContext, sort );
       
  2155     CleanupStack::PushL( inboxContext );
       
  2156 
       
  2157     CMsvEntrySelection* entries = inboxContext->ChildrenL();
       
  2158     CleanupStack::PushL( entries );
       
  2159 
       
  2160     TInt msgCount = entries->Count();
       
  2161     for ( TInt i = 0; i < entries->Count(); i++)
       
  2162         {
       
  2163         TMsvId entryID = entries->At(i);
       
  2164         aClientMtm->SwitchCurrentEntryL( entryID );
       
  2165 
       
  2166         if ( !aOnlyCreatedWithCreator || iEntryIds.Find( entryID ) != KErrNotFound )
       
  2167             {
       
  2168             CMsvEntry* entry = aSession->GetEntryL( (*entries)[i] );
       
  2169             CleanupStack::PushL( entry );
       
  2170 
       
  2171             entry->DeleteL( entries->At(i) );
       
  2172             CleanupStack::PopAndDestroy( entry );            
       
  2173             }
       
  2174         }
       
  2175     
       
  2176     CleanupStack::PopAndDestroy( entries );
       
  2177     CleanupStack::PopAndDestroy( inboxContext );
       
  2178     }
       
  2179 
       
  2180 //----------------------------------------------------------------------------
       
  2181 void CCreatorMessages::DeleteAllCreatedByCreatorL()
       
  2182     {
       
  2183     LOGSTRING("Creator: CCreatorMessages::DeleteAllCreatedByCreatorL");
       
  2184     
       
  2185     iEntryIds.Reset();
       
  2186     
       
  2187     // fetch ids of entries created by Creator
       
  2188     iEngine->ReadEntryIdsFromStoreL( iEntryIds, KUidDictionaryUidMessages );
       
  2189     
       
  2190     // delete them
       
  2191     DeleteAllMessagesL( ETrue );
       
  2192     }
       
  2193 
       
  2194 CRecipientInfo::CRecipientInfo() 
       
  2195     {
       
  2196     
       
  2197     }
       
  2198 
       
  2199 CRecipientInfo::~CRecipientInfo()
       
  2200     {
       
  2201     delete iPhoneNumber;
       
  2202     delete iEmailAddress;
       
  2203     }
       
  2204 
       
  2205 void CRecipientInfo::SetPhoneNumber(HBufC* aPhone)
       
  2206     {
       
  2207     delete iPhoneNumber;    
       
  2208     iPhoneNumber = aPhone;    
       
  2209     }
       
  2210 
       
  2211 void CRecipientInfo::SetEmailAddress(HBufC* aEmail)
       
  2212     {
       
  2213     delete iEmailAddress;    
       
  2214     iEmailAddress = aEmail;    
       
  2215     }
       
  2216 
       
  2217 const HBufC* CRecipientInfo::PhoneNumber() const
       
  2218     {
       
  2219     return iPhoneNumber;
       
  2220     }
       
  2221 
       
  2222 const HBufC* CRecipientInfo::EmailAddress() const
       
  2223     {
       
  2224     return iEmailAddress;
       
  2225     }