omads/omadsextensions/adapters/sms/src/vmessageparser.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
/*
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 <e32std.h>
hgs
parents:
diff changeset
    21
#include <msvids.h>
hgs
parents:
diff changeset
    22
#include <txtrich.h>
hgs
parents:
diff changeset
    23
#include "vmessageparser.h"
hgs
parents:
diff changeset
    24
#include "logger.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
const TInt KVersionMaxLength = 4;
hgs
parents:
diff changeset
    28
const TInt KDateMaxLength = 48;
hgs
parents:
diff changeset
    29
const TInt KTagAndValueMaxLength = 48;
hgs
parents:
diff changeset
    30
const TInt KDefaultWriteBufSize = 1024;
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
// CVMessageParser* CVMessageParser::NewL()
hgs
parents:
diff changeset
    36
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    37
//
hgs
parents:
diff changeset
    38
CVMessageParser* CVMessageParser::NewL()
hgs
parents:
diff changeset
    39
	{
hgs
parents:
diff changeset
    40
	CVMessageParser* self = NewLC();
hgs
parents:
diff changeset
    41
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    42
    return self;
hgs
parents:
diff changeset
    43
	}
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
// CVMessageParser* CVMessageParser::NewLC()
hgs
parents:
diff changeset
    47
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
//
hgs
parents:
diff changeset
    49
CVMessageParser* CVMessageParser::NewLC()
hgs
parents:
diff changeset
    50
	{
hgs
parents:
diff changeset
    51
	CVMessageParser* self = new( ELeave ) CVMessageParser();
hgs
parents:
diff changeset
    52
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    53
    self->ConstructL();
hgs
parents:
diff changeset
    54
    return self;
hgs
parents:
diff changeset
    55
	}
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
// CVMessageParser::~CVMessageParser()
hgs
parents:
diff changeset
    59
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
CVMessageParser::~CVMessageParser()
hgs
parents:
diff changeset
    62
	{
hgs
parents:
diff changeset
    63
	iRecipients.Close();
hgs
parents:
diff changeset
    64
	delete iMessageBody;
hgs
parents:
diff changeset
    65
	iMessageBody = NULL;
hgs
parents:
diff changeset
    66
	}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
// CVMessageParser::CVMessageParser()
hgs
parents:
diff changeset
    70
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
//
hgs
parents:
diff changeset
    72
CVMessageParser::CVMessageParser()
hgs
parents:
diff changeset
    73
	{
hgs
parents:
diff changeset
    74
	}
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    77
// CVMessageParser::ConstructL()
hgs
parents:
diff changeset
    78
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
//
hgs
parents:
diff changeset
    80
void CVMessageParser::ConstructL()
hgs
parents:
diff changeset
    81
	{
hgs
parents:
diff changeset
    82
	}
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    85
// CVMessageParser::ReadMessage()
hgs
parents:
diff changeset
    86
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    87
//
hgs
parents:
diff changeset
    88
TInt CVMessageParser::ParseMessageL( const TDesC8& aVMessage )
hgs
parents:
diff changeset
    89
	{
hgs
parents:
diff changeset
    90
	LOGGER_ENTERFN( "CVMessageParser::ParseMessageL" );
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
	const TUint8* ptr8 = aVMessage.Ptr();	
hgs
parents:
diff changeset
    93
	const TUint16* ptr16 = reinterpret_cast<const TUint16*>( ptr8 );
hgs
parents:
diff changeset
    94
	iReadBuf.Set( ptr16, aVMessage.Length()/2 );
hgs
parents:
diff changeset
    95
	LOG(iReadBuf);	
hgs
parents:
diff changeset
    96
	
hgs
parents:
diff changeset
    97
	iReadBufPosition = 0;
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
	TInt err = ReadMessageHeader();
hgs
parents:
diff changeset
   100
	
hgs
parents:
diff changeset
   101
	if (err < 0)
hgs
parents:
diff changeset
   102
		{
hgs
parents:
diff changeset
   103
		LOGGER_WRITE_1( "ReadMessageHeader() failed with %d", err );
hgs
parents:
diff changeset
   104
		}
hgs
parents:
diff changeset
   105
	else
hgs
parents:
diff changeset
   106
		{
hgs
parents:
diff changeset
   107
		err = ReadMessageBodyL();
hgs
parents:
diff changeset
   108
		LOGGER_WRITE_1( "ReadMessageBody() result: %d", err );
hgs
parents:
diff changeset
   109
		}
hgs
parents:
diff changeset
   110
    LOGGER_LEAVEFN( "CVMessageParser::ParseMessageL" );
hgs
parents:
diff changeset
   111
	return err;
hgs
parents:
diff changeset
   112
	}
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   115
// CVMessageParser::ConstructMessageL()
hgs
parents:
diff changeset
   116
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   117
//
hgs
parents:
diff changeset
   118
void CVMessageParser::ConstructMessageL( CBufBase& aVMessage )
hgs
parents:
diff changeset
   119
	{
hgs
parents:
diff changeset
   120
	LOGGER_ENTERFN( "CVMessageParser::ConstructMessageL" );
hgs
parents:
diff changeset
   121
	LOGGER_WRITE_1( "Initial buffer size: %d", aVMessage.Size() );
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
	iWriteBuf = &aVMessage;
hgs
parents:
diff changeset
   124
	iWriteBufPosition = 0,
hgs
parents:
diff changeset
   125
	iWriteIndentLevel = 0;
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	iWriteBufSize = KDefaultWriteBufSize;
hgs
parents:
diff changeset
   128
	if (iMessageBody)
hgs
parents:
diff changeset
   129
		{
hgs
parents:
diff changeset
   130
		iWriteBufSize += iMessageBody->Size();
hgs
parents:
diff changeset
   131
		}
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
	iWriteBuf->ResizeL( iWriteBufSize );
hgs
parents:
diff changeset
   134
	LOGGER_WRITE_1( "Buffer size resized to %d", iWriteBuf->Size() );
hgs
parents:
diff changeset
   135
	
hgs
parents:
diff changeset
   136
	WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVMsg ); // BEGIN:VMSG
hgs
parents:
diff changeset
   137
	WriteMessagePropertiesL();
hgs
parents:
diff changeset
   138
	WriteMessageVCARDL( iSender.iName, iSender.iNumber );
hgs
parents:
diff changeset
   139
	WriteMessageEnvelopeL();
hgs
parents:
diff changeset
   140
	WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVMsg ); // END:VMSG
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
	iWriteBuf->ResizeL( iWriteBufPosition );
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
	LOGGER_WRITE_1( "Message length: %d", iWriteBufPosition );
hgs
parents:
diff changeset
   145
	LOGGER_LEAVEFN( "CVMessageParser::ConstructMessageL" );
hgs
parents:
diff changeset
   146
	}
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   149
// CVMessageParser::ResetAll()
hgs
parents:
diff changeset
   150
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   151
//
hgs
parents:
diff changeset
   152
void CVMessageParser::ResetAll()
hgs
parents:
diff changeset
   153
	{
hgs
parents:
diff changeset
   154
	// Public data 
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
	iHomeTime = 0;
hgs
parents:
diff changeset
   157
	iUniversalTime = 0;
hgs
parents:
diff changeset
   158
	iFolder.Zero();
hgs
parents:
diff changeset
   159
	iStatus.Zero();
hgs
parents:
diff changeset
   160
	iSender.iNumber.Zero();
hgs
parents:
diff changeset
   161
	iSender.iName.Zero();
hgs
parents:
diff changeset
   162
	iRecipients.Reset();
hgs
parents:
diff changeset
   163
	if (iMessageBody)
hgs
parents:
diff changeset
   164
		{
hgs
parents:
diff changeset
   165
		delete iMessageBody;
hgs
parents:
diff changeset
   166
		iMessageBody = NULL;
hgs
parents:
diff changeset
   167
		}
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
	// Private variables
hgs
parents:
diff changeset
   171
	iReadBufPosition = 0;
hgs
parents:
diff changeset
   172
	iWriteBufPosition = 0;
hgs
parents:
diff changeset
   173
	iWriteIndentLevel = 0;
hgs
parents:
diff changeset
   174
	iWriteBuf = NULL;
hgs
parents:
diff changeset
   175
	}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   178
// CVMessageParser::LoadMessageBodyL()
hgs
parents:
diff changeset
   179
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   180
//
hgs
parents:
diff changeset
   181
void CVMessageParser::LoadMessageBodyL( CRichText &aMsgBody )
hgs
parents:
diff changeset
   182
	{
hgs
parents:
diff changeset
   183
	if (iMessageBody)
hgs
parents:
diff changeset
   184
		{
hgs
parents:
diff changeset
   185
		aMsgBody.InsertL(0, *iMessageBody);
hgs
parents:
diff changeset
   186
		}
hgs
parents:
diff changeset
   187
	}
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   190
// CVMessageParser::StoreMessageBodyL()
hgs
parents:
diff changeset
   191
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   192
//
hgs
parents:
diff changeset
   193
void CVMessageParser::StoreMessageBodyL( CRichText &aMsgBody )
hgs
parents:
diff changeset
   194
	{
hgs
parents:
diff changeset
   195
	if (iMessageBody)
hgs
parents:
diff changeset
   196
		{
hgs
parents:
diff changeset
   197
		LOGGER_WRITE( "Message body not empty" );
hgs
parents:
diff changeset
   198
		User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   199
		}
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
	TInt bodyLenght =  aMsgBody.DocumentLength();
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
	if (bodyLenght > 0)
hgs
parents:
diff changeset
   204
		{
hgs
parents:
diff changeset
   205
		iMessageBody = HBufC::NewL( bodyLenght );
hgs
parents:
diff changeset
   206
		TPtr16 ptrBody = iMessageBody->Des();
hgs
parents:
diff changeset
   207
		aMsgBody.Extract( ptrBody );
hgs
parents:
diff changeset
   208
		}
hgs
parents:
diff changeset
   209
	}
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   212
// CVMessageParser::ParseTelephoneNumber()
hgs
parents:
diff changeset
   213
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   214
//
hgs
parents:
diff changeset
   215
TBool CVMessageParser::ParseTelephoneNumber( const TDesC &aNumberString, TTelephoneNumber &aNumberStore )
hgs
parents:
diff changeset
   216
	{
hgs
parents:
diff changeset
   217
	_LIT( KStartMarker, "<" );
hgs
parents:
diff changeset
   218
	_LIT( KEndMarker, ">" );
hgs
parents:
diff changeset
   219
    LOGGER_WRITE_1("aNumberString: %S", &aNumberString );
hgs
parents:
diff changeset
   220
	TInt startMarker = aNumberString.Find( KStartMarker );
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
	if (startMarker >= 0)
hgs
parents:
diff changeset
   223
		{
hgs
parents:
diff changeset
   224
		TInt endMarker = aNumberString.Find( KEndMarker );
hgs
parents:
diff changeset
   225
		if (endMarker <= (startMarker + 1))
hgs
parents:
diff changeset
   226
			{
hgs
parents:
diff changeset
   227
			LOGGER_WRITE( "Incorrect number" );
hgs
parents:
diff changeset
   228
			return EFalse;
hgs
parents:
diff changeset
   229
			}
hgs
parents:
diff changeset
   230
		else // case 1: Abc Pqr <+01234567890>
hgs
parents:
diff changeset
   231
			{
hgs
parents:
diff changeset
   232
			TPtrC16 name = aNumberString.Left( startMarker );
hgs
parents:
diff changeset
   233
			TPtrC16 number = aNumberString.Mid( (startMarker + 1), (endMarker - startMarker - 1) ); 
hgs
parents:
diff changeset
   234
			AssignDataToBuffer( name, aNumberStore.iName );
hgs
parents:
diff changeset
   235
			AssignDataToBuffer( number, aNumberStore.iNumber );
hgs
parents:
diff changeset
   236
			}
hgs
parents:
diff changeset
   237
		}
hgs
parents:
diff changeset
   238
	else // just number
hgs
parents:
diff changeset
   239
		{
hgs
parents:
diff changeset
   240
		AssignDataToBuffer( aNumberString, aNumberStore.iNumber );
hgs
parents:
diff changeset
   241
		aNumberStore.iName.Zero();
hgs
parents:
diff changeset
   242
		}
hgs
parents:
diff changeset
   243
    LOGGER_WRITE_1("aNumberStore.iName: %S", &aNumberStore.iName);
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
	return ETrue;
hgs
parents:
diff changeset
   246
	}
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   249
// CVMessageParser::ReadMessageHeader()
hgs
parents:
diff changeset
   250
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   251
//
hgs
parents:
diff changeset
   252
TInt CVMessageParser::ReadMessageHeader()
hgs
parents:
diff changeset
   253
	{
hgs
parents:
diff changeset
   254
	LOGGER_WRITE( "CVMessageParser::ReadMessageHeader()" );
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
	TInt err;
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
	err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVMsg );
hgs
parents:
diff changeset
   259
	if (err < 0)
hgs
parents:
diff changeset
   260
		{
hgs
parents:
diff changeset
   261
		return err;
hgs
parents:
diff changeset
   262
		}
hgs
parents:
diff changeset
   263
		
hgs
parents:
diff changeset
   264
	err = ReadTaggedTimeStamp( iUniversalTime );
hgs
parents:
diff changeset
   265
	if ( err == KErrNone )
hgs
parents:
diff changeset
   266
		{
hgs
parents:
diff changeset
   267
		LOGGER_WRITE( "Time stamp tag found, universal time set" );
hgs
parents:
diff changeset
   268
		}		
hgs
parents:
diff changeset
   269
				
hgs
parents:
diff changeset
   270
	err = GetMessageTagValue( KVMsgTagStatus, iStatus );
hgs
parents:
diff changeset
   271
	if (err < 0)
hgs
parents:
diff changeset
   272
		{
hgs
parents:
diff changeset
   273
		return err;
hgs
parents:
diff changeset
   274
		}		
hgs
parents:
diff changeset
   275
	err = GetMessageTagValue( KVMsgTagBox, iFolder );
hgs
parents:
diff changeset
   276
	if (err < 0)
hgs
parents:
diff changeset
   277
		{
hgs
parents:
diff changeset
   278
		return err;
hgs
parents:
diff changeset
   279
		}
hgs
parents:
diff changeset
   280
	err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVCard );
hgs
parents:
diff changeset
   281
	if (err < 0)
hgs
parents:
diff changeset
   282
		{
hgs
parents:
diff changeset
   283
		return err;
hgs
parents:
diff changeset
   284
		}
hgs
parents:
diff changeset
   285
	err = ReadVCard( iSender );
hgs
parents:
diff changeset
   286
	if (err < 0)
hgs
parents:
diff changeset
   287
		{
hgs
parents:
diff changeset
   288
		return err;
hgs
parents:
diff changeset
   289
		}
hgs
parents:
diff changeset
   290
	err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVEnv );
hgs
parents:
diff changeset
   291
	if (err < 0)
hgs
parents:
diff changeset
   292
		{
hgs
parents:
diff changeset
   293
		return err;
hgs
parents:
diff changeset
   294
		}
hgs
parents:
diff changeset
   295
	else
hgs
parents:
diff changeset
   296
		{
hgs
parents:
diff changeset
   297
		err = ReadEnvelope();
hgs
parents:
diff changeset
   298
		}
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
	return err;
hgs
parents:
diff changeset
   301
	}
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   304
// CVMessageParser::ReadEnvelope()
hgs
parents:
diff changeset
   305
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   306
//
hgs
parents:
diff changeset
   307
TInt CVMessageParser::ReadEnvelope()
hgs
parents:
diff changeset
   308
	{
hgs
parents:
diff changeset
   309
	TBuf<KTagAndValueMaxLength> tagValue;
hgs
parents:
diff changeset
   310
	TInt err( KErrNone );
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
	err = GetMessageTagValue( KVMsgTagBegin, tagValue );
hgs
parents:
diff changeset
   313
	if (err < 0)
hgs
parents:
diff changeset
   314
		{
hgs
parents:
diff changeset
   315
		return err;
hgs
parents:
diff changeset
   316
		}
hgs
parents:
diff changeset
   317
	else if (tagValue.Compare( KVMsgSectionVCard ) == 0)
hgs
parents:
diff changeset
   318
		{
hgs
parents:
diff changeset
   319
		TTelephoneNumber recipient;
hgs
parents:
diff changeset
   320
		err = ReadVCard( recipient );
hgs
parents:
diff changeset
   321
		if (err < 0)
hgs
parents:
diff changeset
   322
			{
hgs
parents:
diff changeset
   323
			return err;
hgs
parents:
diff changeset
   324
			}
hgs
parents:
diff changeset
   325
		else
hgs
parents:
diff changeset
   326
			{
hgs
parents:
diff changeset
   327
			if (recipient.iNumber.Length() > 0)
hgs
parents:
diff changeset
   328
			    {
64
hgs
parents: 40
diff changeset
   329
			    err = iRecipients.Append( recipient );
hgs
parents: 40
diff changeset
   330
			    if (err)
hgs
parents: 40
diff changeset
   331
			        {
hgs
parents: 40
diff changeset
   332
			        LOGGER_WRITE_1( "iRecipients.Append err: %d", err );
hgs
parents: 40
diff changeset
   333
			        return err;
hgs
parents: 40
diff changeset
   334
			        }
40
hgs
parents:
diff changeset
   335
			    }
hgs
parents:
diff changeset
   336
			    
hgs
parents:
diff changeset
   337
			err = FindMessageTagWithValue( KVMsgTagBegin, KVMsgSectionVEnv );
hgs
parents:
diff changeset
   338
			if (err >= 0)
hgs
parents:
diff changeset
   339
				{
hgs
parents:
diff changeset
   340
				err = ReadEnvelope();
hgs
parents:
diff changeset
   341
				}
hgs
parents:
diff changeset
   342
			}
hgs
parents:
diff changeset
   343
		}
hgs
parents:
diff changeset
   344
	else if (tagValue.Compare( KVMsgSectionVBody ) == 0)
hgs
parents:
diff changeset
   345
		{
hgs
parents:
diff changeset
   346
		err = KErrNone;
hgs
parents:
diff changeset
   347
		}
hgs
parents:
diff changeset
   348
	else
hgs
parents:
diff changeset
   349
		{
hgs
parents:
diff changeset
   350
		LOGGER_WRITE( "Unexpected message tag value" );
hgs
parents:
diff changeset
   351
		return KErrGeneral;
hgs
parents:
diff changeset
   352
		}
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
	return err;
hgs
parents:
diff changeset
   355
	}
hgs
parents:
diff changeset
   356
	
hgs
parents:
diff changeset
   357
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   358
// CVMessageParser::ReadTaggedTimestamp()
hgs
parents:
diff changeset
   359
// Read and parse tagged timestamp from vMessage (optional feature)
hgs
parents:
diff changeset
   360
// Format: X-NOK-DT:yyyymmddThhmmssZ (example: X-NOK-DT:20060329T091530Z)
hgs
parents:
diff changeset
   361
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   362
//	
hgs
parents:
diff changeset
   363
TInt CVMessageParser::ReadTaggedTimeStamp( TTime& aUniversalTime )
hgs
parents:
diff changeset
   364
	{
hgs
parents:
diff changeset
   365
	LOGGER_WRITE( "CVMessageParser::ReadTaggedTimestamp" );	
hgs
parents:
diff changeset
   366
	
hgs
parents:
diff changeset
   367
	TInt err( KErrNone );
hgs
parents:
diff changeset
   368
	TBuf<20> timeStamp;
hgs
parents:
diff changeset
   369
	
hgs
parents:
diff changeset
   370
	err = GetMessageTagValue( KVMsgTagDateTime, timeStamp, EFalse );
hgs
parents:
diff changeset
   371
	if ( err < 0 )
hgs
parents:
diff changeset
   372
		{
hgs
parents:
diff changeset
   373
		return KErrNotFound;
hgs
parents:
diff changeset
   374
		}
hgs
parents:
diff changeset
   375
	
hgs
parents:
diff changeset
   376
	LOG( timeStamp );
hgs
parents:
diff changeset
   377
	
hgs
parents:
diff changeset
   378
	if (timeStamp.Length() != 16 || timeStamp[8] != 'T' || timeStamp[15] != 'Z')
hgs
parents:
diff changeset
   379
		{
hgs
parents:
diff changeset
   380
		return KErrNotSupported;
hgs
parents:
diff changeset
   381
		}
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
	TLex lexYear( timeStamp.Mid( 0, 4 ) );
hgs
parents:
diff changeset
   384
	TLex lexMonth( timeStamp.Mid( 4, 2 ) );
hgs
parents:
diff changeset
   385
	TLex lexDay( timeStamp.Mid( 6, 2 ) );
hgs
parents:
diff changeset
   386
	TLex lexHour( timeStamp.Mid( 9, 2 ) );
hgs
parents:
diff changeset
   387
	TLex lexMinute( timeStamp.Mid( 11, 2 ) );
hgs
parents:
diff changeset
   388
	TLex lexSecond( timeStamp.Mid( 13, 2 ) );		
hgs
parents:
diff changeset
   389
	
hgs
parents:
diff changeset
   390
	TInt valYear( 0 );
hgs
parents:
diff changeset
   391
	TInt valMonth( 0 );
hgs
parents:
diff changeset
   392
	TInt valDay( 0 );
hgs
parents:
diff changeset
   393
	TInt valHour( 0 );
hgs
parents:
diff changeset
   394
	TInt valMinute( 0 );
hgs
parents:
diff changeset
   395
	TInt valSecond( 0 );
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
	TBool parseDone( EFalse );		
hgs
parents:
diff changeset
   398
	if ( lexYear.Val( valYear ) == KErrNone )
hgs
parents:
diff changeset
   399
		{
hgs
parents:
diff changeset
   400
		if ( lexMonth.Val( valMonth ) == KErrNone )
hgs
parents:
diff changeset
   401
			{
hgs
parents:
diff changeset
   402
			if ( lexDay.Val( valDay ) == KErrNone )
hgs
parents:
diff changeset
   403
				{
hgs
parents:
diff changeset
   404
				if ( lexHour.Val( valHour ) == KErrNone )
hgs
parents:
diff changeset
   405
					{
hgs
parents:
diff changeset
   406
					if ( lexMinute.Val( valMinute ) == KErrNone )
hgs
parents:
diff changeset
   407
						{
hgs
parents:
diff changeset
   408
						if ( lexSecond.Val( valSecond ) == KErrNone )
hgs
parents:
diff changeset
   409
							{
hgs
parents:
diff changeset
   410
							parseDone = ETrue;
hgs
parents:
diff changeset
   411
							}
hgs
parents:
diff changeset
   412
						}
hgs
parents:
diff changeset
   413
					}
hgs
parents:
diff changeset
   414
				}
hgs
parents:
diff changeset
   415
			}		
hgs
parents:
diff changeset
   416
		}
hgs
parents:
diff changeset
   417
	if ( !parseDone )
hgs
parents:
diff changeset
   418
		{
hgs
parents:
diff changeset
   419
		return KErrNotSupported;
hgs
parents:
diff changeset
   420
		}
hgs
parents:
diff changeset
   421
		
hgs
parents:
diff changeset
   422
	TDateTime dateTime;
hgs
parents:
diff changeset
   423
	TMonth month = static_cast<TMonth>(--valMonth);
hgs
parents:
diff changeset
   424
	err = dateTime.Set( valYear, month, --valDay, valHour, valMinute, valSecond, 0 );	
hgs
parents:
diff changeset
   425
	if ( err != KErrNone )
hgs
parents:
diff changeset
   426
		{
hgs
parents:
diff changeset
   427
		return KErrNotSupported;
hgs
parents:
diff changeset
   428
		}
hgs
parents:
diff changeset
   429
		
hgs
parents:
diff changeset
   430
	aUniversalTime = dateTime;	
hgs
parents:
diff changeset
   431
	
hgs
parents:
diff changeset
   432
	return KErrNone; 	
hgs
parents:
diff changeset
   433
	}		
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   436
// CVMessageParser::ReadVCard()
hgs
parents:
diff changeset
   437
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   438
//
hgs
parents:
diff changeset
   439
TInt CVMessageParser::ReadVCard( TTelephoneNumber &aResult )
hgs
parents:
diff changeset
   440
	{		
hgs
parents:
diff changeset
   441
	TInt err = KErrNone;
hgs
parents:
diff changeset
   442
	TBuf<KVersionMaxLength> version;
hgs
parents:
diff changeset
   443
hgs
parents:
diff changeset
   444
	err = GetMessageTagValue( KVMsgTagVersion, version );
hgs
parents:
diff changeset
   445
	if (err < 0)
hgs
parents:
diff changeset
   446
		{
hgs
parents:
diff changeset
   447
		return err;
hgs
parents:
diff changeset
   448
		}
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
	err = GetMessageTagValue( KVMsgTagName, aResult.iName );
hgs
parents:
diff changeset
   451
	if (err < 0)
hgs
parents:
diff changeset
   452
		{
hgs
parents:
diff changeset
   453
		return err;
hgs
parents:
diff changeset
   454
		}
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
	err = GetMessageTagValue( KVMsgTagTelephone, aResult.iNumber );
hgs
parents:
diff changeset
   457
	if (err < 0)
hgs
parents:
diff changeset
   458
		{
hgs
parents:
diff changeset
   459
		return err;
hgs
parents:
diff changeset
   460
		}
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
	err = FindMessageTagWithValue( KVMsgTagEnd, KVMsgSectionVCard );
hgs
parents:
diff changeset
   463
	if (err < 0)
hgs
parents:
diff changeset
   464
		{
hgs
parents:
diff changeset
   465
		return err;
hgs
parents:
diff changeset
   466
		}
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
	return KErrNone;
hgs
parents:
diff changeset
   469
	}
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   472
// CVMessageParser::ReadMessageBody()
hgs
parents:
diff changeset
   473
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   474
//
hgs
parents:
diff changeset
   475
TInt CVMessageParser::ReadMessageBodyL()
hgs
parents:
diff changeset
   476
	{
hgs
parents:
diff changeset
   477
	LOGGER_WRITE( "CVMessageParser::ReadMessageBody()" );
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
	TInt err;
hgs
parents:
diff changeset
   480
	
hgs
parents:
diff changeset
   481
	TPtrC pBuf = iReadBuf.Mid( iReadBufPosition );
hgs
parents:
diff changeset
   482
	err = pBuf.Find( KVMsgLineFeed );
hgs
parents:
diff changeset
   483
	if (err < 0)
hgs
parents:
diff changeset
   484
		{
hgs
parents:
diff changeset
   485
		return err;
hgs
parents:
diff changeset
   486
		}
hgs
parents:
diff changeset
   487
	
hgs
parents:
diff changeset
   488
	iReadBufPosition += ( err + KVMsgLineFeed().Length() );
hgs
parents:
diff changeset
   489
	TInt bodyStart = iReadBufPosition;
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
	TBuf<KDateMaxLength> dateBuf;
hgs
parents:
diff changeset
   492
	err = GetMessageTagValue(KVMsgTagDate, dateBuf);
hgs
parents:
diff changeset
   493
	if (err < 0)
hgs
parents:
diff changeset
   494
		{
hgs
parents:
diff changeset
   495
		LOGGER_WRITE( "No date field in message body" );
hgs
parents:
diff changeset
   496
		iReadBufPosition = bodyStart;
hgs
parents:
diff changeset
   497
		}
hgs
parents:
diff changeset
   498
	else
hgs
parents:
diff changeset
   499
		{
hgs
parents:
diff changeset
   500
		for (TInt i = 0; i < dateBuf.Length(); i++)
hgs
parents:
diff changeset
   501
			{
hgs
parents:
diff changeset
   502
			// This is needed, because TTime::Parse() can not handle
hgs
parents:
diff changeset
   503
			// situation where '.' character is used as a delimiter in date.
hgs
parents:
diff changeset
   504
			// Expected date format is like 18.1.2005 17:32:50.
hgs
parents:
diff changeset
   505
			//
hgs
parents:
diff changeset
   506
			if (dateBuf[i] == ' ')
hgs
parents:
diff changeset
   507
				{
hgs
parents:
diff changeset
   508
				break;
hgs
parents:
diff changeset
   509
				}
hgs
parents:
diff changeset
   510
			else if (dateBuf[i] == '.')
hgs
parents:
diff changeset
   511
				{
hgs
parents:
diff changeset
   512
				dateBuf[i] = '/';
hgs
parents:
diff changeset
   513
				}
hgs
parents:
diff changeset
   514
			}
hgs
parents:
diff changeset
   515
		
hgs
parents:
diff changeset
   516
        TLocale locale;
hgs
parents:
diff changeset
   517
        TDateFormat originalFormat = locale.DateFormat();
hgs
parents:
diff changeset
   518
        locale.SetDateFormat( EDateEuropean );
hgs
parents:
diff changeset
   519
        locale.Set(); // transfer the new locale settings to the system
hgs
parents:
diff changeset
   520
        
hgs
parents:
diff changeset
   521
		err = iHomeTime.Parse( dateBuf );
hgs
parents:
diff changeset
   522
		if ( err < 0 )
hgs
parents:
diff changeset
   523
			{
hgs
parents:
diff changeset
   524
			LOGGER_WRITE_1( "Parsing date from message body failed with %d", err );
hgs
parents:
diff changeset
   525
			iHomeTime = 0;
hgs
parents:
diff changeset
   526
			}
hgs
parents:
diff changeset
   527
		locale.SetDateFormat( originalFormat );
hgs
parents:
diff changeset
   528
		locale.Set(); // transfer the original locale settings back to the system
hgs
parents:
diff changeset
   529
hgs
parents:
diff changeset
   530
		TPtrC pDateStart = iReadBuf.Mid( iReadBufPosition );
hgs
parents:
diff changeset
   531
		err = pDateStart.Find( KVMsgLineFeed );
hgs
parents:
diff changeset
   532
		if (err < 0)
hgs
parents:
diff changeset
   533
			{
hgs
parents:
diff changeset
   534
			return err;
hgs
parents:
diff changeset
   535
			}
hgs
parents:
diff changeset
   536
		iReadBufPosition += ( err + KVMsgLineFeed().Length() );
hgs
parents:
diff changeset
   537
		bodyStart = iReadBufPosition;
hgs
parents:
diff changeset
   538
		}
hgs
parents:
diff changeset
   539
hgs
parents:
diff changeset
   540
	err = FindMessageTagWithValue( KVMsgTagEnd, KVMsgSectionVBody );
hgs
parents:
diff changeset
   541
	if (err < 0)
hgs
parents:
diff changeset
   542
		{
hgs
parents:
diff changeset
   543
		return err;
hgs
parents:
diff changeset
   544
		}
hgs
parents:
diff changeset
   545
	else
hgs
parents:
diff changeset
   546
		{
hgs
parents:
diff changeset
   547
		TInt bodyLength = err - bodyStart;
hgs
parents:
diff changeset
   548
		iMessageBody = HBufC::NewL( bodyLength );
hgs
parents:
diff changeset
   549
		TPtrC pData = iReadBuf.Mid( bodyStart, bodyLength );
hgs
parents:
diff changeset
   550
		TPtr pMsgBody = iMessageBody->Des();
hgs
parents:
diff changeset
   551
		pMsgBody.Copy( pData );
hgs
parents:
diff changeset
   552
		pMsgBody.Trim();
hgs
parents:
diff changeset
   553
		err = pMsgBody.Length();
hgs
parents:
diff changeset
   554
		LOG( pMsgBody );
hgs
parents:
diff changeset
   555
		}
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
	return err;
hgs
parents:
diff changeset
   558
	}
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   561
// CVMessageParser::FindMessageTagWithValue()
hgs
parents:
diff changeset
   562
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   563
//
hgs
parents:
diff changeset
   564
TInt CVMessageParser::FindMessageTagWithValue( const TDesC& aMsgTag, const TDesC& aValue )
hgs
parents:
diff changeset
   565
	{
hgs
parents:
diff changeset
   566
	TBuf<KTagAndValueMaxLength> tagAndValue( aMsgTag );
hgs
parents:
diff changeset
   567
	tagAndValue.Append( aValue );
hgs
parents:
diff changeset
   568
hgs
parents:
diff changeset
   569
	TPtrC pBuf = iReadBuf.Mid( iReadBufPosition );
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
	TInt err;
hgs
parents:
diff changeset
   572
	TInt tagStartPosition;
hgs
parents:
diff changeset
   573
		
hgs
parents:
diff changeset
   574
	err = pBuf.Find( tagAndValue );
hgs
parents:
diff changeset
   575
	if (err < 0)
hgs
parents:
diff changeset
   576
		{
hgs
parents:
diff changeset
   577
		LOGGER_WRITE( "Message tag with value not found" );
hgs
parents:
diff changeset
   578
		return err;
hgs
parents:
diff changeset
   579
		}
hgs
parents:
diff changeset
   580
	else 
hgs
parents:
diff changeset
   581
		{
hgs
parents:
diff changeset
   582
		tagStartPosition = iReadBufPosition + err; // position before tag and value
hgs
parents:
diff changeset
   583
		iReadBufPosition += ( err + tagAndValue.Length() ); // position after tag and value
hgs
parents:
diff changeset
   584
		}
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
	return tagStartPosition; 
hgs
parents:
diff changeset
   587
	}
hgs
parents:
diff changeset
   588
hgs
parents:
diff changeset
   589
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   590
// CVMessageParser::GetMessageTagValue()
hgs
parents:
diff changeset
   591
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   592
//
hgs
parents:
diff changeset
   593
TInt CVMessageParser::GetMessageTagValue( const TDesC& aMsgTag, TDes& aValue, TBool aMoveReadBufPosition )
hgs
parents:
diff changeset
   594
	{
hgs
parents:
diff changeset
   595
	TInt err;
hgs
parents:
diff changeset
   596
	TInt valueLength;
hgs
parents:
diff changeset
   597
	TInt readBufPosition( iReadBufPosition );
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
	TPtrC pBuf = iReadBuf.Mid( readBufPosition );
hgs
parents:
diff changeset
   600
	
hgs
parents:
diff changeset
   601
	err = pBuf.Find( aMsgTag );
hgs
parents:
diff changeset
   602
	if (err < 0)
hgs
parents:
diff changeset
   603
		{	
hgs
parents:
diff changeset
   604
		LOGGER_WRITE( "Message tag not found" );
hgs
parents:
diff changeset
   605
		return err; 
hgs
parents:
diff changeset
   606
		}
hgs
parents:
diff changeset
   607
	else
hgs
parents:
diff changeset
   608
		{
hgs
parents:
diff changeset
   609
		readBufPosition += (err + aMsgTag.Length());
hgs
parents:
diff changeset
   610
		}
hgs
parents:
diff changeset
   611
hgs
parents:
diff changeset
   612
	TPtrC pValueStart = iReadBuf.Mid( readBufPosition ); 
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
	err = pValueStart.Find( KVMsgLineFeed );
hgs
parents:
diff changeset
   615
	if (err < 0)
hgs
parents:
diff changeset
   616
		{
hgs
parents:
diff changeset
   617
		return err; 
hgs
parents:
diff changeset
   618
		}
hgs
parents:
diff changeset
   619
	else
hgs
parents:
diff changeset
   620
		{
hgs
parents:
diff changeset
   621
		valueLength = err;
hgs
parents:
diff changeset
   622
		}
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
	StoreMessageDataField( readBufPosition, valueLength, aValue );
hgs
parents:
diff changeset
   625
	
hgs
parents:
diff changeset
   626
	if ( aMoveReadBufPosition )
hgs
parents:
diff changeset
   627
		{
hgs
parents:
diff changeset
   628
		iReadBufPosition = readBufPosition;
hgs
parents:
diff changeset
   629
		}
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
	return valueLength;
hgs
parents:
diff changeset
   632
	}
hgs
parents:
diff changeset
   633
	
hgs
parents:
diff changeset
   634
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   635
// CVMessageParser::StoreMessageDataField()
hgs
parents:
diff changeset
   636
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   637
//
hgs
parents:
diff changeset
   638
void CVMessageParser::StoreMessageDataField(TInt aStart, TInt aLength, TDes &aLocalStore)
hgs
parents:
diff changeset
   639
	{
hgs
parents:
diff changeset
   640
	TInt copyLength;
hgs
parents:
diff changeset
   641
hgs
parents:
diff changeset
   642
	copyLength = aLength > aLocalStore.MaxLength() ? aLocalStore.MaxLength() : aLength;
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
	TPtrC pData = iReadBuf.Mid( aStart, copyLength );
hgs
parents:
diff changeset
   645
	aLocalStore.Copy( pData );
hgs
parents:
diff changeset
   646
	aLocalStore.Trim();
hgs
parents:
diff changeset
   647
hgs
parents:
diff changeset
   648
	if (copyLength < aLength)
hgs
parents:
diff changeset
   649
		{
hgs
parents:
diff changeset
   650
		LOGGER_WRITE_2( "Data length: %d, stored: %d", aLength, copyLength );	
hgs
parents:
diff changeset
   651
		}
hgs
parents:
diff changeset
   652
	}
hgs
parents:
diff changeset
   653
hgs
parents:
diff changeset
   654
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   655
// CVMessageParser::WriteMessagePropertiesL()
hgs
parents:
diff changeset
   656
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   657
//
hgs
parents:
diff changeset
   658
void CVMessageParser::WriteMessagePropertiesL()
hgs
parents:
diff changeset
   659
	{
hgs
parents:
diff changeset
   660
	LOGGER_WRITE( "CVMessageParser::WriteMessagePropertiesL()" );
hgs
parents:
diff changeset
   661
	WriteMessageLineL( KVMsgTagVersion, KVMsgVersion );
hgs
parents:
diff changeset
   662
	WriteMessageLineL( KVMsgTagStatus, iStatus );
hgs
parents:
diff changeset
   663
	WriteMessageLineL( KVMsgTagBox, iFolder );
hgs
parents:
diff changeset
   664
	WriteTaggedTimestampL( iUniversalTime );
hgs
parents:
diff changeset
   665
	}
hgs
parents:
diff changeset
   666
hgs
parents:
diff changeset
   667
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   668
// CVMessageParser::WriteMessageVCARDL()
hgs
parents:
diff changeset
   669
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   670
//
hgs
parents:
diff changeset
   671
void CVMessageParser::WriteMessageVCARDL(const TDesC& aName, const TDesC& aNumber)
hgs
parents:
diff changeset
   672
	{
hgs
parents:
diff changeset
   673
	LOGGER_WRITE( "CVMessageParser::WriteMessageVCARDL()" );
hgs
parents:
diff changeset
   674
	WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVCard );
hgs
parents:
diff changeset
   675
	WriteMessageLineL( KVMsgTagVersion, KVMsgVCardVersion );
hgs
parents:
diff changeset
   676
	WriteMessageLineL( KVMsgTagName, aName );
hgs
parents:
diff changeset
   677
	WriteMessageLineL( KVMsgTagTelephone, aNumber );
hgs
parents:
diff changeset
   678
	WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVCard );
hgs
parents:
diff changeset
   679
	}
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   682
// CVMessageParser::WriteMessageEnvelopeL()
hgs
parents:
diff changeset
   683
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   684
//
hgs
parents:
diff changeset
   685
void CVMessageParser::WriteMessageEnvelopeL()
hgs
parents:
diff changeset
   686
	{
hgs
parents:
diff changeset
   687
	LOGGER_WRITE( "CVMessageParser::WriteMessageEnvelopeL()" );
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
	TInt i;
hgs
parents:
diff changeset
   690
	TInt numRecipients = iRecipients.Count();
hgs
parents:
diff changeset
   691
hgs
parents:
diff changeset
   692
	for (i = 0; i < numRecipients; i++)
hgs
parents:
diff changeset
   693
		{
hgs
parents:
diff changeset
   694
		WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVEnv );
hgs
parents:
diff changeset
   695
		WriteMessageVCARDL( iRecipients[i].iName, iRecipients[i].iNumber );		
hgs
parents:
diff changeset
   696
		}
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
	WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVEnv );
hgs
parents:
diff changeset
   699
	WriteMessageBodyL();
hgs
parents:
diff changeset
   700
	WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVEnv );
hgs
parents:
diff changeset
   701
hgs
parents:
diff changeset
   702
	for (i = 0; i < numRecipients; i++)
hgs
parents:
diff changeset
   703
		{
hgs
parents:
diff changeset
   704
		WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVEnv );	
hgs
parents:
diff changeset
   705
		}	
hgs
parents:
diff changeset
   706
	}
hgs
parents:
diff changeset
   707
hgs
parents:
diff changeset
   708
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   709
// CVMessageParser::WriteTaggedTimestampL()
hgs
parents:
diff changeset
   710
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   711
//	
hgs
parents:
diff changeset
   712
void CVMessageParser::WriteTaggedTimestampL( TTime aUniversalTime )
hgs
parents:
diff changeset
   713
	{
hgs
parents:
diff changeset
   714
	LOGGER_WRITE( "CVMessageParser::WriteTaggedTimestamp()" );
hgs
parents:
diff changeset
   715
	
hgs
parents:
diff changeset
   716
	TDateTime dateTime = aUniversalTime.DateTime();
hgs
parents:
diff changeset
   717
	
hgs
parents:
diff changeset
   718
	TBuf<16> timestamp;
hgs
parents:
diff changeset
   719
	
hgs
parents:
diff changeset
   720
	// Default timesamp format: yyyymmddThhmmssZ - like 20060329T091530Z	
hgs
parents:
diff changeset
   721
	_LIT( KTimestampFormat, "%+04d%+02d%+02dT%+02d%+02d%+02dZ" );
hgs
parents:
diff changeset
   722
	timestamp.Format( KTimestampFormat, 
hgs
parents:
diff changeset
   723
		dateTime.Year(),
hgs
parents:
diff changeset
   724
		dateTime.Month() + 1,
hgs
parents:
diff changeset
   725
		dateTime.Day() + 1,
hgs
parents:
diff changeset
   726
		dateTime.Hour(),
hgs
parents:
diff changeset
   727
		dateTime.Minute(),
hgs
parents:
diff changeset
   728
		dateTime.Second() );
hgs
parents:
diff changeset
   729
		
hgs
parents:
diff changeset
   730
	WriteMessageLineL( KVMsgTagDateTime, timestamp );	
hgs
parents:
diff changeset
   731
	}
hgs
parents:
diff changeset
   732
hgs
parents:
diff changeset
   733
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   734
// CVMessageParser::WriteMessageBodyL()
hgs
parents:
diff changeset
   735
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   736
//
hgs
parents:
diff changeset
   737
void CVMessageParser::WriteMessageBodyL()
hgs
parents:
diff changeset
   738
	{
hgs
parents:
diff changeset
   739
	LOGGER_WRITE( "CVMessageParser::WriteMessageBodyL()" );
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
	WriteMessageLineL( KVMsgTagBegin, KVMsgSectionVBody );
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
    // "Date" field is always device local time, not UTC
hgs
parents:
diff changeset
   744
	TBuf<KDateMaxLength> dateStr;
hgs
parents:
diff changeset
   745
	_LIT( KDateFormat, "%F%*D.%*M.%Y% %H:%T:%S" );
hgs
parents:
diff changeset
   746
	iHomeTime.FormatL( dateStr, KDateFormat );
hgs
parents:
diff changeset
   747
	WriteMessageLineL(KVMsgTagDate, dateStr );
hgs
parents:
diff changeset
   748
hgs
parents:
diff changeset
   749
	if (iMessageBody)
hgs
parents:
diff changeset
   750
		{
hgs
parents:
diff changeset
   751
		LOG(*iMessageBody);
hgs
parents:
diff changeset
   752
		WriteMessageLineL( KDesNoData, *iMessageBody, EFalse );
hgs
parents:
diff changeset
   753
		}
hgs
parents:
diff changeset
   754
	else
hgs
parents:
diff changeset
   755
		{
hgs
parents:
diff changeset
   756
		LOGGER_WRITE( "Message body empty" );
hgs
parents:
diff changeset
   757
		}
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
	WriteMessageLineL( KVMsgTagEnd, KVMsgSectionVBody );
hgs
parents:
diff changeset
   760
	}
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   763
// CVMessageParser::WriteMessageLineL()
hgs
parents:
diff changeset
   764
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   765
//
hgs
parents:
diff changeset
   766
void CVMessageParser::WriteMessageLineL( const TDesC& aMsgLineTag, const TDesC& aMsgLineData, TBool aIndent )
hgs
parents:
diff changeset
   767
	{
hgs
parents:
diff changeset
   768
	if (aIndent)
hgs
parents:
diff changeset
   769
		{
hgs
parents:
diff changeset
   770
		TInt indent = GetIndentLevel( aMsgLineTag );
hgs
parents:
diff changeset
   771
		TBuf<KTagAndValueMaxLength> indentSpace;
hgs
parents:
diff changeset
   772
		indentSpace.AppendFill( TChar(' '), indent );
hgs
parents:
diff changeset
   773
		WriteToMessageL( indentSpace );
hgs
parents:
diff changeset
   774
		}
hgs
parents:
diff changeset
   775
hgs
parents:
diff changeset
   776
	if (aMsgLineTag.Length() > 0)
hgs
parents:
diff changeset
   777
		{
hgs
parents:
diff changeset
   778
		WriteToMessageL( aMsgLineTag );
hgs
parents:
diff changeset
   779
		}
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
	WriteToMessageL( aMsgLineData );	
hgs
parents:
diff changeset
   782
	WriteToMessageL( KVMsgLineFeed );
hgs
parents:
diff changeset
   783
	}
hgs
parents:
diff changeset
   784
hgs
parents:
diff changeset
   785
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   786
// CVMessageParser::WriteToMessageL()
hgs
parents:
diff changeset
   787
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   788
//
hgs
parents:
diff changeset
   789
void CVMessageParser::WriteToMessageL( const TDesC &aData )
hgs
parents:
diff changeset
   790
	{
hgs
parents:
diff changeset
   791
	TPtrC8 writeData;
hgs
parents:
diff changeset
   792
hgs
parents:
diff changeset
   793
	const TUint16* ptr16 = aData.Ptr();
hgs
parents:
diff changeset
   794
	const TUint8* ptr8 = reinterpret_cast<const TUint8*>(ptr16);
hgs
parents:
diff changeset
   795
	writeData.Set( ptr8, aData.Length()*2 );
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
	TInt newPosition = iWriteBufPosition + writeData.Length();
hgs
parents:
diff changeset
   798
hgs
parents:
diff changeset
   799
	if (newPosition > iWriteBufSize)
hgs
parents:
diff changeset
   800
		{
hgs
parents:
diff changeset
   801
		LOGGER_WRITE( "Expand write buffer" );
hgs
parents:
diff changeset
   802
		TInt expandStep = newPosition - iWriteBufSize + 100;
hgs
parents:
diff changeset
   803
		iWriteBuf->ExpandL( iWriteBufSize, expandStep );
hgs
parents:
diff changeset
   804
		iWriteBufSize += expandStep;
hgs
parents:
diff changeset
   805
		LOGGER_WRITE_1( "Write buffer expanded to %d bytes", iWriteBufSize );
hgs
parents:
diff changeset
   806
		}
hgs
parents:
diff changeset
   807
hgs
parents:
diff changeset
   808
	iWriteBuf->Write( iWriteBufPosition, writeData );
hgs
parents:
diff changeset
   809
	iWriteBufPosition = newPosition;
hgs
parents:
diff changeset
   810
	}
hgs
parents:
diff changeset
   811
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   814
// CVMessageParser::GetIndentLevel()
hgs
parents:
diff changeset
   815
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   816
//
hgs
parents:
diff changeset
   817
TInt CVMessageParser::GetIndentLevel( const TDesC& aMsgLineTag )
hgs
parents:
diff changeset
   818
	{
hgs
parents:
diff changeset
   819
	if (aMsgLineTag.Compare( KVMsgTagEnd ) == 0)
hgs
parents:
diff changeset
   820
		{
hgs
parents:
diff changeset
   821
		iWriteIndentLevel--;
hgs
parents:
diff changeset
   822
		}
hgs
parents:
diff changeset
   823
	TInt result = iWriteIndentLevel * KIndentStepSize;
hgs
parents:
diff changeset
   824
hgs
parents:
diff changeset
   825
	if (aMsgLineTag.Compare( KVMsgTagBegin ) == 0)
hgs
parents:
diff changeset
   826
		{
hgs
parents:
diff changeset
   827
		iWriteIndentLevel++;
hgs
parents:
diff changeset
   828
		}
hgs
parents:
diff changeset
   829
	return result;
hgs
parents:
diff changeset
   830
	}
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   833
// CVMessageParser::AssignDataToBuffer()
hgs
parents:
diff changeset
   834
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   835
//
hgs
parents:
diff changeset
   836
void CVMessageParser::AssignDataToBuffer( const TDesC &aData, TDes &aBuffer )
hgs
parents:
diff changeset
   837
	{
hgs
parents:
diff changeset
   838
	aBuffer.Zero();
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
	if (aBuffer.MaxLength() >= aData.Length())
hgs
parents:
diff changeset
   841
		{
hgs
parents:
diff changeset
   842
		aBuffer = aData;
hgs
parents:
diff changeset
   843
		}
hgs
parents:
diff changeset
   844
	else
hgs
parents:
diff changeset
   845
		{
hgs
parents:
diff changeset
   846
		LOGGER_WRITE_1( "AssignDataToBuffer: too short buffer for data: %d", aBuffer.MaxLength() );
hgs
parents:
diff changeset
   847
		LOG( aData );
hgs
parents:
diff changeset
   848
		aBuffer = aData.Left( aBuffer.MaxLength() );
hgs
parents:
diff changeset
   849
		}
hgs
parents:
diff changeset
   850
	}
hgs
parents:
diff changeset
   851
hgs
parents:
diff changeset
   852
hgs
parents:
diff changeset
   853
//  End of File