omads/omadsextensions/adapters/sms/src/smsadaptermsvapi.cpp
author hgs
Tue, 13 Jul 2010 03:39:25 +0530
changeset 40 b63e67867dcd
child 43 3daf89f0874a
child 64 a62b67d1f67c
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2005-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:  Part of SyncML Data Synchronization Plug In Adapter
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// INCLUDE FILES
hgs
parents:
diff changeset
    21
#include <txtrich.h>
hgs
parents:
diff changeset
    22
#include <smsclnt.h>
hgs
parents:
diff changeset
    23
#include <smutset.h>
hgs
parents:
diff changeset
    24
#include <smuthdr.h>
hgs
parents:
diff changeset
    25
#include <smscmds.h>
hgs
parents:
diff changeset
    26
#include <sysutil.h> 
hgs
parents:
diff changeset
    27
#include <gsmuelem.h>
hgs
parents:
diff changeset
    28
#include <cntdb.h>
hgs
parents:
diff changeset
    29
#include <cntitem.h>
hgs
parents:
diff changeset
    30
#include <cntfldst.h>
hgs
parents:
diff changeset
    31
#include "smsadaptermsvapi.h"
hgs
parents:
diff changeset
    32
#include "logger.h" 
hgs
parents:
diff changeset
    33
#include "vmessageparser.h"
hgs
parents:
diff changeset
    34
#include "smsdataproviderdefs.h"
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// CONSTANTS
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
_LIT16(KSmsNonUnicodeChars, "èéùìòÇØøÅåÆæßÉ£$¥¡ÄÖÑܧ¿äöñüà");
hgs
parents:
diff changeset
    40
        
hgs
parents:
diff changeset
    41
// OTHER DEFINITIONS
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// ============================= LOCAL FUNCTIONS ===============================
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    52
// CSmsAdapterMsvApi::NewL
hgs
parents:
diff changeset
    53
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
//
hgs
parents:
diff changeset
    55
 CSmsAdapterMsvApi* CSmsAdapterMsvApi::NewL()
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    CSmsAdapterMsvApi* self = new( ELeave ) CSmsAdapterMsvApi;
hgs
parents:
diff changeset
    58
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    59
    self->ConstructL();
hgs
parents:
diff changeset
    60
    CleanupStack::Pop( self );
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
// CSmsAdapterMsvApi::~CSmsAdapterMsvApi()
hgs
parents:
diff changeset
    66
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
//
hgs
parents:
diff changeset
    68
CSmsAdapterMsvApi::~CSmsAdapterMsvApi()
hgs
parents:
diff changeset
    69
    {
hgs
parents:
diff changeset
    70
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::~CSmsAdapterMsvApi" );
hgs
parents:
diff changeset
    71
    SAFEDELETE( iContactsDb );
hgs
parents:
diff changeset
    72
	SAFEDELETE( iMtm );
hgs
parents:
diff changeset
    73
	SAFEDELETE( iMtmReg );     
hgs
parents:
diff changeset
    74
    SAFEDELETE( iSession );
hgs
parents:
diff changeset
    75
    LOGGER_LEAVEFN( "CSmsAdapterMsvApi::~CSmsAdapterMsvApi" );
hgs
parents:
diff changeset
    76
    }
hgs
parents:
diff changeset
    77
       
hgs
parents:
diff changeset
    78
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
// CSmsAdapterMsvApi::CSmsAdapterMsvApi
hgs
parents:
diff changeset
    80
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    81
//
hgs
parents:
diff changeset
    82
CSmsAdapterMsvApi::CSmsAdapterMsvApi()
hgs
parents:
diff changeset
    83
    {     
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    87
// CSmsAdapterMsvApi::ConstructL
hgs
parents:
diff changeset
    88
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
//
hgs
parents:
diff changeset
    90
void CSmsAdapterMsvApi::ConstructL()
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::ConstructL" );
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
    iSession = CMsvSession::OpenSyncL( *this );
hgs
parents:
diff changeset
    95
    iMtmReg = CClientMtmRegistry::NewL( *iSession );    
hgs
parents:
diff changeset
    96
	iMtm = static_cast<CSmsClientMtm*>( iMtmReg->NewMtmL(KUidMsgTypeSMS) ); 
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
	iFs = iSession->FileSession();
hgs
parents:
diff changeset
    99
	iMessageDrive = MessageServer::CurrentDriveL( iFs );
hgs
parents:
diff changeset
   100
	
hgs
parents:
diff changeset
   101
	iContactsDb = CContactDatabase::OpenL();
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
    LOGGER_LEAVEFN( "CSmsAdapterMsvApi::ConstructL" ); 
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
// CSmsAdapterMsvApi::AddSML
hgs
parents:
diff changeset
   108
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
//
hgs
parents:
diff changeset
   110
void CSmsAdapterMsvApi::AddSML(
hgs
parents:
diff changeset
   111
    CVMessageParser& aSm,
hgs
parents:
diff changeset
   112
    TMsvId aFolder,                                                                                                                                                                                                        
hgs
parents:
diff changeset
   113
    TMsvId& aSmId )
hgs
parents:
diff changeset
   114
    {
hgs
parents:
diff changeset
   115
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::AddSML" );
hgs
parents:
diff changeset
   116
   
hgs
parents:
diff changeset
   117
    if (!ValidFolderL( aFolder ))
hgs
parents:
diff changeset
   118
        {
hgs
parents:
diff changeset
   119
		LOGGER_WRITE( "AddSML: wrong folder" );
hgs
parents:
diff changeset
   120
        User::Leave( KErrArgument );
hgs
parents:
diff changeset
   121
        }
hgs
parents:
diff changeset
   122
           
hgs
parents:
diff changeset
   123
    // Set first default flags  
hgs
parents:
diff changeset
   124
    TMsvEntry newEntry;  
hgs
parents:
diff changeset
   125
    newEntry.iType = KUidMsvMessageEntry;
hgs
parents:
diff changeset
   126
    newEntry.iServiceId = KMsvLocalServiceIndexEntryId;
hgs
parents:
diff changeset
   127
    newEntry.iMtm = KUidMsgTypeSMS;
hgs
parents:
diff changeset
   128
    newEntry.SetVisible(EFalse);
hgs
parents:
diff changeset
   129
    newEntry.SetInPreparation(ETrue);           
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    // Create new message entry
hgs
parents:
diff changeset
   132
    CMsvEntry* entry = iSession->GetEntryL( aFolder );
hgs
parents:
diff changeset
   133
    CleanupStack::PushL( entry );   
hgs
parents:
diff changeset
   134
    entry->CreateL( newEntry );
hgs
parents:
diff changeset
   135
    aSmId = newEntry.Id();  
hgs
parents:
diff changeset
   136
    entry->SetEntryL(newEntry.Id());
hgs
parents:
diff changeset
   137
    
hgs
parents:
diff changeset
   138
    // Create message header
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL();
hgs
parents:
diff changeset
   141
    CleanupStack::PushL( paraFormatLayer );
hgs
parents:
diff changeset
   142
    CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL();
hgs
parents:
diff changeset
   143
    CleanupStack::PushL( charFormatLayer );
hgs
parents:
diff changeset
   144
    CRichText* richText = CRichText::NewL( paraFormatLayer, charFormatLayer );
hgs
parents:
diff changeset
   145
    CleanupStack::PushL( richText ); 
hgs
parents:
diff changeset
   146
    
hgs
parents:
diff changeset
   147
    CSmsPDU::TSmsPDUType pduType;
hgs
parents:
diff changeset
   148
    
hgs
parents:
diff changeset
   149
    if (aFolder == KMsvGlobalInBoxIndexEntryId)
hgs
parents:
diff changeset
   150
        {
hgs
parents:
diff changeset
   151
        pduType = CSmsPDU::ESmsDeliver;
hgs
parents:
diff changeset
   152
        }
hgs
parents:
diff changeset
   153
    else if (aFolder == KMsvGlobalOutBoxIndexEntryId ||
hgs
parents:
diff changeset
   154
             aFolder == KMsvDraftEntryId ||
hgs
parents:
diff changeset
   155
             aFolder == KMsvSentEntryId)  
hgs
parents:
diff changeset
   156
        {
hgs
parents:
diff changeset
   157
        pduType = CSmsPDU::ESmsSubmit;
hgs
parents:
diff changeset
   158
        }
hgs
parents:
diff changeset
   159
    else if (aSm.iRecipients.Count() > 0)
hgs
parents:
diff changeset
   160
        {
hgs
parents:
diff changeset
   161
        pduType = CSmsPDU::ESmsSubmit;
hgs
parents:
diff changeset
   162
        }
hgs
parents:
diff changeset
   163
    else
hgs
parents:
diff changeset
   164
        {
hgs
parents:
diff changeset
   165
        pduType = CSmsPDU::ESmsDeliver;
hgs
parents:
diff changeset
   166
        }       
hgs
parents:
diff changeset
   167
    
hgs
parents:
diff changeset
   168
    CSmsHeader* smsHeader = CSmsHeader::NewL( pduType, *richText );
hgs
parents:
diff changeset
   169
    CleanupStack::PushL( smsHeader );
hgs
parents:
diff changeset
   170
    
hgs
parents:
diff changeset
   171
    // Set the message header in the entry's store
hgs
parents:
diff changeset
   172
    CMsvStore* store = entry->EditStoreL();
hgs
parents:
diff changeset
   173
    CleanupStack::PushL( store );
hgs
parents:
diff changeset
   174
    smsHeader->StoreL( *store );
hgs
parents:
diff changeset
   175
    store->StoreBodyTextL( *richText );
hgs
parents:
diff changeset
   176
    store->CommitL();
hgs
parents:
diff changeset
   177
    
hgs
parents:
diff changeset
   178
    CleanupStack::PopAndDestroy( store );
hgs
parents:
diff changeset
   179
    CleanupStack::PopAndDestroy( smsHeader );
hgs
parents:
diff changeset
   180
    CleanupStack::PopAndDestroy( richText );
hgs
parents:
diff changeset
   181
    CleanupStack::PopAndDestroy( charFormatLayer );
hgs
parents:
diff changeset
   182
    CleanupStack::PopAndDestroy( paraFormatLayer );
hgs
parents:
diff changeset
   183
    CleanupStack::PopAndDestroy( entry );
hgs
parents:
diff changeset
   184
   
hgs
parents:
diff changeset
   185
	DoUpdateSML( aSmId, aSm, ETrue );
hgs
parents:
diff changeset
   186
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::AddSML" );
hgs
parents:
diff changeset
   187
    }
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   190
// CSmsAdapterMsvApi::ReplaceSML
hgs
parents:
diff changeset
   191
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   192
//
hgs
parents:
diff changeset
   193
 void CSmsAdapterMsvApi::ReplaceSML( TMsvId aSmId, CVMessageParser& aSm ) 
hgs
parents:
diff changeset
   194
    {
hgs
parents:
diff changeset
   195
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::ReplaceSML" );
hgs
parents:
diff changeset
   196
	DoUpdateSML( aSmId, aSm, EFalse );
hgs
parents:
diff changeset
   197
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::ReplaceSML" );
hgs
parents:
diff changeset
   198
    }
hgs
parents:
diff changeset
   199
    
hgs
parents:
diff changeset
   200
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   201
// CSmsAdapterMsvApi::DeleteSML
hgs
parents:
diff changeset
   202
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   203
//
hgs
parents:
diff changeset
   204
 void CSmsAdapterMsvApi::DeleteSML( TMsvId aSmId )
hgs
parents:
diff changeset
   205
    {
hgs
parents:
diff changeset
   206
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::DeleteSML" );
hgs
parents:
diff changeset
   207
    
hgs
parents:
diff changeset
   208
    iMtm->SwitchCurrentEntryL( aSmId );
hgs
parents:
diff changeset
   209
    
hgs
parents:
diff changeset
   210
    TMsvEntry tEntry = iMtm->Entry().Entry();  		
hgs
parents:
diff changeset
   211
    if (tEntry.iType != KUidMsvMessageEntry || tEntry.iMtm != KUidMsgTypeSMS)
hgs
parents:
diff changeset
   212
        {
hgs
parents:
diff changeset
   213
        LOGGER_WRITE( "Not SMS entry" );
hgs
parents:
diff changeset
   214
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   215
        }
hgs
parents:
diff changeset
   216
    
hgs
parents:
diff changeset
   217
	iMtm->SwitchCurrentEntryL( tEntry.Parent() );
hgs
parents:
diff changeset
   218
	iMtm->Entry().DeleteL( aSmId );
hgs
parents:
diff changeset
   219
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::DeleteSML" );
hgs
parents:
diff changeset
   220
    }
hgs
parents:
diff changeset
   221
    
hgs
parents:
diff changeset
   222
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   223
// CSmsAdapterMsvApi::DeleteUserFolderL
hgs
parents:
diff changeset
   224
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   225
//
hgs
parents:
diff changeset
   226
 TInt CSmsAdapterMsvApi::DeleteUserFolderL( TMsvId aUid )
hgs
parents:
diff changeset
   227
    {
hgs
parents:
diff changeset
   228
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::DeleteUserFolderL" );
hgs
parents:
diff changeset
   229
    
hgs
parents:
diff changeset
   230
    iMtm->SwitchCurrentEntryL( aUid );
hgs
parents:
diff changeset
   231
    CMsvEntry& entry = iMtm->Entry();
hgs
parents:
diff changeset
   232
    TMsvEntry tEntry = entry.Entry();  		
hgs
parents:
diff changeset
   233
    
hgs
parents:
diff changeset
   234
    if (tEntry.iType != KUidMsvFolderEntry || tEntry.Parent() != KMsvMyFoldersEntryIdValue)
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
        LOGGER_WRITE( "Not correct folder" );
hgs
parents:
diff changeset
   237
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   238
        }
hgs
parents:
diff changeset
   239
        
hgs
parents:
diff changeset
   240
    CMsvEntrySelection* children = entry.ChildrenL();
hgs
parents:
diff changeset
   241
    TInt count = children->Count();
hgs
parents:
diff changeset
   242
    delete children;
hgs
parents:
diff changeset
   243
    
hgs
parents:
diff changeset
   244
  	if (count > 0)
hgs
parents:
diff changeset
   245
	    {
hgs
parents:
diff changeset
   246
	    LOGGER_WRITE( "Folder not empty" );
hgs
parents:
diff changeset
   247
	    return KErrInUse;
hgs
parents:
diff changeset
   248
	    }
hgs
parents:
diff changeset
   249
	    
hgs
parents:
diff changeset
   250
	tEntry.SetReadOnly(EFalse);
hgs
parents:
diff changeset
   251
	entry.ChangeL( tEntry );
hgs
parents:
diff changeset
   252
       
hgs
parents:
diff changeset
   253
	iMtm->SwitchCurrentEntryL( tEntry.Parent() );	
hgs
parents:
diff changeset
   254
	iMtm->Entry().DeleteL( aUid );
hgs
parents:
diff changeset
   255
	
hgs
parents:
diff changeset
   256
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::DeleteUserFolderL" );
hgs
parents:
diff changeset
   257
	return KErrNone;
hgs
parents:
diff changeset
   258
    }   
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   261
// CSmsAdapterMsvApi::RetrieveSML
hgs
parents:
diff changeset
   262
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   263
//
hgs
parents:
diff changeset
   264
 void CSmsAdapterMsvApi::RetrieveSML(
hgs
parents:
diff changeset
   265
    TMsvId aSmId,
hgs
parents:
diff changeset
   266
    TMsvId& aParent,
hgs
parents:
diff changeset
   267
    CVMessageParser& aSm,
hgs
parents:
diff changeset
   268
    TBool& aUnread)
hgs
parents:
diff changeset
   269
    {
hgs
parents:
diff changeset
   270
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::RetrieveSML" );
hgs
parents:
diff changeset
   271
                          
hgs
parents:
diff changeset
   272
    iMtm->SwitchCurrentEntryL( aSmId );
hgs
parents:
diff changeset
   273
    iMtm->LoadMessageL();
hgs
parents:
diff changeset
   274
    
hgs
parents:
diff changeset
   275
    CRichText& mtmBody = iMtm->Body();
hgs
parents:
diff changeset
   276
	aSm.StoreMessageBodyL( mtmBody );
hgs
parents:
diff changeset
   277
       
hgs
parents:
diff changeset
   278
    TMsvEntry tEntry = iMtm->Entry().Entry();
hgs
parents:
diff changeset
   279
    
hgs
parents:
diff changeset
   280
    aUnread = tEntry.Unread();
hgs
parents:
diff changeset
   281
	if (aUnread)
hgs
parents:
diff changeset
   282
		{
hgs
parents:
diff changeset
   283
		aSm.iStatus = KVMsgStatusUnread;
hgs
parents:
diff changeset
   284
		}
hgs
parents:
diff changeset
   285
	else
hgs
parents:
diff changeset
   286
		{
hgs
parents:
diff changeset
   287
		aSm.iStatus = KVMsgStatusRead;
hgs
parents:
diff changeset
   288
		}
hgs
parents:
diff changeset
   289
	
hgs
parents:
diff changeset
   290
	aSm.iUniversalTime = tEntry.iDate;	
hgs
parents:
diff changeset
   291
	aSm.iHomeTime = HomeTimeFromUniversalTime( aSm.iUniversalTime );
hgs
parents:
diff changeset
   292
    
hgs
parents:
diff changeset
   293
	aParent = tEntry.Parent();	
hgs
parents:
diff changeset
   294
	switch (aParent)
hgs
parents:
diff changeset
   295
		{
hgs
parents:
diff changeset
   296
		case KMsvGlobalInBoxIndexEntryId:
hgs
parents:
diff changeset
   297
			aSm.iFolder = KFolderInbox;
hgs
parents:
diff changeset
   298
			break;
hgs
parents:
diff changeset
   299
		case KMsvGlobalOutBoxIndexEntryId:
hgs
parents:
diff changeset
   300
			aSm.iFolder = KFolderOutbox;
hgs
parents:
diff changeset
   301
			break;
hgs
parents:
diff changeset
   302
		case KMsvDraftEntryId:
hgs
parents:
diff changeset
   303
			aSm.iFolder = KFolderDraft;
hgs
parents:
diff changeset
   304
			break;
hgs
parents:
diff changeset
   305
		case KMsvSentEntryId:
hgs
parents:
diff changeset
   306
			aSm.iFolder = KFolderSent;
hgs
parents:
diff changeset
   307
			break;
hgs
parents:
diff changeset
   308
		case KMsvMyFoldersEntryIdValue:
hgs
parents:
diff changeset
   309
		    aSm.iFolder = KFolderMyFolders;    
hgs
parents:
diff changeset
   310
			break;
hgs
parents:
diff changeset
   311
		default:
hgs
parents:
diff changeset
   312
		    TPtrC folderName;
hgs
parents:
diff changeset
   313
		    TTime time;
hgs
parents:
diff changeset
   314
		    TBool found = FindUserFolderL(aParent, folderName, time);
hgs
parents:
diff changeset
   315
		    if (found && folderName.Length() <= KMaxFolderNameLength)
hgs
parents:
diff changeset
   316
		        {
hgs
parents:
diff changeset
   317
		        aSm.iFolder = folderName;
hgs
parents:
diff changeset
   318
		        }
hgs
parents:
diff changeset
   319
		    else
hgs
parents:
diff changeset
   320
		        {
hgs
parents:
diff changeset
   321
		        LOGGER_WRITE_1( "Not folder name found for folder: %d", aParent );
hgs
parents:
diff changeset
   322
		        }       	
hgs
parents:
diff changeset
   323
		}
hgs
parents:
diff changeset
   324
		LOG( aSm.iFolder );
hgs
parents:
diff changeset
   325
		
hgs
parents:
diff changeset
   326
	const CSmsHeader& smsHeader = iMtm->SmsHeader();
hgs
parents:
diff changeset
   327
	
hgs
parents:
diff changeset
   328
	if ( smsHeader.Type() == CSmsPDU::ESmsDeliver )
hgs
parents:
diff changeset
   329
	    {
hgs
parents:
diff changeset
   330
		TPtrC fromAddr = smsHeader.FromAddress();
hgs
parents:
diff changeset
   331
		aSm.ParseTelephoneNumber( fromAddr, aSm.iSender );
hgs
parents:
diff changeset
   332
		}
hgs
parents:
diff changeset
   333
	else
hgs
parents:
diff changeset
   334
		{
hgs
parents:
diff changeset
   335
		const CMsvRecipientList& recipients = iMtm->AddresseeList();
hgs
parents:
diff changeset
   336
		for (TInt i = 0; i < recipients.Count(); i++)
hgs
parents:
diff changeset
   337
			{
hgs
parents:
diff changeset
   338
			CVMessageParser::TTelephoneNumber recipientInfo;
hgs
parents:
diff changeset
   339
			aSm.ParseTelephoneNumber( recipients[i], recipientInfo );
hgs
parents:
diff changeset
   340
			aSm.iRecipients.Append( recipientInfo );
hgs
parents:
diff changeset
   341
			}
hgs
parents:
diff changeset
   342
		}	
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::RetrieveSML" );
hgs
parents:
diff changeset
   345
    }
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   348
// CSmsAdapterMsvApi::SendSML
hgs
parents:
diff changeset
   349
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   350
//
hgs
parents:
diff changeset
   351
 void CSmsAdapterMsvApi::SendSML( TMsvId aSmId )
hgs
parents:
diff changeset
   352
    {
hgs
parents:
diff changeset
   353
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::SendSML" );
hgs
parents:
diff changeset
   354
   
hgs
parents:
diff changeset
   355
	iMtm->SwitchCurrentEntryL( aSmId );
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
	TMsvEntry msvEntry = iMtm->Entry().Entry();	
hgs
parents:
diff changeset
   358
	
hgs
parents:
diff changeset
   359
	if (msvEntry.Parent() != KMsvGlobalOutBoxIndexEntryId)
hgs
parents:
diff changeset
   360
		{
hgs
parents:
diff changeset
   361
 		LOGGER_WRITE_1( "Wrong folder, parent: %d", msvEntry.Parent() );
hgs
parents:
diff changeset
   362
 		return;
hgs
parents:
diff changeset
   363
 		}
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
	iMtm->LoadMessageL();
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
	msvEntry.SetInPreparation( EFalse );
hgs
parents:
diff changeset
   368
	msvEntry.SetSendingState( KMsvSendStateWaiting );
hgs
parents:
diff changeset
   369
	msvEntry.iDate.UniversalTime();
hgs
parents:
diff changeset
   370
	
hgs
parents:
diff changeset
   371
	iMtm->RestoreServiceAndSettingsL();
hgs
parents:
diff changeset
   372
	CSmsHeader& header = iMtm->SmsHeader();
hgs
parents:
diff changeset
   373
	
hgs
parents:
diff changeset
   374
	CSmsSettings* sendOptions = CSmsSettings::NewL();
hgs
parents:
diff changeset
   375
	CleanupStack::PushL( sendOptions );
hgs
parents:
diff changeset
   376
		
hgs
parents:
diff changeset
   377
	sendOptions->CopyL( iMtm->ServiceSettings() );
hgs
parents:
diff changeset
   378
	sendOptions->SetDelivery( ESmsDeliveryImmediately );
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
	TSmsDataCodingScheme::TSmsAlphabet dataCoding = TSmsDataCodingScheme::ESmsAlphabet7Bit;
hgs
parents:
diff changeset
   381
	CRichText& msgBody = iMtm->Body();
hgs
parents:
diff changeset
   382
	HBufC* msgBodyBuf = HBufC::NewLC( msgBody.DocumentLength() );
hgs
parents:
diff changeset
   383
	TPtr16 ptrBody = msgBodyBuf->Des();
hgs
parents:
diff changeset
   384
	msgBody.Extract( ptrBody, 0, msgBody.DocumentLength() );
hgs
parents:
diff changeset
   385
	LOG(ptrBody);
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
	for (TInt i = 0; i < ptrBody.Length(); i++)
hgs
parents:
diff changeset
   388
		{
hgs
parents:
diff changeset
   389
		if (IsUnicode( ptrBody[i] ))
hgs
parents:
diff changeset
   390
			{
hgs
parents:
diff changeset
   391
			LOGGER_WRITE_1( "Character %d is unicode", i );
hgs
parents:
diff changeset
   392
			dataCoding = TSmsDataCodingScheme::ESmsAlphabetUCS2;
hgs
parents:
diff changeset
   393
			break;
hgs
parents:
diff changeset
   394
			}
hgs
parents:
diff changeset
   395
		}
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
	sendOptions->SetCharacterSet( dataCoding );
hgs
parents:
diff changeset
   398
	CleanupStack::PopAndDestroy( msgBodyBuf ); 
hgs
parents:
diff changeset
   399
		
hgs
parents:
diff changeset
   400
	header.SetSmsSettingsL( *sendOptions );
hgs
parents:
diff changeset
   401
	if( header.Message().ServiceCenterAddress().Length() == 0 )
hgs
parents:
diff changeset
   402
		{
hgs
parents:
diff changeset
   403
		LOGGER_WRITE( "header.Message().ServiceCenterAddress().Length() == 0" );    
hgs
parents:
diff changeset
   404
		
hgs
parents:
diff changeset
   405
		CSmsSettings* serviceSettings = &( iMtm->ServiceSettings() );
hgs
parents:
diff changeset
   406
        
hgs
parents:
diff changeset
   407
		if (!serviceSettings->ServiceCenterCount())
hgs
parents:
diff changeset
   408
			{
hgs
parents:
diff changeset
   409
			LOGGER_WRITE("Cervice Center not found, could not send message");
hgs
parents:
diff changeset
   410
			User::Leave( KErrCompletion );
hgs
parents:
diff changeset
   411
			}
hgs
parents:
diff changeset
   412
		else
hgs
parents:
diff changeset
   413
			{
hgs
parents:
diff changeset
   414
			CSmsServiceCenter* sc =  &serviceSettings->GetServiceCenter( serviceSettings->DefaultServiceCenter() );
hgs
parents:
diff changeset
   415
			header.Message().SetServiceCenterAddressL( sc->Address() );	
hgs
parents:
diff changeset
   416
			}				
hgs
parents:
diff changeset
   417
		}
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
    const CMsvRecipientList& addrList = iMtm->AddresseeList();
hgs
parents:
diff changeset
   420
    if ( addrList.Count() == 0 )
hgs
parents:
diff changeset
   421
        {
hgs
parents:
diff changeset
   422
		LOGGER_WRITE( "SendSML: no recipient" );
hgs
parents:
diff changeset
   423
        User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   424
        }
hgs
parents:
diff changeset
   425
   
hgs
parents:
diff changeset
   426
	CMsvEntry* entry = &( iMtm->Entry() );
hgs
parents:
diff changeset
   427
	entry->ChangeL( msvEntry );	
hgs
parents:
diff changeset
   428
	iMtm->SaveMessageL();
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
	CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection;
hgs
parents:
diff changeset
   431
	CleanupStack::PushL( sel );
hgs
parents:
diff changeset
   432
	sel->AppendL( entry->EntryId() );
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
	TBuf8<1> dummy;
hgs
parents:
diff changeset
   435
	CMsvOperationActiveSchedulerWait* waiter = CMsvOperationActiveSchedulerWait::NewLC();
hgs
parents:
diff changeset
   436
	waiter->iStatus = KRequestPending;
hgs
parents:
diff changeset
   437
	CMsvOperation* op = iMtm->InvokeAsyncFunctionL( ESmsMtmCommandScheduleCopy, *sel, dummy, waiter->iStatus );
hgs
parents:
diff changeset
   438
	CleanupStack::PushL( op );
hgs
parents:
diff changeset
   439
	waiter->Start();
hgs
parents:
diff changeset
   440
	
hgs
parents:
diff changeset
   441
	LOGGER_WRITE_1( "InvokeAsyncFunctionL: status %d", waiter->iStatus.Int());
hgs
parents:
diff changeset
   442
    
hgs
parents:
diff changeset
   443
	CleanupStack::PopAndDestroy( 4 ); // op, waiter, sel, sendOptions	
hgs
parents:
diff changeset
   444
	
hgs
parents:
diff changeset
   445
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::SendSML" );
hgs
parents:
diff changeset
   446
    }
hgs
parents:
diff changeset
   447
    
hgs
parents:
diff changeset
   448
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   449
// CSmsAdapterMsvApi::HandleSessionEventL
hgs
parents:
diff changeset
   450
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   451
//
hgs
parents:
diff changeset
   452
void CSmsAdapterMsvApi::HandleSessionEventL( TMsvSessionEvent aEvent, TAny*, TAny*, TAny* )
hgs
parents:
diff changeset
   453
    {
hgs
parents:
diff changeset
   454
    LOGGER_WRITE_1( "CSmsAdapterMsvApi::HandleSessionEventL: %d", aEvent);
hgs
parents:
diff changeset
   455
    
hgs
parents:
diff changeset
   456
    switch ( aEvent )
hgs
parents:
diff changeset
   457
        {
hgs
parents:
diff changeset
   458
        case EMsvCloseSession: // The client should immediately close the session with the Message Server.
hgs
parents:
diff changeset
   459
        case EMsvServerTerminated: // The Message Server has been terminated.
hgs
parents:
diff changeset
   460
                                   // All clients must close their sessions immediately. 
hgs
parents:
diff changeset
   461
            {
hgs
parents:
diff changeset
   462
            if (iSession)
hgs
parents:
diff changeset
   463
                {
hgs
parents:
diff changeset
   464
				SAFEDELETE( iMtm );
hgs
parents:
diff changeset
   465
				SAFEDELETE( iMtmReg );
hgs
parents:
diff changeset
   466
                SAFEDELETE( iSession );
hgs
parents:
diff changeset
   467
                }
hgs
parents:
diff changeset
   468
            }   
hgs
parents:
diff changeset
   469
            break;
hgs
parents:
diff changeset
   470
        
hgs
parents:
diff changeset
   471
        default:
hgs
parents:
diff changeset
   472
            // Nothing is done
hgs
parents:
diff changeset
   473
            break;
hgs
parents:
diff changeset
   474
        } 
hgs
parents:
diff changeset
   475
    }
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   478
// CSmsAdapterMsvApi::MsvSession
hgs
parents:
diff changeset
   479
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   480
//
hgs
parents:
diff changeset
   481
CMsvSession* CSmsAdapterMsvApi::MsvSessionL()
hgs
parents:
diff changeset
   482
	{
hgs
parents:
diff changeset
   483
	if (!iSession)
hgs
parents:
diff changeset
   484
		{
hgs
parents:
diff changeset
   485
		User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   486
		}
hgs
parents:
diff changeset
   487
	return iSession;
hgs
parents:
diff changeset
   488
	}
hgs
parents:
diff changeset
   489
hgs
parents:
diff changeset
   490
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   491
//	CSmsAdapterMsvApi::CleanFolderGetMsvIdsL
hgs
parents:
diff changeset
   492
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   493
//
hgs
parents:
diff changeset
   494
CMsvEntrySelection* CSmsAdapterMsvApi::CleanFolderGetMsvIdsL(TMsvId aFolderId)
hgs
parents:
diff changeset
   495
    {
hgs
parents:
diff changeset
   496
    LOGGER_ENTERFN( "CMsvEntrySelection::CleanFolderGetMsvIdsL" );
hgs
parents:
diff changeset
   497
    
hgs
parents:
diff changeset
   498
    CMsvEntry* cEntry = iSession->GetEntryL( KMsvRootIndexEntryId );
hgs
parents:
diff changeset
   499
    CleanupStack::PushL( cEntry );
hgs
parents:
diff changeset
   500
    
hgs
parents:
diff changeset
   501
    cEntry->SetEntryL( aFolderId );
hgs
parents:
diff changeset
   502
    cEntry->SetSortTypeL( TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, EFalse ) );
hgs
parents:
diff changeset
   503
    CMsvEntrySelection* msvEntrySelection = cEntry->ChildrenWithMtmL( KUidMsgTypeSMS );
hgs
parents:
diff changeset
   504
    
hgs
parents:
diff changeset
   505
    CleanupStack::PopAndDestroy( cEntry );
hgs
parents:
diff changeset
   506
    CleanupStack::PushL( msvEntrySelection );
hgs
parents:
diff changeset
   507
    
hgs
parents:
diff changeset
   508
    for (TInt i = 0; i < msvEntrySelection->Count(); i++)
hgs
parents:
diff changeset
   509
        {
hgs
parents:
diff changeset
   510
        CMsvEntry* entry = iSession->GetEntryL( msvEntrySelection->At(i) );
hgs
parents:
diff changeset
   511
        CleanupStack::PushL( entry );
hgs
parents:
diff changeset
   512
        TMsvEntry tEntry = entry->Entry();
hgs
parents:
diff changeset
   513
        tEntry.SetReadOnly( EFalse );
hgs
parents:
diff changeset
   514
        entry->ChangeL( tEntry );
hgs
parents:
diff changeset
   515
        DeleteSML( msvEntrySelection->At(i) );
hgs
parents:
diff changeset
   516
        CleanupStack::PopAndDestroy(); //entry
hgs
parents:
diff changeset
   517
        }
hgs
parents:
diff changeset
   518
        
hgs
parents:
diff changeset
   519
    CleanupStack::Pop(msvEntrySelection);
hgs
parents:
diff changeset
   520
    LOGGER_LEAVEFN( "CSmsAdapterMsvApi::CleanFolderGetMsvIdsL" );
hgs
parents:
diff changeset
   521
    return msvEntrySelection;
hgs
parents:
diff changeset
   522
    }
hgs
parents:
diff changeset
   523
    
hgs
parents:
diff changeset
   524
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   525
//	CSmsAdapterMsvApi::CleanFolderL
hgs
parents:
diff changeset
   526
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   527
//
hgs
parents:
diff changeset
   528
void CSmsAdapterMsvApi::CleanFolderL(TMsvId aFolderId)
hgs
parents:
diff changeset
   529
    {
hgs
parents:
diff changeset
   530
    CMsvEntrySelection* msvEntrySelection = CleanFolderGetMsvIdsL(aFolderId);
hgs
parents:
diff changeset
   531
    delete msvEntrySelection;
hgs
parents:
diff changeset
   532
    }
hgs
parents:
diff changeset
   533
    
hgs
parents:
diff changeset
   534
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   535
// CSmsAdapterMsvApi::CleanUserFoldersL
hgs
parents:
diff changeset
   536
// Cleans all user folders from SMS messages
hgs
parents:
diff changeset
   537
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   538
void CSmsAdapterMsvApi::CleanUserFoldersL() 
hgs
parents:
diff changeset
   539
    {
hgs
parents:
diff changeset
   540
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::CleanUserFoldersL" );
hgs
parents:
diff changeset
   541
    
hgs
parents:
diff changeset
   542
    // Get the folder	
hgs
parents:
diff changeset
   543
	CMsvEntry* msvEntry = iSession->GetEntryL(KMsvMyFoldersEntryIdValue);
hgs
parents:
diff changeset
   544
	CleanupStack::PushL(msvEntry);
hgs
parents:
diff changeset
   545
	
hgs
parents:
diff changeset
   546
	// Find all of it's childs
hgs
parents:
diff changeset
   547
	CMsvEntrySelection* folders = msvEntry->ChildrenWithTypeL(KUidMsvFolderEntry);
hgs
parents:
diff changeset
   548
	CleanupStack::PopAndDestroy(msvEntry); 
hgs
parents:
diff changeset
   549
	CleanupStack::PushL(folders);
hgs
parents:
diff changeset
   550
	
hgs
parents:
diff changeset
   551
	TInt error(KErrNone);
hgs
parents:
diff changeset
   552
hgs
parents:
diff changeset
   553
    for (TInt index = 0; index < folders->Count(); index++)
hgs
parents:
diff changeset
   554
        {
hgs
parents:
diff changeset
   555
        TMsvId folderId = folders->At(index);
hgs
parents:
diff changeset
   556
        
hgs
parents:
diff changeset
   557
        if (folderId != KMsvMyFoldersTemplatesFolderId)
hgs
parents:
diff changeset
   558
            {
hgs
parents:
diff changeset
   559
            CleanFolderL(folderId);
hgs
parents:
diff changeset
   560
            error = DeleteUserFolderL(folderId);
hgs
parents:
diff changeset
   561
            if (error != KErrNone)
hgs
parents:
diff changeset
   562
                {
hgs
parents:
diff changeset
   563
                // Note: folder is not deleted if contains other message items (like MMS)
hgs
parents:
diff changeset
   564
                // In this case DeleteUserFolderL returns KErrInUse.
hgs
parents:
diff changeset
   565
                LOGGER_WRITE_1("iMsvApi->DeleteUserFolderL failed with %d", error);
hgs
parents:
diff changeset
   566
                }
hgs
parents:
diff changeset
   567
            }
hgs
parents:
diff changeset
   568
        }
hgs
parents:
diff changeset
   569
	
hgs
parents:
diff changeset
   570
	CleanupStack::PopAndDestroy(folders);
hgs
parents:
diff changeset
   571
	
hgs
parents:
diff changeset
   572
	// Delete also SMS messages directly under My Folders
hgs
parents:
diff changeset
   573
	CleanFolderL(KMsvMyFoldersEntryIdValue);
hgs
parents:
diff changeset
   574
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::CleanUserFoldersL" );
hgs
parents:
diff changeset
   575
    }
hgs
parents:
diff changeset
   576
   
hgs
parents:
diff changeset
   577
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   578
//	CSmsAdapterMsvApi::DiskSpaceBelowCriticalLevelL
hgs
parents:
diff changeset
   579
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   580
//
hgs
parents:
diff changeset
   581
TBool CSmsAdapterMsvApi::DiskSpaceBelowCriticalLevelL( TInt aDataSize )
hgs
parents:
diff changeset
   582
    {
hgs
parents:
diff changeset
   583
    return SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, aDataSize, iMessageDrive );
hgs
parents:
diff changeset
   584
    }
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   587
//	CSmsAdapterMsvApi::UpdateSMStatusL
hgs
parents:
diff changeset
   588
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   589
//
hgs
parents:
diff changeset
   590
void CSmsAdapterMsvApi::UpdateSMStatusL( TMsvId aSmId, CVMessageParser &aSm )
hgs
parents:
diff changeset
   591
    {
hgs
parents:
diff changeset
   592
	LOGGER_ENTERFN( "CSmsAdapterMsvApi::UpdateSMStatusL" );
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
	iMtm->SwitchCurrentEntryL( aSmId );
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
	CMsvEntry& msvEntry = iMtm->Entry();
hgs
parents:
diff changeset
   597
	const TMsvEntry& oldEntry = msvEntry.Entry();
hgs
parents:
diff changeset
   598
	
hgs
parents:
diff changeset
   599
	TMsvEntry newEntry( oldEntry );
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
	// STATUS
hgs
parents:
diff changeset
   602
	if (aSm.iStatus.Compare( KVMsgStatusUnread ) == 0)
hgs
parents:
diff changeset
   603
		{
hgs
parents:
diff changeset
   604
		newEntry.SetUnread( ETrue );
hgs
parents:
diff changeset
   605
		}
hgs
parents:
diff changeset
   606
	else if (aSm.iStatus.Compare( KVMsgStatusRead ) == 0)
hgs
parents:
diff changeset
   607
		{
hgs
parents:
diff changeset
   608
		newEntry.SetUnread( EFalse );
hgs
parents:
diff changeset
   609
		}
hgs
parents:
diff changeset
   610
	else 
hgs
parents:
diff changeset
   611
		{
hgs
parents:
diff changeset
   612
		LOGGER_WRITE( "Unexpected status, not updated" );
hgs
parents:
diff changeset
   613
		LOG( aSm.iStatus );
hgs
parents:
diff changeset
   614
		}
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
	msvEntry.ChangeL( newEntry );
hgs
parents:
diff changeset
   617
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::UpdateSMStatusL" );
hgs
parents:
diff changeset
   618
    }
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   621
//	CSmsAdapterMsvApi::DoUpdateSML
hgs
parents:
diff changeset
   622
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   623
//
hgs
parents:
diff changeset
   624
void CSmsAdapterMsvApi::DoUpdateSML( TMsvId aSmId, CVMessageParser &aSm, TBool aNewSm )
hgs
parents:
diff changeset
   625
    {
hgs
parents:
diff changeset
   626
	LOGGER_WRITE_1( "CSmsAdapterMsvApi::DoUpdateSML: %d", aSmId );
hgs
parents:
diff changeset
   627
	TInt i;
hgs
parents:
diff changeset
   628
hgs
parents:
diff changeset
   629
	iMtm->SwitchCurrentEntryL( aSmId );
hgs
parents:
diff changeset
   630
	iMtm->LoadMessageL();	
hgs
parents:
diff changeset
   631
	CMsvEntry& msvEntry = iMtm->Entry();
hgs
parents:
diff changeset
   632
	const TMsvEntry& oldEntry = msvEntry.Entry();
hgs
parents:
diff changeset
   633
	TMsvEntry newEntry(oldEntry);
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
	// Set message status
hgs
parents:
diff changeset
   636
	if (aSm.iStatus.Compare( KVMsgStatusUnread ) == 0)
hgs
parents:
diff changeset
   637
		{
hgs
parents:
diff changeset
   638
		newEntry.SetUnread( ETrue );
hgs
parents:
diff changeset
   639
		}
hgs
parents:
diff changeset
   640
	else if (aSm.iStatus.Compare( KVMsgStatusRead ) == 0)
hgs
parents:
diff changeset
   641
		{
hgs
parents:
diff changeset
   642
		newEntry.SetUnread( EFalse );
hgs
parents:
diff changeset
   643
		}
hgs
parents:
diff changeset
   644
	else if (aNewSm)
hgs
parents:
diff changeset
   645
		{
hgs
parents:
diff changeset
   646
		newEntry.SetUnread( EFalse ); // by default msg is not unread, if we don't know
hgs
parents:
diff changeset
   647
		}	
hgs
parents:
diff changeset
   648
hgs
parents:
diff changeset
   649
	// Set time. store format is universal
hgs
parents:
diff changeset
   650
	if ( aSm.iUniversalTime.Int64() > 0 )
hgs
parents:
diff changeset
   651
		{
hgs
parents:
diff changeset
   652
		newEntry.iDate = aSm.iUniversalTime;
hgs
parents:
diff changeset
   653
		}
hgs
parents:
diff changeset
   654
	else if ( aSm.iHomeTime.Int64() > 0 )
hgs
parents:
diff changeset
   655
		{
hgs
parents:
diff changeset
   656
		newEntry.iDate = UniversalTimeFromHomeTime( aSm.iHomeTime );
hgs
parents:
diff changeset
   657
		}
hgs
parents:
diff changeset
   658
	else
hgs
parents:
diff changeset
   659
		{
hgs
parents:
diff changeset
   660
		newEntry.iDate.UniversalTime();
hgs
parents:
diff changeset
   661
		}	
hgs
parents:
diff changeset
   662
	
hgs
parents:
diff changeset
   663
	// ADDRESS INFORMATION
hgs
parents:
diff changeset
   664
	TMsvId parent = newEntry.Parent();
hgs
parents:
diff changeset
   665
	LOGGER_WRITE_1( "Parent is %d", parent );
hgs
parents:
diff changeset
   666
	
hgs
parents:
diff changeset
   667
	TBuf<KNameMaxLength> addrBookName;
hgs
parents:
diff changeset
   668
	
hgs
parents:
diff changeset
   669
	CSmsHeader& header = iMtm->SmsHeader();
hgs
parents:
diff changeset
   670
	
hgs
parents:
diff changeset
   671
	if (header.Type() == CSmsPDU::ESmsDeliver)
hgs
parents:
diff changeset
   672
		{
hgs
parents:
diff changeset
   673
		if (aSm.iSender.iName.Length() > 0)
hgs
parents:
diff changeset
   674
			{
hgs
parents:
diff changeset
   675
			newEntry.iDetails.Set( aSm.iSender.iName );
hgs
parents:
diff changeset
   676
			header.SetFromAddressL( aSm.iSender.iName );
hgs
parents:
diff changeset
   677
			}
hgs
parents:
diff changeset
   678
		else if (aSm.iSender.iNumber.Length() > 0)
hgs
parents:
diff changeset
   679
			{
hgs
parents:
diff changeset
   680
			FetchNameFromContactsL(aSm.iSender.iNumber, addrBookName);
hgs
parents:
diff changeset
   681
			if (addrBookName.Length() > 0)
hgs
parents:
diff changeset
   682
				{
hgs
parents:
diff changeset
   683
				newEntry.iDetails.Set( addrBookName );
hgs
parents:
diff changeset
   684
				header.SetFromAddressL( addrBookName );
hgs
parents:
diff changeset
   685
				}
hgs
parents:
diff changeset
   686
			else
hgs
parents:
diff changeset
   687
				{		
hgs
parents:
diff changeset
   688
				newEntry.iDetails.Set( aSm.iSender.iNumber );
hgs
parents:
diff changeset
   689
				header.SetFromAddressL( aSm.iSender.iNumber );
hgs
parents:
diff changeset
   690
				}
hgs
parents:
diff changeset
   691
			}
hgs
parents:
diff changeset
   692
		CSmsMessage& smsMsg = header.Message();
hgs
parents:
diff changeset
   693
		CSmsPDU& smsPdu = smsMsg.SmsPDU();
hgs
parents:
diff changeset
   694
		CSmsDeliver* smsDeliver = reinterpret_cast<CSmsDeliver*>( &smsPdu );	
hgs
parents:
diff changeset
   695
		smsDeliver->SetServiceCenterTimeStamp( newEntry.iDate );
hgs
parents:
diff changeset
   696
		}
hgs
parents:
diff changeset
   697
	else // message to be sent
hgs
parents:
diff changeset
   698
		{
hgs
parents:
diff changeset
   699
		if (!aNewSm)
hgs
parents:
diff changeset
   700
			{
hgs
parents:
diff changeset
   701
			const CMsvRecipientList& addrList = iMtm->AddresseeList();
hgs
parents:
diff changeset
   702
    		TInt numOldAddr = addrList.Count();		
hgs
parents:
diff changeset
   703
    		for (i = 0; i < numOldAddr; i++)
hgs
parents:
diff changeset
   704
    			{
hgs
parents:
diff changeset
   705
    			iMtm->RemoveAddressee( i );
hgs
parents:
diff changeset
   706
    			}	
hgs
parents:
diff changeset
   707
			}		
hgs
parents:
diff changeset
   708
		
hgs
parents:
diff changeset
   709
		TInt numRecipients = aSm.iRecipients.Count();
hgs
parents:
diff changeset
   710
		
hgs
parents:
diff changeset
   711
		if (numRecipients > 0)
hgs
parents:
diff changeset
   712
			{
hgs
parents:
diff changeset
   713
			if (aSm.iRecipients[0].iName.Length() > 0)
hgs
parents:
diff changeset
   714
				{
hgs
parents:
diff changeset
   715
				newEntry.iDetails.Set( aSm.iRecipients[0].iName );
hgs
parents:
diff changeset
   716
				}
hgs
parents:
diff changeset
   717
			else if (aSm.iRecipients[0].iNumber.Length() > 0)
hgs
parents:
diff changeset
   718
				{
hgs
parents:
diff changeset
   719
				FetchNameFromContactsL(aSm.iRecipients[0].iNumber, addrBookName);
hgs
parents:
diff changeset
   720
				if (addrBookName.Length() > 0)
hgs
parents:
diff changeset
   721
					{
hgs
parents:
diff changeset
   722
					newEntry.iDetails.Set( addrBookName );
hgs
parents:
diff changeset
   723
					}
hgs
parents:
diff changeset
   724
				else
hgs
parents:
diff changeset
   725
					{
hgs
parents:
diff changeset
   726
					newEntry.iDetails.Set( aSm.iRecipients[0].iNumber );
hgs
parents:
diff changeset
   727
					}	
hgs
parents:
diff changeset
   728
				}
hgs
parents:
diff changeset
   729
			}
hgs
parents:
diff changeset
   730
			
hgs
parents:
diff changeset
   731
		for (i = 0; i < numRecipients; i++)
hgs
parents:
diff changeset
   732
			{
hgs
parents:
diff changeset
   733
			if (aSm.iRecipients[i].iNumber.Length() > 0)
hgs
parents:
diff changeset
   734
				{
hgs
parents:
diff changeset
   735
				if (aSm.iRecipients[i].iName.Length() > 0)
hgs
parents:
diff changeset
   736
					{
hgs
parents:
diff changeset
   737
					iMtm->AddAddresseeL( aSm.iRecipients[i].iNumber, aSm.iRecipients[i].iName );
hgs
parents:
diff changeset
   738
					}
hgs
parents:
diff changeset
   739
				else
hgs
parents:
diff changeset
   740
					{
hgs
parents:
diff changeset
   741
					FetchNameFromContactsL( aSm.iRecipients[i].iNumber, addrBookName );
hgs
parents:
diff changeset
   742
					iMtm->AddAddresseeL( aSm.iRecipients[i].iNumber, addrBookName );
hgs
parents:
diff changeset
   743
					}	
hgs
parents:
diff changeset
   744
				}
hgs
parents:
diff changeset
   745
			} 			
hgs
parents:
diff changeset
   746
		} // else
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
	// MESSAGE BODY
hgs
parents:
diff changeset
   749
	LOGGER_WRITE( "Add message body" );
hgs
parents:
diff changeset
   750
	CRichText& mtmBody = iMtm->Body();
hgs
parents:
diff changeset
   751
	mtmBody.Reset();
hgs
parents:
diff changeset
   752
	aSm.LoadMessageBodyL( mtmBody );
hgs
parents:
diff changeset
   753
hgs
parents:
diff changeset
   754
    TBuf<KSmsDescriptionLength> description;
hgs
parents:
diff changeset
   755
	description.Zero();
hgs
parents:
diff changeset
   756
	if (aSm.iMessageBody)
hgs
parents:
diff changeset
   757
		{
hgs
parents:
diff changeset
   758
		TPtrC16 leftBody = aSm.iMessageBody->Left( KSmsDescriptionLength );	
hgs
parents:
diff changeset
   759
		description.Copy( leftBody );
hgs
parents:
diff changeset
   760
		
hgs
parents:
diff changeset
   761
		for (i = 0; i < description.Length(); i++)
hgs
parents:
diff changeset
   762
			{
hgs
parents:
diff changeset
   763
			if (description[i] == '\n' || description[i] == '\r')
hgs
parents:
diff changeset
   764
				{
hgs
parents:
diff changeset
   765
				description[i] = ' ';
hgs
parents:
diff changeset
   766
				}
hgs
parents:
diff changeset
   767
			}	
hgs
parents:
diff changeset
   768
		newEntry.iDescription.Set( description );
hgs
parents:
diff changeset
   769
		}
hgs
parents:
diff changeset
   770
		
hgs
parents:
diff changeset
   771
	newEntry.SetVisible( ETrue );
hgs
parents:
diff changeset
   772
    newEntry.SetComplete( ETrue );
hgs
parents:
diff changeset
   773
    newEntry.SetInPreparation( EFalse );    
hgs
parents:
diff changeset
   774
    newEntry.SetSendingState( KMsvSendStateUponRequest );		
hgs
parents:
diff changeset
   775
hgs
parents:
diff changeset
   776
	msvEntry.ChangeL( newEntry );
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
	LOGGER_WRITE( "Save message" );
hgs
parents:
diff changeset
   779
	iMtm->SaveMessageL(); 
hgs
parents:
diff changeset
   780
	
hgs
parents:
diff changeset
   781
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::DoUpdateSML" );		
hgs
parents:
diff changeset
   782
    }
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   785
// CSmsAdapterMsvApi::ValidUserFolder
hgs
parents:
diff changeset
   786
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   787
//
hgs
parents:
diff changeset
   788
TBool CSmsAdapterMsvApi::ValidFolderL( TMsvId aFolder, TBool aOutboxValid )
hgs
parents:
diff changeset
   789
    {
hgs
parents:
diff changeset
   790
    TBool valid(EFalse);
hgs
parents:
diff changeset
   791
    
hgs
parents:
diff changeset
   792
    switch ( aFolder )
hgs
parents:
diff changeset
   793
        {
hgs
parents:
diff changeset
   794
        case KMsvGlobalInBoxIndexEntryId:
hgs
parents:
diff changeset
   795
            valid = ETrue;  
hgs
parents:
diff changeset
   796
            break;
hgs
parents:
diff changeset
   797
        case KMsvDraftEntryId:
hgs
parents:
diff changeset
   798
           valid = ETrue;  
hgs
parents:
diff changeset
   799
           break;        
hgs
parents:
diff changeset
   800
        case KMsvSentEntryId:
hgs
parents:
diff changeset
   801
           valid = ETrue;  
hgs
parents:
diff changeset
   802
           break;
hgs
parents:
diff changeset
   803
        case KMsvGlobalOutBoxIndexEntryId:
hgs
parents:
diff changeset
   804
            if (aOutboxValid)
hgs
parents:
diff changeset
   805
                {
hgs
parents:
diff changeset
   806
                valid = ETrue;
hgs
parents:
diff changeset
   807
                }
hgs
parents:
diff changeset
   808
            break;
hgs
parents:
diff changeset
   809
        case KMsvMyFoldersEntryIdValue:
hgs
parents:
diff changeset
   810
           valid = ETrue;  
hgs
parents:
diff changeset
   811
           break;             
hgs
parents:
diff changeset
   812
        default:
hgs
parents:
diff changeset
   813
            valid = FindUserFolderL(aFolder);
hgs
parents:
diff changeset
   814
        }
hgs
parents:
diff changeset
   815
    
hgs
parents:
diff changeset
   816
    return valid;          
hgs
parents:
diff changeset
   817
    }
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   820
// CSmsAdapterMsvApi::FindUserFolderL
hgs
parents:
diff changeset
   821
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   822
//    
hgs
parents:
diff changeset
   823
TBool CSmsAdapterMsvApi::FindUserFolderL(TMsvId aFolder, TPtrC& aName, TTime& aDate)
hgs
parents:
diff changeset
   824
    {
hgs
parents:
diff changeset
   825
    TBool found(EFalse);
hgs
parents:
diff changeset
   826
    
hgs
parents:
diff changeset
   827
    CMsvEntry* entry = iSession->GetEntryL( KMsvMyFoldersEntryIdValue );
hgs
parents:
diff changeset
   828
    CleanupStack::PushL( entry );
hgs
parents:
diff changeset
   829
     
hgs
parents:
diff changeset
   830
    CMsvEntrySelection* selection = entry->ChildrenL();
hgs
parents:
diff changeset
   831
    CleanupStack::PushL( selection );
hgs
parents:
diff changeset
   832
    
hgs
parents:
diff changeset
   833
    TMsvId serviceId;
hgs
parents:
diff changeset
   834
    TMsvEntry entryT;
hgs
parents:
diff changeset
   835
hgs
parents:
diff changeset
   836
    for( TInt i = 0; i < selection->Count(); i++ )
hgs
parents:
diff changeset
   837
        {
hgs
parents:
diff changeset
   838
        User::LeaveIfError( iSession->GetEntry( selection->At( i ), serviceId, entryT ) );
hgs
parents:
diff changeset
   839
        
hgs
parents:
diff changeset
   840
        if ( !entryT.Deleted() && entryT.iType == KUidMsvFolderEntry && entryT.Id() == aFolder )
hgs
parents:
diff changeset
   841
            {
hgs
parents:
diff changeset
   842
            found = ETrue;
hgs
parents:
diff changeset
   843
            aDate = entryT.iDate;
hgs
parents:
diff changeset
   844
            aName.Set(entryT.iDetails);
hgs
parents:
diff changeset
   845
            break;
hgs
parents:
diff changeset
   846
            }
hgs
parents:
diff changeset
   847
        }
hgs
parents:
diff changeset
   848
    
hgs
parents:
diff changeset
   849
    CleanupStack::PopAndDestroy( 2 ); // entry, selection    
hgs
parents:
diff changeset
   850
    
hgs
parents:
diff changeset
   851
    return found;        
hgs
parents:
diff changeset
   852
    }
hgs
parents:
diff changeset
   853
    
hgs
parents:
diff changeset
   854
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   855
// CSmsAdapterMsvApi::FindUserFolderL
hgs
parents:
diff changeset
   856
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   857
//    
hgs
parents:
diff changeset
   858
TBool CSmsAdapterMsvApi::FindUserFolderL(TMsvId aFolder)
hgs
parents:
diff changeset
   859
    {
hgs
parents:
diff changeset
   860
    TPtrC name;
hgs
parents:
diff changeset
   861
    TTime time;
hgs
parents:
diff changeset
   862
    
hgs
parents:
diff changeset
   863
    return FindUserFolderL(aFolder, name, time); 
hgs
parents:
diff changeset
   864
    }    
hgs
parents:
diff changeset
   865
    
hgs
parents:
diff changeset
   866
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   867
// CSmsAdapterMsvApi::FindUserFolderL
hgs
parents:
diff changeset
   868
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   869
//    
hgs
parents:
diff changeset
   870
TBool CSmsAdapterMsvApi::FindUserFolderL(const TDesC& aName, TMsvId& aFolder)
hgs
parents:
diff changeset
   871
    {
hgs
parents:
diff changeset
   872
    CMsvEntry* entry = iSession->GetEntryL( KMsvMyFoldersEntryIdValue );
hgs
parents:
diff changeset
   873
    CleanupStack::PushL( entry );
hgs
parents:
diff changeset
   874
     
hgs
parents:
diff changeset
   875
    CMsvEntrySelection* selection = entry->ChildrenL();
hgs
parents:
diff changeset
   876
    CleanupStack::PushL( selection );
hgs
parents:
diff changeset
   877
    
hgs
parents:
diff changeset
   878
    TBool found(EFalse);
hgs
parents:
diff changeset
   879
    TMsvId serviceId;
hgs
parents:
diff changeset
   880
    TMsvEntry entryT;
hgs
parents:
diff changeset
   881
hgs
parents:
diff changeset
   882
    for( TInt i = 0; i < selection->Count(); i++ )
hgs
parents:
diff changeset
   883
        {
hgs
parents:
diff changeset
   884
        User::LeaveIfError( iSession->GetEntry( selection->At( i ), serviceId, entryT ) );
hgs
parents:
diff changeset
   885
        
hgs
parents:
diff changeset
   886
        if ( !entryT.Deleted() && entryT.iType == KUidMsvFolderEntry && 
hgs
parents:
diff changeset
   887
            aName.Compare(entryT.iDescription) == 0 )
hgs
parents:
diff changeset
   888
            {
hgs
parents:
diff changeset
   889
            found = ETrue;
hgs
parents:
diff changeset
   890
            aFolder = entryT.Id();
hgs
parents:
diff changeset
   891
            break;
hgs
parents:
diff changeset
   892
            }
hgs
parents:
diff changeset
   893
        }
hgs
parents:
diff changeset
   894
    
hgs
parents:
diff changeset
   895
    CleanupStack::PopAndDestroy( 2 ); // entry, selection    
hgs
parents:
diff changeset
   896
    
hgs
parents:
diff changeset
   897
    return found;           
hgs
parents:
diff changeset
   898
    }
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   901
// CSmsAdapterMsvApi::IsUnicode
hgs
parents:
diff changeset
   902
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   903
//
hgs
parents:
diff changeset
   904
TBool CSmsAdapterMsvApi::IsUnicode( const TUint16 aValue )
hgs
parents:
diff changeset
   905
    {
hgs
parents:
diff changeset
   906
	if ( aValue > 0x7F && KSmsNonUnicodeChars().Locate( aValue ) < 0 )
hgs
parents:
diff changeset
   907
		{
hgs
parents:
diff changeset
   908
		LOGGER_WRITE_1( "IsUnicode: Found UC char %d", aValue );
hgs
parents:
diff changeset
   909
		return ETrue;
hgs
parents:
diff changeset
   910
		}
hgs
parents:
diff changeset
   911
	else
hgs
parents:
diff changeset
   912
		{
hgs
parents:
diff changeset
   913
		return EFalse;
hgs
parents:
diff changeset
   914
		}
hgs
parents:
diff changeset
   915
    }
hgs
parents:
diff changeset
   916
hgs
parents:
diff changeset
   917
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   918
// CSmsAdapterMsvApi::MoveSML
hgs
parents:
diff changeset
   919
// Moves SM to another folder.
hgs
parents:
diff changeset
   920
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   921
void CSmsAdapterMsvApi::MoveSML( TMsvId aSmId, TMsvId aParentId )
hgs
parents:
diff changeset
   922
    {
hgs
parents:
diff changeset
   923
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::MoveSML starts" );
hgs
parents:
diff changeset
   924
    
hgs
parents:
diff changeset
   925
    if ( !ValidFolderL( aParentId ) )
hgs
parents:
diff changeset
   926
        {
hgs
parents:
diff changeset
   927
		LOGGER_WRITE( "MoveSML: wrong folder" );
hgs
parents:
diff changeset
   928
        User::Leave( KErrArgument );
hgs
parents:
diff changeset
   929
        }
hgs
parents:
diff changeset
   930
	
hgs
parents:
diff changeset
   931
	// Find the parent
hgs
parents:
diff changeset
   932
	CMsvEntry* clientEntry( NULL );
hgs
parents:
diff changeset
   933
	
hgs
parents:
diff changeset
   934
	// Find this entry and put it to cleanup stack
hgs
parents:
diff changeset
   935
	clientEntry = iSession->GetEntryL( aSmId );
hgs
parents:
diff changeset
   936
	CleanupStack::PushL( clientEntry );
hgs
parents:
diff changeset
   937
	
hgs
parents:
diff changeset
   938
	// Check that this is a SMS message
hgs
parents:
diff changeset
   939
	TMsvEntry entryT = clientEntry->Entry();
hgs
parents:
diff changeset
   940
	if (entryT.iType != KUidMsvMessageEntry || entryT.iMtm != KUidMsgTypeSMS)
hgs
parents:
diff changeset
   941
	    {
hgs
parents:
diff changeset
   942
	    LOGGER_WRITE( "MoveSML: wrong entry type" );
hgs
parents:
diff changeset
   943
	    User::Leave( KErrArgument );
hgs
parents:
diff changeset
   944
	    }
hgs
parents:
diff changeset
   945
   
hgs
parents:
diff changeset
   946
	// Find parent id, we'll be moving it's childs
hgs
parents:
diff changeset
   947
	TMsvId parentId = entryT.Parent();
hgs
parents:
diff changeset
   948
	
hgs
parents:
diff changeset
   949
	// Make sure that the parent has changed
hgs
parents:
diff changeset
   950
	if (parentId != aParentId)
hgs
parents:
diff changeset
   951
		{
hgs
parents:
diff changeset
   952
	    // Set parent as context
hgs
parents:
diff changeset
   953
	    clientEntry->SetEntryL( parentId );
hgs
parents:
diff changeset
   954
hgs
parents:
diff changeset
   955
		// Move the child item to another branch, use temporary waiter object
hgs
parents:
diff changeset
   956
		CMsvOperationActiveSchedulerWait* w = CMsvOperationActiveSchedulerWait::NewLC();
hgs
parents:
diff changeset
   957
		CMsvOperation* op = clientEntry->MoveL( aSmId, aParentId, w->iStatus );
hgs
parents:
diff changeset
   958
		w->Start();
hgs
parents:
diff changeset
   959
		SAFEDELETE( op );
hgs
parents:
diff changeset
   960
		CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   961
		
hgs
parents:
diff changeset
   962
		}
hgs
parents:
diff changeset
   963
	else
hgs
parents:
diff changeset
   964
		{
hgs
parents:
diff changeset
   965
		LOGGER_WRITE( "CSmsAdapterMsvApi::MoveSML, identical parents." );
hgs
parents:
diff changeset
   966
		}		  
hgs
parents:
diff changeset
   967
	
hgs
parents:
diff changeset
   968
 	CleanupStack::PopAndDestroy(); // entry
hgs
parents:
diff changeset
   969
 	
hgs
parents:
diff changeset
   970
 	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::MoveSML" );
hgs
parents:
diff changeset
   971
    }
hgs
parents:
diff changeset
   972
hgs
parents:
diff changeset
   973
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   974
// CSmsAdapterMsvApi::AddUserFolderL
hgs
parents:
diff changeset
   975
// Creates new user folder
hgs
parents:
diff changeset
   976
// -----------------------------------------------------------------------------        
hgs
parents:
diff changeset
   977
TInt CSmsAdapterMsvApi::AddUserFolderL( TMsvId& aFolder, const TDesC& aName )
hgs
parents:
diff changeset
   978
    {
hgs
parents:
diff changeset
   979
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::AddUserFolderL" );
hgs
parents:
diff changeset
   980
    LOG(aName);
hgs
parents:
diff changeset
   981
        
hgs
parents:
diff changeset
   982
    // Make sure that we are not going to add same folder twise
hgs
parents:
diff changeset
   983
    TBool found(EFalse);
hgs
parents:
diff changeset
   984
    found = FindUserFolderL(aName, aFolder);
hgs
parents:
diff changeset
   985
    if ( found )
hgs
parents:
diff changeset
   986
        {
hgs
parents:
diff changeset
   987
        LOGGER_WRITE( "Folder already exists" );
hgs
parents:
diff changeset
   988
        return KErrNone;
hgs
parents:
diff changeset
   989
        } 
hgs
parents:
diff changeset
   990
        
hgs
parents:
diff changeset
   991
    CMsvEntry* entry = iSession->GetEntryL(KMsvMyFoldersEntryIdValue);
hgs
parents:
diff changeset
   992
    CleanupStack::PushL( entry );
hgs
parents:
diff changeset
   993
    
hgs
parents:
diff changeset
   994
    TTime date;
hgs
parents:
diff changeset
   995
    date.UniversalTime();      
hgs
parents:
diff changeset
   996
    
hgs
parents:
diff changeset
   997
    TMsvEntry folderEntry;
hgs
parents:
diff changeset
   998
    folderEntry.iType = KUidMsvFolderEntry;
hgs
parents:
diff changeset
   999
    folderEntry.iMtm = KUidMsvLocalServiceMtm;
hgs
parents:
diff changeset
  1000
    folderEntry.iDetails.Set(aName);   
hgs
parents:
diff changeset
  1001
    folderEntry.iServiceId = KMsvLocalServiceIndexEntryIdValue;
hgs
parents:
diff changeset
  1002
    folderEntry.iSize = sizeof(folderEntry);
hgs
parents:
diff changeset
  1003
    folderEntry.iDate = date;
hgs
parents:
diff changeset
  1004
    folderEntry.SetStandardFolder(EFalse);
hgs
parents:
diff changeset
  1005
    folderEntry.SetVisible(ETrue);
hgs
parents:
diff changeset
  1006
    folderEntry.SetComplete(ETrue);
hgs
parents:
diff changeset
  1007
    folderEntry.SetInPreparation(EFalse); 
hgs
parents:
diff changeset
  1008
    folderEntry.SetReadOnly(EFalse);  
hgs
parents:
diff changeset
  1009
    
hgs
parents:
diff changeset
  1010
    entry->CreateL(folderEntry);
hgs
parents:
diff changeset
  1011
    CleanupStack::PopAndDestroy(entry);
hgs
parents:
diff changeset
  1012
    
hgs
parents:
diff changeset
  1013
    aFolder = folderEntry.Id();
hgs
parents:
diff changeset
  1014
    LOGGER_LEAVEFN( "CSmsAdapterMsvApi::AddUserFolderL" );
hgs
parents:
diff changeset
  1015
    return KErrNone;
hgs
parents:
diff changeset
  1016
    }
hgs
parents:
diff changeset
  1017
    
hgs
parents:
diff changeset
  1018
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1019
// CSmsAdapterMsvApi::UpdateUserFolderL
hgs
parents:
diff changeset
  1020
// Updates user folder (changes name)
hgs
parents:
diff changeset
  1021
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
  1022
TInt CSmsAdapterMsvApi::UpdateUserFolderL( TMsvId aFolder, const TDesC& aName )
hgs
parents:
diff changeset
  1023
    {
hgs
parents:
diff changeset
  1024
    LOGGER_ENTERFN( "CSmsAdapterMsvApi::UpdateUserFolderL" );
hgs
parents:
diff changeset
  1025
    LOG(aName);
hgs
parents:
diff changeset
  1026
    
hgs
parents:
diff changeset
  1027
    CMsvEntry* entry = iSession->GetEntryL( aFolder );
hgs
parents:
diff changeset
  1028
    CleanupStack::PushL( entry );
hgs
parents:
diff changeset
  1029
    
hgs
parents:
diff changeset
  1030
    TMsvEntry tEntry = entry->Entry();
hgs
parents:
diff changeset
  1031
    
hgs
parents:
diff changeset
  1032
    if ( tEntry.iType != KUidMsvFolderEntry )
hgs
parents:
diff changeset
  1033
        {
hgs
parents:
diff changeset
  1034
        CleanupStack::PopAndDestroy( entry );
hgs
parents:
diff changeset
  1035
        LOGGER_WRITE( "No message folder" );
hgs
parents:
diff changeset
  1036
        return KErrGeneral;
hgs
parents:
diff changeset
  1037
        }
hgs
parents:
diff changeset
  1038
       
hgs
parents:
diff changeset
  1039
    tEntry.iDetails.Set(aName);   
hgs
parents:
diff changeset
  1040
    tEntry.iDescription.Set(aName);
hgs
parents:
diff changeset
  1041
    
hgs
parents:
diff changeset
  1042
    entry->ChangeL(tEntry);
hgs
parents:
diff changeset
  1043
    
hgs
parents:
diff changeset
  1044
    CleanupStack::PopAndDestroy( entry );
hgs
parents:
diff changeset
  1045
    LOGGER_LEAVEFN( "CSmsAdapterMsvApi::UpdateUserFolderL" );
hgs
parents:
diff changeset
  1046
    return KErrNone;
hgs
parents:
diff changeset
  1047
    } 
hgs
parents:
diff changeset
  1048
hgs
parents:
diff changeset
  1049
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1050
// CSmsAdapterMsvApi::UniversalTimeFromHomeTime
hgs
parents:
diff changeset
  1051
// Converts local time to universal time.
hgs
parents:
diff changeset
  1052
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
  1053
TTime CSmsAdapterMsvApi::UniversalTimeFromHomeTime( TTime aTime )
hgs
parents:
diff changeset
  1054
	{	
hgs
parents:
diff changeset
  1055
	TLocale locale;
hgs
parents:
diff changeset
  1056
	locale.Refresh();
hgs
parents:
diff changeset
  1057
	
hgs
parents:
diff changeset
  1058
	TTimeIntervalSeconds universalTimeOffset = locale.UniversalTimeOffset();
hgs
parents:
diff changeset
  1059
	aTime -= universalTimeOffset;
hgs
parents:
diff changeset
  1060
	
hgs
parents:
diff changeset
  1061
	if (locale.QueryHomeHasDaylightSavingOn())
hgs
parents:
diff changeset
  1062
    	{
hgs
parents:
diff changeset
  1063
    	TTimeIntervalHours daylightSaving( 1 );
hgs
parents:
diff changeset
  1064
    	aTime -= daylightSaving;
hgs
parents:
diff changeset
  1065
    	}	
hgs
parents:
diff changeset
  1066
	
hgs
parents:
diff changeset
  1067
	return aTime;
hgs
parents:
diff changeset
  1068
	}
hgs
parents:
diff changeset
  1069
hgs
parents:
diff changeset
  1070
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1071
// CSmsAdapterMsvApi::HomeTimeFromUniversalTime
hgs
parents:
diff changeset
  1072
// Converts universal time to local time.
hgs
parents:
diff changeset
  1073
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
  1074
TTime CSmsAdapterMsvApi::HomeTimeFromUniversalTime( TTime aTime )
hgs
parents:
diff changeset
  1075
	{
hgs
parents:
diff changeset
  1076
	TLocale locale;
hgs
parents:
diff changeset
  1077
	locale.Refresh();
hgs
parents:
diff changeset
  1078
	
hgs
parents:
diff changeset
  1079
	TTimeIntervalSeconds universalTimeOffset = locale.UniversalTimeOffset();
hgs
parents:
diff changeset
  1080
	aTime += universalTimeOffset;
hgs
parents:
diff changeset
  1081
	
hgs
parents:
diff changeset
  1082
	if (locale.QueryHomeHasDaylightSavingOn())
hgs
parents:
diff changeset
  1083
    	{
hgs
parents:
diff changeset
  1084
    	TTimeIntervalHours daylightSaving( 1 );
hgs
parents:
diff changeset
  1085
    	aTime += daylightSaving;
hgs
parents:
diff changeset
  1086
    	}
hgs
parents:
diff changeset
  1087
	
hgs
parents:
diff changeset
  1088
	return aTime;
hgs
parents:
diff changeset
  1089
	}
hgs
parents:
diff changeset
  1090
	
hgs
parents:
diff changeset
  1091
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1092
// CSmsAdapterMsvApi::FetchNameFromContactsL
hgs
parents:
diff changeset
  1093
// Searches contact name of given number from phone book
hgs
parents:
diff changeset
  1094
// If not found, empty descriptor is returned.
hgs
parents:
diff changeset
  1095
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
  1096
void CSmsAdapterMsvApi::FetchNameFromContactsL(const TDesC& aNumber, TDes& aName)
hgs
parents:
diff changeset
  1097
	{
hgs
parents:
diff changeset
  1098
	LOGGER_ENTERFN( "CSmsAdapterMsvApi::FetchNameFromContactsL" );
hgs
parents:
diff changeset
  1099
	LOG(aNumber);
hgs
parents:
diff changeset
  1100
	
hgs
parents:
diff changeset
  1101
	aName.Zero(); 
hgs
parents:
diff changeset
  1102
	
hgs
parents:
diff changeset
  1103
	const TInt KNumDigitsToMatch(8);			
hgs
parents:
diff changeset
  1104
	CContactIdArray* contactIds = iContactsDb->MatchPhoneNumberL(aNumber, KNumDigitsToMatch);		
hgs
parents:
diff changeset
  1105
	if (contactIds->Count() != 1)
hgs
parents:
diff changeset
  1106
		{
hgs
parents:
diff changeset
  1107
		delete contactIds;
hgs
parents:
diff changeset
  1108
		return;
hgs
parents:
diff changeset
  1109
		}
hgs
parents:
diff changeset
  1110
	CleanupStack::PushL(contactIds);		
hgs
parents:
diff changeset
  1111
 
hgs
parents:
diff changeset
  1112
	CContactItem* item = iContactsDb->ReadContactLC((*contactIds)[0]);
hgs
parents:
diff changeset
  1113
	CContactItemFieldSet& fieldSet = item->CardFields();
hgs
parents:
diff changeset
  1114
		
hgs
parents:
diff changeset
  1115
	TPtrC familyName;
hgs
parents:
diff changeset
  1116
	TPtrC givenName;
hgs
parents:
diff changeset
  1117
	TInt pos;
hgs
parents:
diff changeset
  1118
	
hgs
parents:
diff changeset
  1119
	pos = fieldSet.Find(KUidContactFieldFamilyName);
hgs
parents:
diff changeset
  1120
	if (pos >= 0)
hgs
parents:
diff changeset
  1121
		{
hgs
parents:
diff changeset
  1122
		CContactItemField& itemField=fieldSet[pos];
hgs
parents:
diff changeset
  1123
		if (!(itemField.IsHidden()) && !(itemField.IsDisabled()))
hgs
parents:
diff changeset
  1124
			{
hgs
parents:
diff changeset
  1125
			CContactTextField* textField = itemField.TextStorage();
hgs
parents:
diff changeset
  1126
			familyName.Set(textField->Text());
hgs
parents:
diff changeset
  1127
			}				
hgs
parents:
diff changeset
  1128
		}
hgs
parents:
diff changeset
  1129
	pos = fieldSet.Find(KUidContactFieldGivenName);
hgs
parents:
diff changeset
  1130
	if (pos >= 0)
hgs
parents:
diff changeset
  1131
		{
hgs
parents:
diff changeset
  1132
		CContactItemField& itemField=fieldSet[pos];
hgs
parents:
diff changeset
  1133
		if (!(itemField.IsHidden()) && !(itemField.IsDisabled()))
hgs
parents:
diff changeset
  1134
			{
hgs
parents:
diff changeset
  1135
			CContactTextField* textField = itemField.TextStorage();
hgs
parents:
diff changeset
  1136
			givenName.Set(textField->Text());
hgs
parents:
diff changeset
  1137
			}				
hgs
parents:
diff changeset
  1138
		}	
hgs
parents:
diff changeset
  1139
	
hgs
parents:
diff changeset
  1140
	TInt spaceLeft = aName.MaxLength();
hgs
parents:
diff changeset
  1141
	
hgs
parents:
diff changeset
  1142
	if (familyName.Length() <= spaceLeft)
hgs
parents:
diff changeset
  1143
		{
hgs
parents:
diff changeset
  1144
		aName.Append(familyName);
hgs
parents:
diff changeset
  1145
		aName.Trim();
hgs
parents:
diff changeset
  1146
		spaceLeft -= aName.Length();
hgs
parents:
diff changeset
  1147
		}
hgs
parents:
diff changeset
  1148
		
hgs
parents:
diff changeset
  1149
	if ((givenName.Length() + 1) <= spaceLeft)
hgs
parents:
diff changeset
  1150
		{
hgs
parents:
diff changeset
  1151
		aName.Append(' ');
hgs
parents:
diff changeset
  1152
		aName.Append(givenName);
hgs
parents:
diff changeset
  1153
		aName.Trim();
hgs
parents:
diff changeset
  1154
		}
hgs
parents:
diff changeset
  1155
		
hgs
parents:
diff changeset
  1156
	LOG(aName);	
hgs
parents:
diff changeset
  1157
	
hgs
parents:
diff changeset
  1158
	CleanupStack::PopAndDestroy(2); // item, contactIds
hgs
parents:
diff changeset
  1159
	LOGGER_LEAVEFN( "CSmsAdapterMsvApi::FetchNameFromContactsL" );
hgs
parents:
diff changeset
  1160
	}
hgs
parents:
diff changeset
  1161
		
hgs
parents:
diff changeset
  1162
// End of file