messagingapp/msgappfw/plugins/msgplugin/src/ccsmsghandler.cpp
author hgs
Fri, 06 Aug 2010 23:19:50 +0530
changeset 51 3507212d340e
parent 41 25fe1fe642e3
permissions -rw-r--r--
201031_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  CS Message Handler, This class caches the conversation server
hgs
parents:
diff changeset
    15
 *                with the message data and also sends run-time updates to the
hgs
parents:
diff changeset
    16
 *                server with the message data
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// USER INCLUDES
hgs
parents:
diff changeset
    22
#include "ccsmsghandler.h"
hgs
parents:
diff changeset
    23
#include "msgbiouids.h"
hgs
parents:
diff changeset
    24
#include "ccsdefs.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
// SYSTEM INCLUDES
hgs
parents:
diff changeset
    27
#include <smsclnt.h>                   
hgs
parents:
diff changeset
    28
#include <mmsclient.h>
hgs
parents:
diff changeset
    29
#include <mtclreg.h>
hgs
parents:
diff changeset
    30
#include <csmsemailfields.h>
hgs
parents:
diff changeset
    31
#include <txtrich.h>
hgs
parents:
diff changeset
    32
#include <msvids.h>
hgs
parents:
diff changeset
    33
#include <e32const.h>
hgs
parents:
diff changeset
    34
#include <SendUiConsts.h>
hgs
parents:
diff changeset
    35
#include <pushentry.h> // For services messages
hgs
parents:
diff changeset
    36
#include <e32cmn.h>
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
//CONSTANTS
hgs
parents:
diff changeset
    40
const TInt KMessageArrayGranularity = 50;
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
// NOTE:- DRAFT ENTRIES ARE NOT HANDLED IN THE PLUGIN
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// ============================== MEMBER FUNCTIONS ============================
hgs
parents:
diff changeset
    45
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
// CCsMsgHandler::NewL
hgs
parents:
diff changeset
    47
// Two Phase Construction
hgs
parents:
diff changeset
    48
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
    49
//
hgs
parents:
diff changeset
    50
CCsMsgHandler* CCsMsgHandler::NewL(MCsMsgObserver *aMsgObserver)
hgs
parents:
diff changeset
    51
    {
hgs
parents:
diff changeset
    52
    PRINT ( _L("Enter CCsMsgHandler::NewL") );
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
    CCsMsgHandler* self = new ( ELeave ) CCsMsgHandler();
hgs
parents:
diff changeset
    55
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    56
    self->ConstructL(aMsgObserver);
hgs
parents:
diff changeset
    57
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
    PRINT ( _L("End CCsMsgHandler::NewL") );
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
    return self;
hgs
parents:
diff changeset
    62
    }
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
// CCsMsgHandler::~CCsMsgHandler
hgs
parents:
diff changeset
    66
// Destructor
hgs
parents:
diff changeset
    67
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
    68
//
hgs
parents:
diff changeset
    69
CCsMsgHandler::~CCsMsgHandler()
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    PRINT ( _L("Enter CCsMsgHandler::~CCsMsgHandler") );
hgs
parents:
diff changeset
    72
    if(iIdle)
hgs
parents:
diff changeset
    73
        {
hgs
parents:
diff changeset
    74
        iIdle->Cancel();
hgs
parents:
diff changeset
    75
        delete iIdle;
hgs
parents:
diff changeset
    76
        iIdle=NULL;
hgs
parents:
diff changeset
    77
        }
hgs
parents:
diff changeset
    78
    if(iMsgPluginUtility)
hgs
parents:
diff changeset
    79
        {
hgs
parents:
diff changeset
    80
        delete iMsgPluginUtility;
hgs
parents:
diff changeset
    81
        iMsgPluginUtility = NULL;
hgs
parents:
diff changeset
    82
        }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    if(iConverstationEntryList)
hgs
parents:
diff changeset
    85
        {
hgs
parents:
diff changeset
    86
        iConverstationEntryList->ResetAndDestroy();
hgs
parents:
diff changeset
    87
        iConverstationEntryList->Close();
hgs
parents:
diff changeset
    88
        delete iConverstationEntryList;
hgs
parents:
diff changeset
    89
        iConverstationEntryList = NULL;
hgs
parents:
diff changeset
    90
        }
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    if(iSmsMtm)
hgs
parents:
diff changeset
    93
        {
hgs
parents:
diff changeset
    94
        delete iSmsMtm;
hgs
parents:
diff changeset
    95
        iSmsMtm = NULL;
hgs
parents:
diff changeset
    96
        }
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    if(iMmsMtm)
hgs
parents:
diff changeset
    99
        {
hgs
parents:
diff changeset
   100
        delete iMmsMtm;
hgs
parents:
diff changeset
   101
        iMmsMtm = NULL;
hgs
parents:
diff changeset
   102
        }
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    if(iMtmRegistry)
hgs
parents:
diff changeset
   105
        {
hgs
parents:
diff changeset
   106
        delete iMtmRegistry;
hgs
parents:
diff changeset
   107
        iMtmRegistry = NULL;
hgs
parents:
diff changeset
   108
        }
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
    if(iSession)
hgs
parents:
diff changeset
   111
        {
hgs
parents:
diff changeset
   112
        delete iSession;
hgs
parents:
diff changeset
   113
        iSession = NULL;
hgs
parents:
diff changeset
   114
        }
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    if(iMessageArray)
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
        iMessageArray->Reset();
hgs
parents:
diff changeset
   119
        iMessageArray->Close();
hgs
parents:
diff changeset
   120
        delete iMessageArray;
hgs
parents:
diff changeset
   121
        iMessageArray = NULL;
hgs
parents:
diff changeset
   122
    }
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    PRINT ( _L("End CCsMsgHandler::~CCsMsgHandler") );
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   128
// CCsMsgHandler::ConstructL
hgs
parents:
diff changeset
   129
// Two Phase Construction
hgs
parents:
diff changeset
   130
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   131
//
hgs
parents:
diff changeset
   132
void CCsMsgHandler::ConstructL(MCsMsgObserver *aMsgObserver)
hgs
parents:
diff changeset
   133
    {
hgs
parents:
diff changeset
   134
    PRINT ( _L("Enter CCsMsgHandler::ConstructL") );
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    iMsgObserver = aMsgObserver;
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
    iSession = CMsvSession::OpenSyncL(*this);
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    iMsgPluginUtility = CCsMsgPluginUtility::NewL();
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
    iConverstationEntryList = new(ELeave) RPointerArray<CCsConversationEntry>(1);
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
    iMtmRegistry = CClientMtmRegistry::NewL( *iSession );
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    iSmsMtm = static_cast<CSmsClientMtm*>( iMtmRegistry->
hgs
parents:
diff changeset
   147
            NewMtmL( KSenduiMtmSmsUid ) );
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
    iMmsMtm = static_cast<CMmsClientMtm*>( iMtmRegistry->
hgs
parents:
diff changeset
   150
            NewMtmL( KSenduiMtmMmsUid ) );
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
    iState = EReadInbox;
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
    iMessageArray = new (ELeave)RArray <TMsvId>(KMessageArrayGranularity);
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
    PRINT ( _L("End CCsMsgHandler::ConstructL") );
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
// CCsMsgHandler::CCsMsgHandler
hgs
parents:
diff changeset
   161
// Two Phase Construction
hgs
parents:
diff changeset
   162
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   163
//
hgs
parents:
diff changeset
   164
CCsMsgHandler::CCsMsgHandler()
hgs
parents:
diff changeset
   165
    {
hgs
parents:
diff changeset
   166
    }
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   169
// CCsMsgHandler::ProcessResultsL()
hgs
parents:
diff changeset
   170
// ProcessResultsL fetches results for the searchsort query and
hgs
parents:
diff changeset
   171
// updates the CCsServer with the fetched data
hgs
parents:
diff changeset
   172
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   173
//
hgs
parents:
diff changeset
   174
void CCsMsgHandler::ProcessResultsL(TMsvEntry entry)
hgs
parents:
diff changeset
   175
    {
hgs
parents:
diff changeset
   176
    PRINT ( _L("Enter CCsMsgHandler::ProcessResultsL"));
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    // Cleanup the conversationEntry List initially.
hgs
parents:
diff changeset
   179
    // So that the previous entries not cleaned up in
hgs
parents:
diff changeset
   180
    // the event of Leave have been clean up.
hgs
parents:
diff changeset
   181
    iConverstationEntryList->ResetAndDestroy();
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
    RPointerArray<HBufC> addressList;
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
    // Ignore hidden items during upload
hgs
parents:
diff changeset
   186
    if ( entry.Visible() == EFalse )
hgs
parents:
diff changeset
   187
        {
hgs
parents:
diff changeset
   188
        return;
hgs
parents:
diff changeset
   189
        }
hgs
parents:
diff changeset
   190
    
hgs
parents:
diff changeset
   191
    if ( entry.Parent() == KMsvGlobalInBoxIndexEntryIdValue ||
hgs
parents:
diff changeset
   192
         entry.Parent() == KMsvSentEntryIdValue ||
hgs
parents:
diff changeset
   193
         entry.Parent() == KMsvGlobalOutBoxIndexEntryIdValue )
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        CleanupResetAndDestroyPushL(addressList);
hgs
parents:
diff changeset
   196
        
hgs
parents:
diff changeset
   197
        iMsgPluginUtility->CreateContactL(iSession, entry, addressList);
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
        //process entry
hgs
parents:
diff changeset
   200
        ExtractAddressesL(entry, ERead, addressList);
hgs
parents:
diff changeset
   201
        
hgs
parents:
diff changeset
   202
        // Cleanup addressList
hgs
parents:
diff changeset
   203
        CleanupStack::PopAndDestroy(&addressList);
hgs
parents:
diff changeset
   204
        }
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    PRINT ( _L("Exit CCsMsgHandler::ProcessResultsL") );
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   210
// CCsMsgHandler::HandleSessionEventL
hgs
parents:
diff changeset
   211
// Implemented for MMsvSessionObserver
hgs
parents:
diff changeset
   212
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   213
//
hgs
parents:
diff changeset
   214
void CCsMsgHandler::HandleSessionEventL( TMsvSessionEvent aEvent,
hgs
parents:
diff changeset
   215
        TAny* aArg1,
hgs
parents:
diff changeset
   216
        TAny* aArg2,
hgs
parents:
diff changeset
   217
        TAny* /*aArg3*/)
hgs
parents:
diff changeset
   218
    {
hgs
parents:
diff changeset
   219
    PRINT1 ( _L("Enter CCsMsgHandler::HandleSessionEventL aEvent=%d"),aEvent );
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    CMsvEntrySelection* selection=NULL;
hgs
parents:
diff changeset
   222
    TMsvId parent;
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
    //args
hgs
parents:
diff changeset
   225
    if(aArg1 == NULL || aArg2 == NULL)
hgs
parents:
diff changeset
   226
        {
hgs
parents:
diff changeset
   227
        PRINT ( _L("Enter CCsMsgHandler::HandleSessionEventL arguments invalid"));
hgs
parents:
diff changeset
   228
        return;
hgs
parents:
diff changeset
   229
        }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
    //start, processing the event
hgs
parents:
diff changeset
   232
    selection= (CMsvEntrySelection*)aArg1;
hgs
parents:
diff changeset
   233
    parent = *(TMsvId*)aArg2;
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
    // Cleanup the conversationEntry List initially.
hgs
parents:
diff changeset
   236
    iConverstationEntryList->ResetAndDestroy();
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
    switch( aEvent )
hgs
parents:
diff changeset
   239
        {
hgs
parents:
diff changeset
   240
        case EMsvEntriesChanged:
hgs
parents:
diff changeset
   241
        case EMsvEntriesMoved:
hgs
parents:
diff changeset
   242
            {
hgs
parents:
diff changeset
   243
            HandleEventL(selection,parent);
hgs
parents:
diff changeset
   244
            }
hgs
parents:
diff changeset
   245
            break;
hgs
parents:
diff changeset
   246
            
hgs
parents:
diff changeset
   247
        case EMsvEntriesDeleted:
hgs
parents:
diff changeset
   248
            {
hgs
parents:
diff changeset
   249
            if ( parent == KMsvGlobalInBoxIndexEntryIdValue || 
hgs
parents:
diff changeset
   250
                 parent == KMsvSentEntryIdValue ||
hgs
parents:
diff changeset
   251
                 parent == KMsvGlobalOutBoxIndexEntryIdValue)
hgs
parents:
diff changeset
   252
                {
hgs
parents:
diff changeset
   253
                for( TInt i=0 ; i < selection->Count() ; i++ )
hgs
parents:
diff changeset
   254
                    {
hgs
parents:
diff changeset
   255
                    TMsvId id = selection->At( i );
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
                    //use utility to create conversation entry
hgs
parents:
diff changeset
   258
                    CCsConversationEntry *conversationEntry = 
hgs
parents:
diff changeset
   259
                    iMsgPluginUtility->CreateConversationEntryL(
hgs
parents:
diff changeset
   260
                            NULL,
hgs
parents:
diff changeset
   261
                            id,
hgs
parents:
diff changeset
   262
                            0,
hgs
parents:
diff changeset
   263
                            parent,
hgs
parents:
diff changeset
   264
                            NULL,
hgs
parents:
diff changeset
   265
                            ECsSendStateUnknown,
hgs
parents:
diff changeset
   266
                            ECsAttributeNone,
hgs
parents:
diff changeset
   267
                            0);
hgs
parents:
diff changeset
   268
                    CleanupStack::PushL(conversationEntry);
hgs
parents:
diff changeset
   269
                    iConverstationEntryList->AppendL( conversationEntry );
hgs
parents:
diff changeset
   270
                    CleanupStack::Pop(conversationEntry);
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
                    // call observer interface for each entry
hgs
parents:
diff changeset
   273
                    iMsgObserver->HandleDeleteCompleteL(iConverstationEntryList);
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
                    //cleanup before next iteration
hgs
parents:
diff changeset
   276
                    iConverstationEntryList->ResetAndDestroy();
hgs
parents:
diff changeset
   277
                    }
hgs
parents:
diff changeset
   278
                }
hgs
parents:
diff changeset
   279
            }
hgs
parents:
diff changeset
   280
            break;
hgs
parents:
diff changeset
   281
            
hgs
parents:
diff changeset
   282
        case EMsvMediaChanged:
hgs
parents:
diff changeset
   283
            iMsgObserver->HandleRefreshCompleteL();
hgs
parents:
diff changeset
   284
            break;
hgs
parents:
diff changeset
   285
        }
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
    // Cleanup the conversationEntry List before function exits.
hgs
parents:
diff changeset
   288
    iConverstationEntryList->ResetAndDestroy();
hgs
parents:
diff changeset
   289
    PRINT ( _L("Exit CCsMsgHandler::HandleSessionEventL") );
hgs
parents:
diff changeset
   290
    }
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
// ---------------------------------------------------------------------
hgs
parents:
diff changeset
   293
// CCsMsgHandler::HandleEvent
hgs
parents:
diff changeset
   294
// Handle events
hgs
parents:
diff changeset
   295
// ---------------------------------------------------------------------
hgs
parents:
diff changeset
   296
//
hgs
parents:
diff changeset
   297
void CCsMsgHandler::HandleEventL(CMsvEntrySelection* aSelection, TMsvId aParent)
hgs
parents:
diff changeset
   298
    {
hgs
parents:
diff changeset
   299
    PRINT ( _L("Enter CCsMsgHandler::HandleEvent") );
hgs
parents:
diff changeset
   300
    TMsvEntry entry;
hgs
parents:
diff changeset
   301
    TMsvId service;
hgs
parents:
diff changeset
   302
    TInt error= KErrNone;
hgs
parents:
diff changeset
   303
    RPointerArray<HBufC> addressList;
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
    for( TInt i=0 ; i < aSelection->Count() ; i++ )
hgs
parents:
diff changeset
   306
        {
hgs
parents:
diff changeset
   307
        error = iSession->GetEntry(aSelection->At(i),service,entry);
hgs
parents:
diff changeset
   308
        
51
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   309
        if (aParent == KMsvGlobalInBoxIndexEntryIdValue && KSenduiMtmSmsUidValue == entry.iMtm.iUid) 
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   310
						{
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   311
            iSmsMtm->SwitchCurrentEntryL(entry.Id());
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   312
            iSmsMtm->LoadMessageL();
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   313
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   314
            CSmsHeader& header = static_cast<CSmsClientMtm*> (iSmsMtm)->SmsHeader();
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   315
            CSmsPDU& pdu = header.Message().SmsPDU();
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   316
            TSmsDataCodingScheme::TSmsClass smsClass;
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   317
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   318
            if (pdu.Class(smsClass) && smsClass == TSmsDataCodingScheme::ESmsClass0
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   319
                && entry.ReadOnly()) 
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   320
							{
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   321
                iSmsMtm->SwitchCurrentEntryL(entry.iServiceId);
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   322
                // for class 0 sms dont create conversation entry.. 
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   323
                continue;
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   324
            	}
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   325
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   326
        	 }
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   327
        if (entry.Visible() == EFalse) 
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   328
						{
37
hgs
parents:
diff changeset
   329
            // Do a delete if entry becomes invisible.
hgs
parents:
diff changeset
   330
            // e.g) My Nokia registration messages.
hgs
parents:
diff changeset
   331
            RPointerArray<CCsConversationEntry>* hiddenEntries =  
hgs
parents:
diff changeset
   332
                    new (ELeave) RPointerArray<CCsConversationEntry>();
hgs
parents:
diff changeset
   333
            
hgs
parents:
diff changeset
   334
            CCsConversationEntry *conversationEntry = 
hgs
parents:
diff changeset
   335
                    iMsgPluginUtility->CreateConversationEntryL ( 
hgs
parents:
diff changeset
   336
                            NULL,
hgs
parents:
diff changeset
   337
                            entry.Id(),
hgs
parents:
diff changeset
   338
                            0,
hgs
parents:
diff changeset
   339
                            aParent,
hgs
parents:
diff changeset
   340
                            NULL,
hgs
parents:
diff changeset
   341
                            ECsSendStateUnknown,
hgs
parents:
diff changeset
   342
                            ECsAttributeNone,
hgs
parents:
diff changeset
   343
                            0 );  
hgs
parents:
diff changeset
   344
            CleanupStack::PushL(conversationEntry);
hgs
parents:
diff changeset
   345
            hiddenEntries->AppendL( conversationEntry );
hgs
parents:
diff changeset
   346
            CleanupStack::Pop(conversationEntry);
hgs
parents:
diff changeset
   347
            
hgs
parents:
diff changeset
   348
            // Delete at server
hgs
parents:
diff changeset
   349
            iMsgObserver->HandleDeleteCompleteL(hiddenEntries);
hgs
parents:
diff changeset
   350
            hiddenEntries->ResetAndDestroy();
hgs
parents:
diff changeset
   351
            hiddenEntries->Close();
hgs
parents:
diff changeset
   352
            delete hiddenEntries;
hgs
parents:
diff changeset
   353
            
hgs
parents:
diff changeset
   354
            break;
hgs
parents:
diff changeset
   355
            }
hgs
parents:
diff changeset
   356
        
hgs
parents:
diff changeset
   357
        if ( (KErrNone == error) && (IsMtmSupported(entry.iMtm.iUid) ) )
hgs
parents:
diff changeset
   358
            {
hgs
parents:
diff changeset
   359
            // sent/inbox/Outbox entry
hgs
parents:
diff changeset
   360
            if ( aParent == KMsvSentEntryIdValue ||
hgs
parents:
diff changeset
   361
                 aParent == KMsvGlobalInBoxIndexEntryIdValue )
hgs
parents:
diff changeset
   362
                {
hgs
parents:
diff changeset
   363
                CleanupResetAndDestroyPushL(addressList);
hgs
parents:
diff changeset
   364
                // currently server needs number, so getting it from header
hgs
parents:
diff changeset
   365
                iMsgPluginUtility->CreateContactL(iSession, entry,
hgs
parents:
diff changeset
   366
                        addressList);
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
                //process entry
hgs
parents:
diff changeset
   369
                // entry created in sent already exists, hence an update
hgs
parents:
diff changeset
   370
                ExtractAddressesL(entry, EUpdate, addressList);
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
                CleanupStack::PopAndDestroy(&addressList);
hgs
parents:
diff changeset
   373
                }  
hgs
parents:
diff changeset
   374
                
hgs
parents:
diff changeset
   375
            //for drafts and outbox, the entry changes multiple times,
hgs
parents:
diff changeset
   376
            // so making a check if entry has changed
hgs
parents:
diff changeset
   377
            else if(aParent == KMsvGlobalOutBoxIndexEntryIdValue)
hgs
parents:
diff changeset
   378
                {
hgs
parents:
diff changeset
   379
                //outbox
hgs
parents:
diff changeset
   380
                if(!(iMsgPluginUtility->CompareEntry(iPrevEntry,entry,aParent)))
hgs
parents:
diff changeset
   381
                    {
hgs
parents:
diff changeset
   382
                    TUint sendState = entry.SendingState();
hgs
parents:
diff changeset
   383
                    
hgs
parents:
diff changeset
   384
                    // if the entry state is sent, we dont need to process it
hgs
parents:
diff changeset
   385
                    // as it is going to appear in sent items
hgs
parents:
diff changeset
   386
                    if( ECsSendStateSent != iMsgPluginUtility->GetSendState(entry) )
hgs
parents:
diff changeset
   387
                        {
hgs
parents:
diff changeset
   388
                         CleanupResetAndDestroyPushL(addressList);
hgs
parents:
diff changeset
   389
                        // currently server needs number, so getting it from header
hgs
parents:
diff changeset
   390
                        iMsgPluginUtility->CreateContactL(iSession, entry,
hgs
parents:
diff changeset
   391
                                addressList);
hgs
parents:
diff changeset
   392
                        
hgs
parents:
diff changeset
   393
                        //process entry
hgs
parents:
diff changeset
   394
                        // entry created in sent already exists, hence an update
hgs
parents:
diff changeset
   395
                        ExtractAddressesL(entry, EUpdate, addressList);
hgs
parents:
diff changeset
   396
                        
hgs
parents:
diff changeset
   397
                        iPrevEntry = entry;
hgs
parents:
diff changeset
   398
                        
hgs
parents:
diff changeset
   399
                        CleanupStack::PopAndDestroy(&addressList);
hgs
parents:
diff changeset
   400
                        }
hgs
parents:
diff changeset
   401
                    }//end check changed entry
hgs
parents:
diff changeset
   402
                }
hgs
parents:
diff changeset
   403
            }
hgs
parents:
diff changeset
   404
        }//end for loop
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
    PRINT ( _L("Exit CCsMsgHandler::HandleEvent") );
hgs
parents:
diff changeset
   407
    }
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   410
// CCsMsgHandler::CreateAndAddEntryL
hgs
parents:
diff changeset
   411
// Creates CCsConversationEntry and adds to the list
hgs
parents:
diff changeset
   412
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   413
//
hgs
parents:
diff changeset
   414
void CCsMsgHandler::CreateAndAddEntryL(const TDesC& aContact, 
hgs
parents:
diff changeset
   415
        const TDesC& aDescription, 
hgs
parents:
diff changeset
   416
        const TMsvEntry& aEntry)
hgs
parents:
diff changeset
   417
    {
hgs
parents:
diff changeset
   418
    PRINT ( _L("Enter CCsMsgHandler::CreateAndAddEntryL") );
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
    HBufC* contact = NULL;
hgs
parents:
diff changeset
   421
    HBufC* sDescription = NULL;
hgs
parents:
diff changeset
   422
hgs
parents:
diff changeset
   423
    if (aContact.Length()>0)
hgs
parents:
diff changeset
   424
        {
hgs
parents:
diff changeset
   425
        contact = aContact.AllocLC();
hgs
parents:
diff changeset
   426
        }
hgs
parents:
diff changeset
   427
    if (aDescription.Length()>0)
hgs
parents:
diff changeset
   428
        {
hgs
parents:
diff changeset
   429
        sDescription = aDescription.AllocLC();
hgs
parents:
diff changeset
   430
        }
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
    //use utility to create conversation entry
hgs
parents:
diff changeset
   433
    CCsConversationEntry *conversationEntry = iMsgPluginUtility->CreateConversationEntryL(
hgs
parents:
diff changeset
   434
            contact,
hgs
parents:
diff changeset
   435
            aEntry.Id(),
hgs
parents:
diff changeset
   436
            aEntry.iDate.Int64(),
hgs
parents:
diff changeset
   437
            aEntry.Parent(),
hgs
parents:
diff changeset
   438
            sDescription,
hgs
parents:
diff changeset
   439
            iMsgPluginUtility->GetSendState(aEntry),
hgs
parents:
diff changeset
   440
            iMsgPluginUtility->GetMsgAttributes(aEntry),
hgs
parents:
diff changeset
   441
            ExtractCsType(aEntry));
hgs
parents:
diff changeset
   442
    CleanupStack::PushL(conversationEntry);
hgs
parents:
diff changeset
   443
hgs
parents:
diff changeset
   444
    //add to the list
hgs
parents:
diff changeset
   445
    iConverstationEntryList->AppendL( conversationEntry );
hgs
parents:
diff changeset
   446
    CleanupStack::Pop(conversationEntry);
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
    // cleanup
hgs
parents:
diff changeset
   449
    if (sDescription)
hgs
parents:
diff changeset
   450
        {
hgs
parents:
diff changeset
   451
        CleanupStack::PopAndDestroy(sDescription);
hgs
parents:
diff changeset
   452
        }
hgs
parents:
diff changeset
   453
    if (contact)
hgs
parents:
diff changeset
   454
        {
hgs
parents:
diff changeset
   455
        CleanupStack::PopAndDestroy(contact);
hgs
parents:
diff changeset
   456
        }
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
    PRINT ( _L("Exit CCsMsgHandler::CreateAndAddEntryL") );
hgs
parents:
diff changeset
   459
    }
hgs
parents:
diff changeset
   460
hgs
parents:
diff changeset
   461
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   462
// CCsMsgHandler::ProcessEntryL
hgs
parents:
diff changeset
   463
// Creates CCsConversationEntry and adds to the list
hgs
parents:
diff changeset
   464
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   465
//
hgs
parents:
diff changeset
   466
void CCsMsgHandler::ProcessEntryL( TEventType aEvent, const TDesC& aContact, 
hgs
parents:
diff changeset
   467
        const TDesC& aDescription, const TMsvEntry& aEntry)
hgs
parents:
diff changeset
   468
    {
hgs
parents:
diff changeset
   469
    PRINT ( _L("Enter CCsMsgHandler::ProcessEntryL") );
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
    // create and add entry to the list
hgs
parents:
diff changeset
   472
    CreateAndAddEntryL(aContact,aDescription,aEntry);
hgs
parents:
diff changeset
   473
hgs
parents:
diff changeset
   474
    // call cs observer interface for each entry
hgs
parents:
diff changeset
   475
    switch(aEvent)
hgs
parents:
diff changeset
   476
        {
hgs
parents:
diff changeset
   477
        case ERead:
hgs
parents:
diff changeset
   478
            {
hgs
parents:
diff changeset
   479
            iMsgObserver->HandleReadCompleteL(iConverstationEntryList);
hgs
parents:
diff changeset
   480
            }
hgs
parents:
diff changeset
   481
            break;
hgs
parents:
diff changeset
   482
        case EUpdate:
hgs
parents:
diff changeset
   483
            {
hgs
parents:
diff changeset
   484
            iMsgObserver->HandleUpdateCompleteL(iConverstationEntryList);
hgs
parents:
diff changeset
   485
            }
hgs
parents:
diff changeset
   486
            break;
hgs
parents:
diff changeset
   487
        }
hgs
parents:
diff changeset
   488
hgs
parents:
diff changeset
   489
    // Cleanup the conversationEntry List, as we are just sending one entry at a time
hgs
parents:
diff changeset
   490
    iConverstationEntryList->ResetAndDestroy();
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
    PRINT ( _L("Exit CCsMsgHandler::ProcessEntryL") );
hgs
parents:
diff changeset
   493
    }
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   496
// CCsMsgHandler::ExtractAddressL
hgs
parents:
diff changeset
   497
// Extracts the addresses in the to field and updates them to server
hgs
parents:
diff changeset
   498
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   499
//
hgs
parents:
diff changeset
   500
void CCsMsgHandler::ExtractAddressesL( 
hgs
parents:
diff changeset
   501
        TMsvEntry aEntry, 
hgs
parents:
diff changeset
   502
        TEventType aEvent, 
hgs
parents:
diff changeset
   503
        RPointerArray<HBufC>& addressList )
hgs
parents:
diff changeset
   504
    {
hgs
parents:
diff changeset
   505
    PRINT ( _L("Enter CCsMsgHandler::ExtractAddressesL") );
hgs
parents:
diff changeset
   506
hgs
parents:
diff changeset
   507
    // For SMS read the whole body.
hgs
parents:
diff changeset
   508
    // For bio type SMS read the iDescription
hgs
parents:
diff changeset
   509
    // For other message types read the iDescription
hgs
parents:
diff changeset
   510
    // Note: After the LoadMessageL() the iDescription is getting 
hgs
parents:
diff changeset
   511
    // deleted so need to make a copy before that.
hgs
parents:
diff changeset
   512
    TPtrC description;
hgs
parents:
diff changeset
   513
    HBufC* tmpBuffer = NULL;
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
    if ( (aEntry.iBioType && 
hgs
parents:
diff changeset
   516
	      aEntry.iBioType != KUidMsgSubTypeMmsAudioMsg.iUid ) || 
hgs
parents:
diff changeset
   517
		  aEntry.iMtm == KSenduiMtmBtUid ) 
hgs
parents:
diff changeset
   518
        {
hgs
parents:
diff changeset
   519
        tmpBuffer = aEntry.iDescription.AllocLC();
hgs
parents:
diff changeset
   520
        description.Set( tmpBuffer->Des() );         
hgs
parents:
diff changeset
   521
        }    
hgs
parents:
diff changeset
   522
    else if ( aEntry.iMtm == KSenduiMtmSmsUid )  
hgs
parents:
diff changeset
   523
        {
hgs
parents:
diff changeset
   524
        iSmsMtm->SwitchCurrentEntryL( aEntry.Id() );
hgs
parents:
diff changeset
   525
        iSmsMtm->LoadMessageL();
hgs
parents:
diff changeset
   526
            
hgs
parents:
diff changeset
   527
        CRichText& body = iSmsMtm->Body();
hgs
parents:
diff changeset
   528
        TInt smsLength = body.DocumentLength();      
hgs
parents:
diff changeset
   529
        tmpBuffer = HBufC::NewLC(smsLength);
hgs
parents:
diff changeset
   530
        TPtr ptr(tmpBuffer->Des());
hgs
parents:
diff changeset
   531
        body.Extract(ptr, 0);
hgs
parents:
diff changeset
   532
        description.Set( tmpBuffer->Des() );  
hgs
parents:
diff changeset
   533
        }
hgs
parents:
diff changeset
   534
    else if ( aEntry.iMtm == KSenduiMtmMmsUid  || 
hgs
parents:
diff changeset
   535
	          aEntry.iMtm == KSenduiMMSNotificationUid)  
hgs
parents:
diff changeset
   536
        {
hgs
parents:
diff changeset
   537
        tmpBuffer = aEntry.iDescription.AllocLC();
hgs
parents:
diff changeset
   538
        description.Set( tmpBuffer->Des() );         
hgs
parents:
diff changeset
   539
hgs
parents:
diff changeset
   540
        iMmsMtm->SwitchCurrentEntryL( aEntry.Id() );
hgs
parents:
diff changeset
   541
        iMmsMtm->LoadMessageL();
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
        // Handle addresses
hgs
parents:
diff changeset
   544
        if ( aEntry.Parent() == KMsvGlobalInBoxIndexEntryIdValue )
hgs
parents:
diff changeset
   545
            {
hgs
parents:
diff changeset
   546
            HBufC* address = iMmsMtm->Sender().AllocL();
hgs
parents:
diff changeset
   547
            addressList.Append(address);
hgs
parents:
diff changeset
   548
            }
hgs
parents:
diff changeset
   549
        else if ( aEntry.Parent() == KMsvSentEntryIdValue ||
hgs
parents:
diff changeset
   550
                  aEntry.Parent() == KMsvGlobalOutBoxIndexEntryIdValue )
hgs
parents:
diff changeset
   551
            {
hgs
parents:
diff changeset
   552
            const CMsvRecipientList& addresses = iMmsMtm->AddresseeList();
hgs
parents:
diff changeset
   553
            TInt count = addresses.Count();
hgs
parents:
diff changeset
   554
hgs
parents:
diff changeset
   555
            for( TInt i = 0; i < count; i++)
hgs
parents:
diff changeset
   556
                {
hgs
parents:
diff changeset
   557
                HBufC* address = addresses[i].AllocL();
hgs
parents:
diff changeset
   558
                TPtrC pureAddress = iMsgPluginUtility->PureAddress(*address);
hgs
parents:
diff changeset
   559
                HBufC* address1 = pureAddress.AllocL();
hgs
parents:
diff changeset
   560
                addressList.Append(address1);
hgs
parents:
diff changeset
   561
                delete address;
hgs
parents:
diff changeset
   562
                }
hgs
parents:
diff changeset
   563
            }
hgs
parents:
diff changeset
   564
        }
hgs
parents:
diff changeset
   565
    else
hgs
parents:
diff changeset
   566
        {
hgs
parents:
diff changeset
   567
        return;
hgs
parents:
diff changeset
   568
        }
hgs
parents:
diff changeset
   569
hgs
parents:
diff changeset
   570
    if ( addressList.Count() > 0 )
hgs
parents:
diff changeset
   571
        {
hgs
parents:
diff changeset
   572
        for ( int i = 0; i < addressList.Count(); i++ )
hgs
parents:
diff changeset
   573
            {
hgs
parents:
diff changeset
   574
            HBufC* address = addressList[i];
hgs
parents:
diff changeset
   575
            ProcessEntryL(aEvent, *address, description, aEntry);
hgs
parents:
diff changeset
   576
            }
hgs
parents:
diff changeset
   577
        }
hgs
parents:
diff changeset
   578
    else
hgs
parents:
diff changeset
   579
        {
hgs
parents:
diff changeset
   580
        // Unknown
hgs
parents:
diff changeset
   581
        ProcessEntryL(aEvent, KNullDesC, description, aEntry);       
hgs
parents:
diff changeset
   582
        }
hgs
parents:
diff changeset
   583
    
hgs
parents:
diff changeset
   584
    //Cleanup tmpBuffer
hgs
parents:
diff changeset
   585
    if ( tmpBuffer )
hgs
parents:
diff changeset
   586
        {
hgs
parents:
diff changeset
   587
		 CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   588
        }
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
    PRINT ( _L("Exit CCsMsgHandler::ExtractAddressesL") );
hgs
parents:
diff changeset
   591
    }
hgs
parents:
diff changeset
   592
hgs
parents:
diff changeset
   593
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   594
// CCsMsgHandler::CompareOrder()
hgs
parents:
diff changeset
   595
// Method for determining the sorting behaviour of RArray of TMsvId's  
hgs
parents:
diff changeset
   596
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   597
//
hgs
parents:
diff changeset
   598
static TInt CompareOrder(const TMsvId& aFirst, const TMsvId& aSecond)
hgs
parents:
diff changeset
   599
    {
hgs
parents:
diff changeset
   600
    return aSecond - aFirst;
hgs
parents:
diff changeset
   601
    }
hgs
parents:
diff changeset
   602
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   603
// CCsMsgHandler::UploadMsgL()
hgs
parents:
diff changeset
   604
// State machine to upload all messages 
hgs
parents:
diff changeset
   605
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   606
//
hgs
parents:
diff changeset
   607
TInt CCsMsgHandler::UploadMsgL() 
hgs
parents:
diff changeset
   608
    {
hgs
parents:
diff changeset
   609
    //Release scheduler for scheduling.    
hgs
parents:
diff changeset
   610
    User::After(1);
hgs
parents:
diff changeset
   611
    
hgs
parents:
diff changeset
   612
    switch ( iState ) 
hgs
parents:
diff changeset
   613
        {
hgs
parents:
diff changeset
   614
        case EReadInbox:
hgs
parents:
diff changeset
   615
            {
hgs
parents:
diff changeset
   616
            UpdateMessageArrayL(KMsvGlobalInBoxIndexEntryId);
hgs
parents:
diff changeset
   617
            iState = EReadSent;
hgs
parents:
diff changeset
   618
            return 1;
hgs
parents:
diff changeset
   619
            }
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
        case EReadSent:
hgs
parents:
diff changeset
   622
            {
hgs
parents:
diff changeset
   623
            UpdateMessageArrayL(KMsvSentEntryId);
hgs
parents:
diff changeset
   624
            iState = EReadOutbox;
hgs
parents:
diff changeset
   625
            return 1;
hgs
parents:
diff changeset
   626
            }
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
        case EReadOutbox:
hgs
parents:
diff changeset
   629
            {
hgs
parents:
diff changeset
   630
            UpdateMessageArrayL(KMsvGlobalOutBoxIndexEntryId);
hgs
parents:
diff changeset
   631
            iState = ESortEntries;            
hgs
parents:
diff changeset
   632
            return 1;
hgs
parents:
diff changeset
   633
            }
hgs
parents:
diff changeset
   634
        case ESortEntries:
hgs
parents:
diff changeset
   635
            {
hgs
parents:
diff changeset
   636
            //Sort the elements in the array by descending order of TMsvId's
hgs
parents:
diff changeset
   637
            TLinearOrder<TMsvId> order(CompareOrder);
hgs
parents:
diff changeset
   638
            iMessageArray->Sort(order);
hgs
parents:
diff changeset
   639
            iState = EProcessEntries;
hgs
parents:
diff changeset
   640
            return 1;
hgs
parents:
diff changeset
   641
            }            
hgs
parents:
diff changeset
   642
        case EProcessEntries:
hgs
parents:
diff changeset
   643
            { 
hgs
parents:
diff changeset
   644
            //Process one entry at a time in sequence
hgs
parents:
diff changeset
   645
            //Process the first element in the array on each call, till the end
hgs
parents:
diff changeset
   646
            if(iMessageArray->Count())
hgs
parents:
diff changeset
   647
                {
hgs
parents:
diff changeset
   648
                CMsvEntry* msvEntry= iSession->
hgs
parents:
diff changeset
   649
                        GetEntryL(iMessageArray->operator[](0));
hgs
parents:
diff changeset
   650
                CleanupStack::PushL(msvEntry);
51
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   651
            TBool isNotClass0 = ETrue;
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   652
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   653
            if (msvEntry->Entry().iMtm.iUid == KSenduiMtmSmsUidValue && msvEntry->Entry().Parent()
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   654
                == KMsvGlobalInBoxIndexEntryIdValue) 
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   655
								{
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   656
                iSmsMtm->SwitchCurrentEntryL(msvEntry->Entry().Id());
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   657
                iSmsMtm->LoadMessageL();
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   658
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   659
                CSmsHeader& header = static_cast<CSmsClientMtm*> (iSmsMtm)->SmsHeader();
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   660
                CSmsPDU& pdu = header.Message().SmsPDU();
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   661
                TSmsDataCodingScheme::TSmsClass smsClass;
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   662
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   663
                if (pdu.Class(smsClass) && smsClass == TSmsDataCodingScheme::ESmsClass0)
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   664
									{
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   665
                    isNotClass0 = EFalse;                  
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   666
                	}
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   667
            	}
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   668
            if (isNotClass0) 
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   669
							{
37
hgs
parents:
diff changeset
   670
                ProcessResultsL(msvEntry->Entry());
51
3507212d340e 201031_02
hgs
parents: 41
diff changeset
   671
            	}
37
hgs
parents:
diff changeset
   672
                CleanupStack::PopAndDestroy(msvEntry);
hgs
parents:
diff changeset
   673
                iMessageArray->Remove(0);
hgs
parents:
diff changeset
   674
                }
hgs
parents:
diff changeset
   675
            else
hgs
parents:
diff changeset
   676
                {
hgs
parents:
diff changeset
   677
                iMessageArray->Reset();
hgs
parents:
diff changeset
   678
                iMsgObserver->HandleCachingCompleted();
hgs
parents:
diff changeset
   679
                return 0; //DONE 
hgs
parents:
diff changeset
   680
                }            
hgs
parents:
diff changeset
   681
            iState = EProcessEntries;
hgs
parents:
diff changeset
   682
            return 1; 
hgs
parents:
diff changeset
   683
        }
hgs
parents:
diff changeset
   684
    }
hgs
parents:
diff changeset
   685
    return 0;    
hgs
parents:
diff changeset
   686
}
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   689
// CCsMsgHandler::UploadMsg()
hgs
parents:
diff changeset
   690
// CIdle callback 
hgs
parents:
diff changeset
   691
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   692
//
hgs
parents:
diff changeset
   693
TInt CCsMsgHandler::UploadMsg(TAny* aArg)
hgs
parents:
diff changeset
   694
    {
hgs
parents:
diff changeset
   695
    CCsMsgHandler* handler = (CCsMsgHandler*) aArg; 
hgs
parents:
diff changeset
   696
    TInt ok = 0;
hgs
parents:
diff changeset
   697
    TRAPD(err, ok = handler->UploadMsgL());
hgs
parents:
diff changeset
   698
    return ((err == KErrNone) && ok);
hgs
parents:
diff changeset
   699
    }
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   702
// CCsMsgHandler::StartL()
hgs
parents:
diff changeset
   703
// This function starts the state machine to fetch sms data from msvserver
hgs
parents:
diff changeset
   704
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   705
//
hgs
parents:
diff changeset
   706
void CCsMsgHandler::StartL()
hgs
parents:
diff changeset
   707
    {
hgs
parents:
diff changeset
   708
    PRINT ( _L("Enter CCsMsgHandler::Start") );
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
    iState = EReadInbox;
hgs
parents:
diff changeset
   711
    TCallBack callback = TCallBack(UploadMsg, (TAny*) this);
hgs
parents:
diff changeset
   712
    
hgs
parents:
diff changeset
   713
    if(iIdle)
hgs
parents:
diff changeset
   714
        {
hgs
parents:
diff changeset
   715
        delete iIdle;
hgs
parents:
diff changeset
   716
        iIdle = NULL;
hgs
parents:
diff changeset
   717
        }
hgs
parents:
diff changeset
   718
    iIdle = CIdle::NewL(CActive::EPriorityIdle);
hgs
parents:
diff changeset
   719
    iIdle->Start(callback);
hgs
parents:
diff changeset
   720
hgs
parents:
diff changeset
   721
    PRINT ( _L("End CCsMsgHandler::Start") );
hgs
parents:
diff changeset
   722
    }
hgs
parents:
diff changeset
   723
hgs
parents:
diff changeset
   724
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   725
// CCsMsgHandler::IsMtmSupported()
hgs
parents:
diff changeset
   726
// 
hgs
parents:
diff changeset
   727
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   728
//
hgs
parents:
diff changeset
   729
TBool CCsMsgHandler::IsMtmSupported(long uid)	
hgs
parents:
diff changeset
   730
    {
hgs
parents:
diff changeset
   731
    if ( KSenduiMtmSmsUidValue == uid || \
hgs
parents:
diff changeset
   732
         KSenduiMtmBtUidValue == uid || \
hgs
parents:
diff changeset
   733
         KSenduiMtmMmsUidValue == uid || \
hgs
parents:
diff changeset
   734
         KSenduiMtmBioUidValue == uid  || \
hgs
parents:
diff changeset
   735
         KSenduiMMSNotificationUidValue == uid || \
hgs
parents:
diff changeset
   736
         KUidMtmWapPush ==  TUid::Uid(uid) )
hgs
parents:
diff changeset
   737
        {
hgs
parents:
diff changeset
   738
        return ETrue;
hgs
parents:
diff changeset
   739
        }	
hgs
parents:
diff changeset
   740
    return EFalse;
hgs
parents:
diff changeset
   741
    }
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   744
// CCsMsgHandler::ExtractCsType()
hgs
parents:
diff changeset
   745
// Extracts the Message type based on the MTM Uid 
hgs
parents:
diff changeset
   746
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   747
//
hgs
parents:
diff changeset
   748
TCsType CCsMsgHandler::ExtractCsType( const TMsvEntry& aEntry)
hgs
parents:
diff changeset
   749
    {
hgs
parents:
diff changeset
   750
    TCsType type = ECsUnknown;
hgs
parents:
diff changeset
   751
    switch(aEntry.iMtm.iUid)
hgs
parents:
diff changeset
   752
        {
hgs
parents:
diff changeset
   753
        case KSenduiMtmSmsUidValue:            
hgs
parents:
diff changeset
   754
            type = ECsSMS;
hgs
parents:
diff changeset
   755
            if (aEntry.iBioType == KMsgBioUidVCard.iUid)
hgs
parents:
diff changeset
   756
                {
hgs
parents:
diff changeset
   757
                type = ECsBioMsg_VCard;
hgs
parents:
diff changeset
   758
                }
hgs
parents:
diff changeset
   759
            break;
hgs
parents:
diff changeset
   760
        case KSenduiMtmBtUidValue:
hgs
parents:
diff changeset
   761
            type = ECsBlueTooth;
hgs
parents:
diff changeset
   762
            break;
hgs
parents:
diff changeset
   763
        case KSenduiMtmMmsUidValue:        
hgs
parents:
diff changeset
   764
           if(aEntry.iBioType == KUidMsgSubTypeMmsAudioMsg.iUid)
hgs
parents:
diff changeset
   765
                {
hgs
parents:
diff changeset
   766
                type = ECsAudio;
hgs
parents:
diff changeset
   767
                }
hgs
parents:
diff changeset
   768
            else
hgs
parents:
diff changeset
   769
                {
hgs
parents:
diff changeset
   770
                type = ECsMMS;
hgs
parents:
diff changeset
   771
                }
hgs
parents:
diff changeset
   772
            break;
hgs
parents:
diff changeset
   773
        case KSenduiMMSNotificationUidValue:            
hgs
parents:
diff changeset
   774
            type = ECsMmsNotification;
hgs
parents:
diff changeset
   775
            break;
hgs
parents:
diff changeset
   776
        case KSenduiMtmBioUidValue:
hgs
parents:
diff changeset
   777
            { 
41
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   778
			if (aEntry.iMtmData1 == KSenduiMtmBtUidValue) 
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   779
			{
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   780
           	 	if (aEntry.iBioType == KMsgBioUidVCard.iUid) 
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   781
				{
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   782
                	type = ECsBlueTooth_VCard;
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   783
            	}
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   784
            	else if (aEntry.iBioType == KMsgBioUidVCalendar.iUid)
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   785
				{
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   786
               		type = ECsBlueTooth_VCal;
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   787
            	}
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   788
           		 break;
25fe1fe642e3 201027_02
hgs
parents: 37
diff changeset
   789
        	}
37
hgs
parents:
diff changeset
   790
            type = ECsBioMsg; 
hgs
parents:
diff changeset
   791
            
hgs
parents:
diff changeset
   792
            // based on the biotype uid set message type
hgs
parents:
diff changeset
   793
            if(aEntry.iBioType == KMsgBioUidRingingTone.iUid)
hgs
parents:
diff changeset
   794
                {
hgs
parents:
diff changeset
   795
                type = ECsRingingTone;
hgs
parents:
diff changeset
   796
                }
hgs
parents:
diff changeset
   797
            else if(aEntry.iBioType == KMsgBioProvisioningMessage.iUid)
hgs
parents:
diff changeset
   798
                {
hgs
parents:
diff changeset
   799
                type = ECsProvisioning;
hgs
parents:
diff changeset
   800
                }
hgs
parents:
diff changeset
   801
		    else if (aEntry.iBioType == KMsgBioUidVCard.iUid)
hgs
parents:
diff changeset
   802
                {
hgs
parents:
diff changeset
   803
                type = ECsBioMsg_VCard;
hgs
parents:
diff changeset
   804
                }
hgs
parents:
diff changeset
   805
            else if (aEntry.iBioType == KMsgBioUidVCalendar.iUid)
hgs
parents:
diff changeset
   806
                {
hgs
parents:
diff changeset
   807
                type = ECsBioMsg_VCal;
hgs
parents:
diff changeset
   808
       		 }
hgs
parents:
diff changeset
   809
       		 else if (aEntry.iBioType == KMsgBioNokiaServiceMessage.iUid) {
hgs
parents:
diff changeset
   810
            	type = ECsBioMgs_NokiaService;
hgs
parents:
diff changeset
   811
        }
hgs
parents:
diff changeset
   812
    }
hgs
parents:
diff changeset
   813
        break;
hgs
parents:
diff changeset
   814
    default:
hgs
parents:
diff changeset
   815
        type = ECsUnknown;
hgs
parents:
diff changeset
   816
        break;
hgs
parents:
diff changeset
   817
    }
hgs
parents:
diff changeset
   818
    return (type);
hgs
parents:
diff changeset
   819
}
hgs
parents:
diff changeset
   820
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   821
// void CCsMsgHandler::UpdateMessageArrayL(const TMsvId& aFolderId)
hgs
parents:
diff changeset
   822
// Update iMessageArray with the message ID before upload message to csserver. 
hgs
parents:
diff changeset
   823
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   824
//
hgs
parents:
diff changeset
   825
void CCsMsgHandler::UpdateMessageArrayL(const TMsvId& aFolderId)
hgs
parents:
diff changeset
   826
    {
hgs
parents:
diff changeset
   827
    CMsvEntry* msvEntry = iSession->GetEntryL(aFolderId);
hgs
parents:
diff changeset
   828
    CleanupStack::PushL(msvEntry);
hgs
parents:
diff changeset
   829
    // Set sort order
hgs
parents:
diff changeset
   830
    TMsvSelectionOrdering order;
hgs
parents:
diff changeset
   831
    order.SetSorting(EMsvSortById);
hgs
parents:
diff changeset
   832
    msvEntry->SetSortTypeL(order);
hgs
parents:
diff changeset
   833
hgs
parents:
diff changeset
   834
    CMsvEntrySelection* messages = msvEntry->ChildrenL();  
hgs
parents:
diff changeset
   835
    // Cleanup msvEntry
hgs
parents:
diff changeset
   836
    CleanupStack::PopAndDestroy(msvEntry);
hgs
parents:
diff changeset
   837
    CleanupStack::PushL(messages);
hgs
parents:
diff changeset
   838
hgs
parents:
diff changeset
   839
    TInt messageCount = messages->Count();
hgs
parents:
diff changeset
   840
    
hgs
parents:
diff changeset
   841
    // In case of large number of message caching
hgs
parents:
diff changeset
   842
    // to avoid multiple reallocation alloc memory
hgs
parents:
diff changeset
   843
    // one shot.
hgs
parents:
diff changeset
   844
    if( messageCount > KMessageArrayGranularity)
hgs
parents:
diff changeset
   845
        iMessageArray->Reserve(messageCount);
hgs
parents:
diff changeset
   846
    
hgs
parents:
diff changeset
   847
    for(int i = 0; i < messageCount; i ++)
hgs
parents:
diff changeset
   848
        {
hgs
parents:
diff changeset
   849
        TMsvId msgId=messages->At(i);
hgs
parents:
diff changeset
   850
        iMessageArray->Append(msgId);
hgs
parents:
diff changeset
   851
        }
hgs
parents:
diff changeset
   852
    // Cleanup messages
hgs
parents:
diff changeset
   853
    CleanupStack::PopAndDestroy(messages); 
hgs
parents:
diff changeset
   854
    }
hgs
parents:
diff changeset
   855
// End of file
hgs
parents:
diff changeset
   856