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