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