imservices/instantmessagingcache/imcacheserver/src/cimcachesession.cpp
author hgs
Wed, 03 Nov 2010 09:32:20 +0530
changeset 51 61fad867f68e
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 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:  cache session class implementation
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
//  INCLUDE FILES
hgs
parents:
diff changeset
    20
// local includes
hgs
parents:
diff changeset
    21
#include "cimcachesession.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include "cimcacheserver.h"
hgs
parents:
diff changeset
    24
#include "ccacheserveractivehelper.h"
hgs
parents:
diff changeset
    25
#include "cimcachemessagebase.h"
hgs
parents:
diff changeset
    26
#include "mimcachemessageheader.h"
hgs
parents:
diff changeset
    27
// logs
hgs
parents:
diff changeset
    28
#include "imcachedebugtrace.h"
hgs
parents:
diff changeset
    29
#include "cimcachebufferarray.h"
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// ==============================================================
hgs
parents:
diff changeset
    32
// ======================== SESSION =============================
hgs
parents:
diff changeset
    33
// ==============================================================
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// ---------------------------------------------------------
hgs
parents:
diff changeset
    36
// CIMCacheSession::NewL
hgs
parents:
diff changeset
    37
// Two-phased constructor.
hgs
parents:
diff changeset
    38
// ---------------------------------------------------------
hgs
parents:
diff changeset
    39
//
hgs
parents:
diff changeset
    40
CIMCacheSession* CIMCacheSession::NewL()
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    TRACE( T_LIT("CIMCacheSession::NewL begin") );
hgs
parents:
diff changeset
    43
    CIMCacheSession* self = new( ELeave ) CIMCacheSession(  );
hgs
parents:
diff changeset
    44
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    45
    self->ConstructL();
hgs
parents:
diff changeset
    46
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    47
    TRACE( T_LIT("CIMCacheSession::NewL end") );
hgs
parents:
diff changeset
    48
    return self;
hgs
parents:
diff changeset
    49
    }
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
// ---------------------------------------------------------
hgs
parents:
diff changeset
    52
// CIMCacheSession::NewL
hgs
parents:
diff changeset
    53
// Symbian OS default constructor can leave.
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------
hgs
parents:
diff changeset
    55
//
hgs
parents:
diff changeset
    56
void CIMCacheSession::ConstructL()
hgs
parents:
diff changeset
    57
	{
hgs
parents:
diff changeset
    58
	//This T-class is heap-allocated only because we do not want to 
hgs
parents:
diff changeset
    59
	//include T-class header in header file of imcachesession.
hgs
parents:
diff changeset
    60
	}
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// ---------------------------------------------------------
hgs
parents:
diff changeset
    63
// CIMCacheSession::NewL
hgs
parents:
diff changeset
    64
// destructor
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------
hgs
parents:
diff changeset
    66
//
hgs
parents:
diff changeset
    67
CIMCacheSession::~CIMCacheSession()
hgs
parents:
diff changeset
    68
    {
hgs
parents:
diff changeset
    69
    TRACE( T_LIT("CIMCacheSession[%d]::~CIMCacheSession() start"), this );
hgs
parents:
diff changeset
    70
    if(iObserverActive)
hgs
parents:
diff changeset
    71
        {
hgs
parents:
diff changeset
    72
        iObserverMessage.Complete( KErrCancel );
hgs
parents:
diff changeset
    73
        iObserverActive = EFalse;   
hgs
parents:
diff changeset
    74
        }
hgs
parents:
diff changeset
    75
    if( Server() )
hgs
parents:
diff changeset
    76
        {
hgs
parents:
diff changeset
    77
        Server()->SessionDied( this );
hgs
parents:
diff changeset
    78
        }
hgs
parents:
diff changeset
    79
     iPacketsArray.ResetAndDestroy();
hgs
parents:
diff changeset
    80
     
hgs
parents:
diff changeset
    81
     ResetHeaderInoformation();	
hgs
parents:
diff changeset
    82
     
hgs
parents:
diff changeset
    83
     TRACE( T_LIT("CIMCacheSession::~CIMCacheSession() end "));
hgs
parents:
diff changeset
    84
     }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
// ---------------------------------------------------------
hgs
parents:
diff changeset
    88
// CIMCacheSession::NewL
hgs
parents:
diff changeset
    89
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
    90
// might leave.
hgs
parents:
diff changeset
    91
// ---------------------------------------------------------
hgs
parents:
diff changeset
    92
//
hgs
parents:
diff changeset
    93
CIMCacheSession::CIMCacheSession():
hgs
parents:
diff changeset
    94
iOpenChatFetchCompleted( EFalse )
hgs
parents:
diff changeset
    95
	{
hgs
parents:
diff changeset
    96
 	TRACE( T_LIT("CIMCacheSession::CIMCacheSession"));
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------
hgs
parents:
diff changeset
   101
// CIMCacheSession::CreateL
hgs
parents:
diff changeset
   102
// (other items were commented in a header).
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------
hgs
parents:
diff changeset
   104
//
hgs
parents:
diff changeset
   105
void CIMCacheSession::CreateL()
hgs
parents:
diff changeset
   106
    {
hgs
parents:
diff changeset
   107
    TRACE( T_LIT("CIMCacheSession[%d]::CreateL()"), this );
hgs
parents:
diff changeset
   108
    Server()->SessionCreatedL( this );
hgs
parents:
diff changeset
   109
    TRACE( T_LIT( "CIMCacheSession::CreateL end") );
hgs
parents:
diff changeset
   110
    }
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
// ---------------------------------------------------------
hgs
parents:
diff changeset
   113
// CIMCacheSession::ServiceL
hgs
parents:
diff changeset
   114
// (other items were commented in a header).
hgs
parents:
diff changeset
   115
// ---------------------------------------------------------
hgs
parents:
diff changeset
   116
//
hgs
parents:
diff changeset
   117
void CIMCacheSession::ServiceL( const RMessage2 &aMessage )
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
	TRACE( T_LIT("CIMCacheSession::ServiceL	, begin"));
hgs
parents:
diff changeset
   120
    if( DispatchMessageL( aMessage ) )
hgs
parents:
diff changeset
   121
        {
hgs
parents:
diff changeset
   122
        TRACE( T_LIT("CIMCacheSession::ServiceL inside  DispatchMessageL"));
hgs
parents:
diff changeset
   123
        if( !iMessageCompleted  )
hgs
parents:
diff changeset
   124
        	{
hgs
parents:
diff changeset
   125
            TRACE( T_LIT("CIMCacheSession::ServiceL inside  !iMessageCompleted"));
hgs
parents:
diff changeset
   126
        	aMessage.Complete( KErrNone );
hgs
parents:
diff changeset
   127
        	}
hgs
parents:
diff changeset
   128
        }
hgs
parents:
diff changeset
   129
    TRACE( T_LIT("CIMCacheSession::ServiceL	, end"));
hgs
parents:
diff changeset
   130
    }
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
// ---------------------------------------------------------
hgs
parents:
diff changeset
   133
// CIMCacheSession::ServiceError
hgs
parents:
diff changeset
   134
// (other items were commented in a header).
hgs
parents:
diff changeset
   135
// ---------------------------------------------------------
hgs
parents:
diff changeset
   136
//
hgs
parents:
diff changeset
   137
void CIMCacheSession::ServiceError( const RMessage2& aMessage,
hgs
parents:
diff changeset
   138
                                      TInt aError )
hgs
parents:
diff changeset
   139
    {
hgs
parents:
diff changeset
   140
    TRACE( T_LIT("CIMCacheSession::ServiceError	, begin"));
hgs
parents:
diff changeset
   141
    aMessage.Complete( aError );
hgs
parents:
diff changeset
   142
    TRACE( T_LIT("CIMCacheSession::ServiceError	, end"));
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
// ---------------------------------------------------------
hgs
parents:
diff changeset
   147
// CIMCacheSession::DispatchMessageL
hgs
parents:
diff changeset
   148
// (other items were commented in a header).
hgs
parents:
diff changeset
   149
// ---------------------------------------------------------
hgs
parents:
diff changeset
   150
//
hgs
parents:
diff changeset
   151
TBool CIMCacheSession::DispatchMessageL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   152
    {
hgs
parents:
diff changeset
   153
    TRACE( T_LIT("CIMCacheSession[%d]::DispatchMessageL() %d"), this, aMessage.Function() );
hgs
parents:
diff changeset
   154
    
hgs
parents:
diff changeset
   155
	iMessageCompleted = EFalse;
hgs
parents:
diff changeset
   156
    TBool msgNeedsToBeCompleted = ETrue;
hgs
parents:
diff changeset
   157
    
hgs
parents:
diff changeset
   158
	  switch( aMessage.Function() )
hgs
parents:
diff changeset
   159
        {
hgs
parents:
diff changeset
   160
        // initialization operations
hgs
parents:
diff changeset
   161
        case EIMCacheInitUpdate :
hgs
parents:
diff changeset
   162
	        {
hgs
parents:
diff changeset
   163
	        TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheInitUpdate") );
hgs
parents:
diff changeset
   164
	        InitSessionL( aMessage );
hgs
parents:
diff changeset
   165
	       	break;	
hgs
parents:
diff changeset
   166
	        }
hgs
parents:
diff changeset
   167
	     // initialization operations
hgs
parents:
diff changeset
   168
        case EIMCacheInitAccess :
hgs
parents:
diff changeset
   169
	        {
hgs
parents:
diff changeset
   170
	        TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheInitAccess") );
hgs
parents:
diff changeset
   171
	        InitSessionL( aMessage );
hgs
parents:
diff changeset
   172
	        iAccessorInitialized = ETrue;
hgs
parents:
diff changeset
   173
        	break;	
hgs
parents:
diff changeset
   174
	        }
hgs
parents:
diff changeset
   175
	     // initialization operations
hgs
parents:
diff changeset
   176
        case EIMCacheInitConvesation :
hgs
parents:
diff changeset
   177
	        {
hgs
parents:
diff changeset
   178
	        TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheInitAccess") );
hgs
parents:
diff changeset
   179
	        InitSessionL( aMessage );
hgs
parents:
diff changeset
   180
	        iConvesationInitialized = ETrue;
hgs
parents:
diff changeset
   181
        	break;	
hgs
parents:
diff changeset
   182
	        }
hgs
parents:
diff changeset
   183
	     // update right operations
hgs
parents:
diff changeset
   184
        case EIMCacheStartNewConversation :
hgs
parents:
diff changeset
   185
        	{
hgs
parents:
diff changeset
   186
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheStartNewConversation excuted") );
hgs
parents:
diff changeset
   187
        	iHelper->StartNewConversationL(aMessage);
hgs
parents:
diff changeset
   188
        	break;
hgs
parents:
diff changeset
   189
        	}
hgs
parents:
diff changeset
   190
      	case EIMCacheAppendSendMessage :
hgs
parents:
diff changeset
   191
        	{
hgs
parents:
diff changeset
   192
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheAppendSendMessage excuted") );
hgs
parents:
diff changeset
   193
        	iHelper->AppendSendMessageL(aMessage);
hgs
parents:
diff changeset
   194
        	break;
hgs
parents:
diff changeset
   195
        	}
hgs
parents:
diff changeset
   196
        case EIMCacheAppendMessage :
hgs
parents:
diff changeset
   197
        	{
hgs
parents:
diff changeset
   198
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheAppendMessage excuted") );
hgs
parents:
diff changeset
   199
        	iHelper->AppendMessageL(aMessage);
hgs
parents:
diff changeset
   200
        	break;
hgs
parents:
diff changeset
   201
        	}
hgs
parents:
diff changeset
   202
        case EIMCacheAppendReceiveMessage:
hgs
parents:
diff changeset
   203
        	{
hgs
parents:
diff changeset
   204
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheAppendReceiveMessage excuted") );
hgs
parents:
diff changeset
   205
        	iHelper->AppendReceiveMessageL(aMessage);
hgs
parents:
diff changeset
   206
        	break;
hgs
parents:
diff changeset
   207
        	}
hgs
parents:
diff changeset
   208
        case EIMCacheCloseConversation :
hgs
parents:
diff changeset
   209
            {
hgs
parents:
diff changeset
   210
            TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheCloseConversation excuted") );
hgs
parents:
diff changeset
   211
            iHelper->CloseConversationL(aMessage);
hgs
parents:
diff changeset
   212
            break;
hgs
parents:
diff changeset
   213
            }
hgs
parents:
diff changeset
   214
        case EIMCacheCloseAllConversation :
hgs
parents:
diff changeset
   215
            {
hgs
parents:
diff changeset
   216
            TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheCloseAllConversation excuted") );
hgs
parents:
diff changeset
   217
            iHelper->CloseAllConversationL(iServiceId);
hgs
parents:
diff changeset
   218
            break;
hgs
parents:
diff changeset
   219
            }
hgs
parents:
diff changeset
   220
        case EIMCacheDeactivateConversation:
hgs
parents:
diff changeset
   221
        	{
hgs
parents:
diff changeset
   222
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheDeactivateConversation excuted") );
hgs
parents:
diff changeset
   223
        	iHelper->DeactivateConversationL();
hgs
parents:
diff changeset
   224
        
hgs
parents:
diff changeset
   225
        	break;
hgs
parents:
diff changeset
   226
        	}
hgs
parents:
diff changeset
   227
       	 
hgs
parents:
diff changeset
   228
        case EIMCacheObserveMessageUpdateRegister:
hgs
parents:
diff changeset
   229
        	{
hgs
parents:
diff changeset
   230
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheObserveMessageUpdateRegister excuted") );
hgs
parents:
diff changeset
   231
        	if( iObserverActive )
hgs
parents:
diff changeset
   232
        		{
hgs
parents:
diff changeset
   233
        		TRACE( T_LIT("CIMCacheSession::DispatchMessageL observer already active") );
hgs
parents:
diff changeset
   234
        		// complete the old observer request with KErrCancel
hgs
parents:
diff changeset
   235
        		iObserverMessage.Complete( KErrAlreadyExists );
hgs
parents:
diff changeset
   236
        		}
hgs
parents:
diff changeset
   237
        	iObserverMessage = aMessage;
hgs
parents:
diff changeset
   238
        	iObserverActive = ETrue;
hgs
parents:
diff changeset
   239
           	msgNeedsToBeCompleted = EFalse;
hgs
parents:
diff changeset
   240
           	// check fetching still needed or not if needed pack and send again 
hgs
parents:
diff changeset
   241
			if( iPacketsArray.Count() )
hgs
parents:
diff changeset
   242
				{
hgs
parents:
diff changeset
   243
				CIMCacheBufferArray* packet = iPacketsArray[ 0 ] ;
hgs
parents:
diff changeset
   244
				if( packet->OperationCode() ==  EIMOperationFetchAll )
hgs
parents:
diff changeset
   245
					{
hgs
parents:
diff changeset
   246
					iObserverMessage.Complete( EIMOperationDataAvailable );
hgs
parents:
diff changeset
   247
					}
hgs
parents:
diff changeset
   248
				else
hgs
parents:
diff changeset
   249
					{
hgs
parents:
diff changeset
   250
					iObserverMessage.Complete( packet->OperationCode() );
hgs
parents:
diff changeset
   251
					}
hgs
parents:
diff changeset
   252
				iObserverActive = EFalse;
hgs
parents:
diff changeset
   253
				}
hgs
parents:
diff changeset
   254
			
hgs
parents:
diff changeset
   255
			break;
hgs
parents:
diff changeset
   256
        	}
hgs
parents:
diff changeset
   257
        case EIMCacheObserveMessageUpdateUnRegister :
hgs
parents:
diff changeset
   258
	        {
hgs
parents:
diff changeset
   259
	        TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheObserveMessageUpdateUnRegister excuted") );
hgs
parents:
diff changeset
   260
	        if( !iObserverActive )
hgs
parents:
diff changeset
   261
        		{
hgs
parents:
diff changeset
   262
        		TRACE( T_LIT("CIMCacheSession::DispatchMessageL observer not active ") );
hgs
parents:
diff changeset
   263
        		}
hgs
parents:
diff changeset
   264
        	else
hgs
parents:
diff changeset
   265
	        	{
hgs
parents:
diff changeset
   266
	        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL observer active ") );
hgs
parents:
diff changeset
   267
				iObserverMessage.Complete( EIMOperationUnRegistered );
hgs
parents:
diff changeset
   268
				iObserverActive = EFalse;		
hgs
parents:
diff changeset
   269
	        	}
hgs
parents:
diff changeset
   270
	        
hgs
parents:
diff changeset
   271
            break;	
hgs
parents:
diff changeset
   272
	        }
hgs
parents:
diff changeset
   273
	     case EIMCacheObserveMessageAccessRegister:
hgs
parents:
diff changeset
   274
        	{
hgs
parents:
diff changeset
   275
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheObserveMessageAccessRegister excuted") );
hgs
parents:
diff changeset
   276
        	if( iObserverActive )
hgs
parents:
diff changeset
   277
        		{
hgs
parents:
diff changeset
   278
        		TRACE( T_LIT("CIMCacheSession::DispatchMessageL observer already active") );
hgs
parents:
diff changeset
   279
        		// complete the old observer request with KErrCancel
hgs
parents:
diff changeset
   280
        		iObserverMessage.Complete( KErrAlreadyExists );
hgs
parents:
diff changeset
   281
        		}
hgs
parents:
diff changeset
   282
        	iObserverMessage = aMessage;
hgs
parents:
diff changeset
   283
        	iObserverActive = ETrue;
hgs
parents:
diff changeset
   284
            msgNeedsToBeCompleted = EFalse;
hgs
parents:
diff changeset
   285
			 if( iPacketsArray.Count() )
hgs
parents:
diff changeset
   286
				{
hgs
parents:
diff changeset
   287
				CIMCacheBufferArray* packet = iPacketsArray[ 0 ] ;
hgs
parents:
diff changeset
   288
				if( packet->OperationCode() ==  EIMOperationFetchAll )
hgs
parents:
diff changeset
   289
					{
hgs
parents:
diff changeset
   290
					iObserverMessage.Complete( EIMOperationUnreadChange );
hgs
parents:
diff changeset
   291
					}
hgs
parents:
diff changeset
   292
				else
hgs
parents:
diff changeset
   293
					{
hgs
parents:
diff changeset
   294
					iObserverMessage.Complete( packet->OperationCode() );
hgs
parents:
diff changeset
   295
					}
hgs
parents:
diff changeset
   296
				iObserverActive = EFalse;
hgs
parents:
diff changeset
   297
				}
hgs
parents:
diff changeset
   298
	     	break;
hgs
parents:
diff changeset
   299
        	}
hgs
parents:
diff changeset
   300
         case EIMCacheObserveMessageAccessUnRegister :
hgs
parents:
diff changeset
   301
	        {
hgs
parents:
diff changeset
   302
	        TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheObserveMessageAccessUnRegister excuted") );
hgs
parents:
diff changeset
   303
	        if( !iObserverActive )
hgs
parents:
diff changeset
   304
        		{
hgs
parents:
diff changeset
   305
        		TRACE( T_LIT("CIMCacheSession::DispatchMessageL observer not active ") );
hgs
parents:
diff changeset
   306
        		}
hgs
parents:
diff changeset
   307
        	else
hgs
parents:
diff changeset
   308
	        	{
hgs
parents:
diff changeset
   309
	        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL observer active ") );
hgs
parents:
diff changeset
   310
				iObserverMessage.Complete( EIMOperationUnRegistered );
hgs
parents:
diff changeset
   311
				iObserverActive = EFalse;		
hgs
parents:
diff changeset
   312
	        	}
hgs
parents:
diff changeset
   313
	  
hgs
parents:
diff changeset
   314
            break;	
hgs
parents:
diff changeset
   315
	        }
hgs
parents:
diff changeset
   316
       
hgs
parents:
diff changeset
   317
        case EIMCacheGetUnreadCount:
hgs
parents:
diff changeset
   318
        	{
hgs
parents:
diff changeset
   319
        	iHelper->GetUnreadMessageCountL(aMessage);
hgs
parents:
diff changeset
   320
        	break;
hgs
parents:
diff changeset
   321
        	}
hgs
parents:
diff changeset
   322
        case EIMCacheGetAllUnreadCount:
hgs
parents:
diff changeset
   323
        	{
hgs
parents:
diff changeset
   324
        	iHelper->GetAllUnreadMessageCountL(aMessage);
hgs
parents:
diff changeset
   325
        	break;
hgs
parents:
diff changeset
   326
        	}
hgs
parents:
diff changeset
   327
       	   // check for conversation 
hgs
parents:
diff changeset
   328
        case EIMCacheIsConversationExist :
hgs
parents:
diff changeset
   329
	        {
hgs
parents:
diff changeset
   330
	        TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheIsConversationExist excuted ") );
hgs
parents:
diff changeset
   331
	       	iHelper->CheckConversationExistL(aMessage);
hgs
parents:
diff changeset
   332
	    	break;	
hgs
parents:
diff changeset
   333
	        }
hgs
parents:
diff changeset
   334
        // Get what change happen        	
hgs
parents:
diff changeset
   335
        case EIMCacheGetBufferedPackets:
hgs
parents:
diff changeset
   336
        	{
hgs
parents:
diff changeset
   337
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheGetBufferedPackets excuted") );
hgs
parents:
diff changeset
   338
        	if( iPacketsArray.Count() )
hgs
parents:
diff changeset
   339
				{
hgs
parents:
diff changeset
   340
				CIMCacheBufferArray* packet = iPacketsArray[ 0 ] ;
hgs
parents:
diff changeset
   341
				aMessage.WriteL(0, packet->PacketData() );
hgs
parents:
diff changeset
   342
				iPacketsArray.Remove(0);
hgs
parents:
diff changeset
   343
				delete packet;
hgs
parents:
diff changeset
   344
				packet = NULL;
hgs
parents:
diff changeset
   345
				iPacketsArray.Compress();
hgs
parents:
diff changeset
   346
				}
hgs
parents:
diff changeset
   347
        	break;
hgs
parents:
diff changeset
   348
        	}       
hgs
parents:
diff changeset
   349
           	
hgs
parents:
diff changeset
   350
        case EIMCacheGetChatList:
hgs
parents:
diff changeset
   351
        	{
hgs
parents:
diff changeset
   352
        	TRACE( T_LIT("CIMCacheSession::DispatchMessageL EIMCacheGetChatList executed") );
hgs
parents:
diff changeset
   353
        	//0 serviceId 
hgs
parents:
diff changeset
   354
        	//1 buffer
hgs
parents:
diff changeset
   355
        	TInt serviceId = aMessage.Int0();       	
hgs
parents:
diff changeset
   356
        	
hgs
parents:
diff changeset
   357
        	ExternalizeChatItemL( EIMOperationFetchAll , serviceId );
hgs
parents:
diff changeset
   358
        	
hgs
parents:
diff changeset
   359
        	//aMessage.WriteL( 1, *iChatDataBuffer); 
hgs
parents:
diff changeset
   360
        	TInt packetsCounts = iPacketsArray.Count();
hgs
parents:
diff changeset
   361
        
hgs
parents:
diff changeset
   362
        	if( packetsCounts )
hgs
parents:
diff changeset
   363
				{
hgs
parents:
diff changeset
   364
				CIMCacheBufferArray* packet = iPacketsArray[ 0 ] ;
hgs
parents:
diff changeset
   365
				aMessage.WriteL( 1, packet->PacketData() );	
hgs
parents:
diff changeset
   366
				iPacketsArray.Remove(0);
hgs
parents:
diff changeset
   367
				delete packet;
hgs
parents:
diff changeset
   368
				packet = NULL;
hgs
parents:
diff changeset
   369
				iPacketsArray.Compress();
hgs
parents:
diff changeset
   370
				}
hgs
parents:
diff changeset
   371
            break;	
hgs
parents:
diff changeset
   372
        	}
hgs
parents:
diff changeset
   373
        case EIMCacheCancelRequest:
hgs
parents:
diff changeset
   374
            {
hgs
parents:
diff changeset
   375
            TRACE( T_LIT("CIMCacheSession::EIMCacheCancelRequest start"));
hgs
parents:
diff changeset
   376
            if(iObserverActive)
hgs
parents:
diff changeset
   377
                {
hgs
parents:
diff changeset
   378
                TRACE( T_LIT("CIMCacheSession::EIMCacheCancelRequest Inside if"));
hgs
parents:
diff changeset
   379
                iObserverMessage.Complete( KErrCancel );
hgs
parents:
diff changeset
   380
                TRACE( T_LIT("CIMCacheSession::EIMCacheCancelRequest After iObserverMessage.Complete"));
hgs
parents:
diff changeset
   381
                iObserverActive = EFalse;   
hgs
parents:
diff changeset
   382
                }
hgs
parents:
diff changeset
   383
            TRACE( T_LIT("CIMCacheSession::EIMCacheCancelRequest End"));
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
          
hgs
parents:
diff changeset
   386
            break;
hgs
parents:
diff changeset
   387
            }
hgs
parents:
diff changeset
   388
        default:
hgs
parents:
diff changeset
   389
            {
hgs
parents:
diff changeset
   390
            TRACE( T_LIT("CIMCacheSession::DispatchMessageL default excuted") );
hgs
parents:
diff changeset
   391
            User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   392
            break;
hgs
parents:
diff changeset
   393
            }
hgs
parents:
diff changeset
   394
        }
hgs
parents:
diff changeset
   395
	TRACE( T_LIT("CIMCacheSession::DispatchMessageL	end"));
hgs
parents:
diff changeset
   396
    return msgNeedsToBeCompleted;
hgs
parents:
diff changeset
   397
   
hgs
parents:
diff changeset
   398
    }
hgs
parents:
diff changeset
   399
 //=======================================================================
hgs
parents:
diff changeset
   400
//==========================initialization ==================================
hgs
parents:
diff changeset
   401
//========================================================================
hgs
parents:
diff changeset
   402
hgs
parents:
diff changeset
   403
// ---------------------------------------------------------
hgs
parents:
diff changeset
   404
// CIMCacheSession::InitSessionL
hgs
parents:
diff changeset
   405
// (other items were commented in a header).
hgs
parents:
diff changeset
   406
// ---------------------------------------------------------
hgs
parents:
diff changeset
   407
//
hgs
parents:
diff changeset
   408
void CIMCacheSession::InitSessionL(const RMessage2& aMessage )
hgs
parents:
diff changeset
   409
	{
hgs
parents:
diff changeset
   410
    TRACE( T_LIT("CIMCacheSession::InitSessionL:start") );
hgs
parents:
diff changeset
   411
    // at zero place service id was appended
hgs
parents:
diff changeset
   412
    iServiceId = aMessage.Int0();
hgs
parents:
diff changeset
   413
	if( Server() )
hgs
parents:
diff changeset
   414
        {
hgs
parents:
diff changeset
   415
        iHelper = Server()->GetActiveHelper();
hgs
parents:
diff changeset
   416
        }
hgs
parents:
diff changeset
   417
    TRACE( T_LIT("CIMCacheSession::InitSessionL end") );
hgs
parents:
diff changeset
   418
	} 
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
// ---------------------------------------------------------
hgs
parents:
diff changeset
   422
// CIMCacheSession::InitSessionL
hgs
parents:
diff changeset
   423
// (other items were commented in a header).
hgs
parents:
diff changeset
   424
// ---------------------------------------------------------
hgs
parents:
diff changeset
   425
//
hgs
parents:
diff changeset
   426
TInt CIMCacheSession::ServiceId() const
hgs
parents:
diff changeset
   427
    {
hgs
parents:
diff changeset
   428
    TRACE( T_LIT("CIMCacheSession::ServiceId:start") );
hgs
parents:
diff changeset
   429
    TRACE( T_LIT("CIMCacheSession::ServiceId end") );
hgs
parents:
diff changeset
   430
    return iServiceId;
hgs
parents:
diff changeset
   431
    } 
hgs
parents:
diff changeset
   432
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   433
// CIMCacheSession::ResetHeaderInoformation()
hgs
parents:
diff changeset
   434
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   435
//
hgs
parents:
diff changeset
   436
void CIMCacheSession::ResetHeaderInoformation()
hgs
parents:
diff changeset
   437
                                                      
hgs
parents:
diff changeset
   438
    {
hgs
parents:
diff changeset
   439
    TRACE( T_LIT( "CIMCacheSession::ResetHeaderInoformation begin") );
hgs
parents:
diff changeset
   440
    if( iConvesationInitialized )
hgs
parents:
diff changeset
   441
	    {
hgs
parents:
diff changeset
   442
	    iHelper->ResetHeaderInoformation();	
hgs
parents:
diff changeset
   443
	    }
hgs
parents:
diff changeset
   444
   	TRACE( T_LIT( "CIMCacheSession::ResetHeaderInoformation end") );
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
 
hgs
parents:
diff changeset
   447
 
hgs
parents:
diff changeset
   448
// ---------------------------------------------------------
hgs
parents:
diff changeset
   449
// CIMCacheSession::PackAndNotifyEventL
hgs
parents:
diff changeset
   450
// (other items were commented in a header).
hgs
parents:
diff changeset
   451
// ---------------------------------------------------------
hgs
parents:
diff changeset
   452
//
hgs
parents:
diff changeset
   453
void CIMCacheSession::PackAndNotifyEventL(TIMCacheOperationsCode aChangeType ,
hgs
parents:
diff changeset
   454
										  MIMCacheMessageHeader* aChatHeader /*=NULL*/, 
hgs
parents:
diff changeset
   455
									 	  CIMCacheMessageBase* aMessage /*=NULL*/ ) 
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
    {	
hgs
parents:
diff changeset
   458
    TRACE( T_LIT( "CIMCacheSession::PackAndNotifyEventL() begin") );
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
    switch( aChangeType )
hgs
parents:
diff changeset
   461
        {
hgs
parents:
diff changeset
   462
        case EIMOperationFetchAll :
hgs
parents:
diff changeset
   463
            {
hgs
parents:
diff changeset
   464
            SendChatListDataL(aChangeType, aChatHeader);
hgs
parents:
diff changeset
   465
            break;	
hgs
parents:
diff changeset
   466
            }
hgs
parents:
diff changeset
   467
        case EIMOperationUnreadChange :
hgs
parents:
diff changeset
   468
            {
hgs
parents:
diff changeset
   469
            if(  iObserverActive && iConvesationInitialized )
hgs
parents:
diff changeset
   470
                {
hgs
parents:
diff changeset
   471
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   472
                iObserverActive = EFalse;		
hgs
parents:
diff changeset
   473
                }
hgs
parents:
diff changeset
   474
            else if( iObserverActive && iAccessorInitialized  )
hgs
parents:
diff changeset
   475
                {
hgs
parents:
diff changeset
   476
                ExternalizeSingleChatItemL(aChangeType, aChatHeader );
hgs
parents:
diff changeset
   477
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   478
                iObserverActive = EFalse;
hgs
parents:
diff changeset
   479
                }
hgs
parents:
diff changeset
   480
            break;	
hgs
parents:
diff changeset
   481
            }
hgs
parents:
diff changeset
   482
        case EIMOperationUnreadMessage :
hgs
parents:
diff changeset
   483
            {
hgs
parents:
diff changeset
   484
            SendUnreadChangeNotificationL( aChatHeader, aMessage );
hgs
parents:
diff changeset
   485
            break;	
hgs
parents:
diff changeset
   486
            }
hgs
parents:
diff changeset
   487
        case EIMOperationChatStarted :
hgs
parents:
diff changeset
   488
            {
hgs
parents:
diff changeset
   489
            if( iObserverActive && iConvesationInitialized )
hgs
parents:
diff changeset
   490
                {
hgs
parents:
diff changeset
   491
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   492
                iObserverActive = EFalse;		
hgs
parents:
diff changeset
   493
                }
hgs
parents:
diff changeset
   494
            else if( iObserverActive && iAccessorInitialized )
hgs
parents:
diff changeset
   495
                {
hgs
parents:
diff changeset
   496
                ExternalizeSingleChatItemL(aChangeType, aChatHeader );
hgs
parents:
diff changeset
   497
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   498
                iObserverActive = EFalse;   
hgs
parents:
diff changeset
   499
                }
hgs
parents:
diff changeset
   500
            break;	
hgs
parents:
diff changeset
   501
            }
hgs
parents:
diff changeset
   502
        case EIMOperationChatAdded :
hgs
parents:
diff changeset
   503
            {
hgs
parents:
diff changeset
   504
            if(  iConvesationInitialized )
hgs
parents:
diff changeset
   505
                {
hgs
parents:
diff changeset
   506
                ExternalizeSingleChatItemL(aChangeType, aChatHeader);
hgs
parents:
diff changeset
   507
                if( iObserverActive )
hgs
parents:
diff changeset
   508
                    {
hgs
parents:
diff changeset
   509
                    iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   510
                    iObserverActive = EFalse;	
hgs
parents:
diff changeset
   511
                    }
hgs
parents:
diff changeset
   512
                }
hgs
parents:
diff changeset
   513
            else if( iAccessorInitialized )
hgs
parents:
diff changeset
   514
                {
hgs
parents:
diff changeset
   515
                SendUnreadChangeNotificationL(aChatHeader, aMessage );
hgs
parents:
diff changeset
   516
                }
hgs
parents:
diff changeset
   517
            break;	
hgs
parents:
diff changeset
   518
            }
hgs
parents:
diff changeset
   519
        case EIMOperationMessageAdded :
hgs
parents:
diff changeset
   520
            {
hgs
parents:
diff changeset
   521
            if( iConvesationInitialized )
hgs
parents:
diff changeset
   522
                {
hgs
parents:
diff changeset
   523
                ExternalizeSingleChatDataL(aChangeType, aChatHeader , aMessage );
hgs
parents:
diff changeset
   524
                if( iObserverActive )
hgs
parents:
diff changeset
   525
                    {
hgs
parents:
diff changeset
   526
                    iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   527
                    iObserverActive = EFalse;
hgs
parents:
diff changeset
   528
                    }
hgs
parents:
diff changeset
   529
                }
hgs
parents:
diff changeset
   530
            break;	
hgs
parents:
diff changeset
   531
            }
hgs
parents:
diff changeset
   532
        case EIMOperationChatDeleted :
hgs
parents:
diff changeset
   533
            {
hgs
parents:
diff changeset
   534
            if( ( iConvesationInitialized || iAccessorInitialized  ) && iObserverActive )
hgs
parents:
diff changeset
   535
                {
hgs
parents:
diff changeset
   536
                ExternalizeSingleChatItemL(aChangeType, aChatHeader );
hgs
parents:
diff changeset
   537
                }
hgs
parents:
diff changeset
   538
            if( iObserverActive )
hgs
parents:
diff changeset
   539
                {
hgs
parents:
diff changeset
   540
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   541
                iObserverActive = EFalse;	
hgs
parents:
diff changeset
   542
                }
hgs
parents:
diff changeset
   543
            break;	
hgs
parents:
diff changeset
   544
            }
hgs
parents:
diff changeset
   545
        case EIMOperationAllChatDeleted:
hgs
parents:
diff changeset
   546
            {
hgs
parents:
diff changeset
   547
            if( ( iConvesationInitialized || iAccessorInitialized  ) && iObserverActive )
hgs
parents:
diff changeset
   548
                {
hgs
parents:
diff changeset
   549
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   550
                iObserverActive = EFalse;   
hgs
parents:
diff changeset
   551
                }
hgs
parents:
diff changeset
   552
            break;
hgs
parents:
diff changeset
   553
            }
hgs
parents:
diff changeset
   554
        case EIMOperationCompleted :
hgs
parents:
diff changeset
   555
            {
hgs
parents:
diff changeset
   556
            if( iObserverActive && iConvesationInitialized )
hgs
parents:
diff changeset
   557
                {
hgs
parents:
diff changeset
   558
                iObserverMessage.Complete( aChangeType );
hgs
parents:
diff changeset
   559
                iObserverActive = EFalse;		
hgs
parents:
diff changeset
   560
                }
hgs
parents:
diff changeset
   561
            break;	
hgs
parents:
diff changeset
   562
            }
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
        }
hgs
parents:
diff changeset
   565
hgs
parents:
diff changeset
   566
    }
hgs
parents:
diff changeset
   567
// ---------------------------------------------------------
hgs
parents:
diff changeset
   568
// CIMCacheSession::SendUnreadChangeNotificationL
hgs
parents:
diff changeset
   569
// (other items were commented in a header).
hgs
parents:
diff changeset
   570
// ---------------------------------------------------------
hgs
parents:
diff changeset
   571
//
hgs
parents:
diff changeset
   572
void CIMCacheSession::SendUnreadChangeNotificationL( MIMCacheMessageHeader* aMsgHeader, 
hgs
parents:
diff changeset
   573
												 	CIMCacheMessageBase* aMessage )	
hgs
parents:
diff changeset
   574
	{
hgs
parents:
diff changeset
   575
	// write the message into continuous memory stream
hgs
parents:
diff changeset
   576
	if( iAccessorInitialized  || 
hgs
parents:
diff changeset
   577
		(iConvesationInitialized && aMsgHeader->IsChatStarted()) )
hgs
parents:
diff changeset
   578
		{
hgs
parents:
diff changeset
   579
		ExternalizeSingleChatDataL(EIMOperationUnreadMessage, aMsgHeader, aMessage );
hgs
parents:
diff changeset
   580
		if( iObserverActive )
hgs
parents:
diff changeset
   581
			{
hgs
parents:
diff changeset
   582
			iObserverMessage.Complete( EIMOperationUnreadMessage );
hgs
parents:
diff changeset
   583
			iObserverActive = EFalse;	
hgs
parents:
diff changeset
   584
			}
hgs
parents:
diff changeset
   585
		}
hgs
parents:
diff changeset
   586
hgs
parents:
diff changeset
   587
	TRACE( T_LIT( "CIMCacheSession::SendUnreadChangeNotificationL() end") );
hgs
parents:
diff changeset
   588
	}
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
// ---------------------------------------------------------
hgs
parents:
diff changeset
   591
// CIMCacheSession::SendChatListDataL
hgs
parents:
diff changeset
   592
// (other items were commented in a header).
hgs
parents:
diff changeset
   593
// ---------------------------------------------------------
hgs
parents:
diff changeset
   594
//
hgs
parents:
diff changeset
   595
void CIMCacheSession::SendChatListDataL( TIMCacheOperationsCode aChangeType ,
hgs
parents:
diff changeset
   596
									     MIMCacheMessageHeader* aMsgHeader )
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
	{
hgs
parents:
diff changeset
   599
	
hgs
parents:
diff changeset
   600
	TRACE( T_LIT( "CIMCacheSession::SendChatListChangeNotificationL() begin") );
hgs
parents:
diff changeset
   601
   
hgs
parents:
diff changeset
   602
	// write the message into continuous memory stream
hgs
parents:
diff changeset
   603
	if( iConvesationInitialized )
hgs
parents:
diff changeset
   604
		{
hgs
parents:
diff changeset
   605
		ExternalizeChatDataL(aChangeType, aMsgHeader );
hgs
parents:
diff changeset
   606
		if( iObserverActive )
hgs
parents:
diff changeset
   607
			{
hgs
parents:
diff changeset
   608
			iObserverMessage.Complete( EIMOperationDataAvailable );
hgs
parents:
diff changeset
   609
			iObserverActive = EFalse;	
hgs
parents:
diff changeset
   610
			}
hgs
parents:
diff changeset
   611
		}
hgs
parents:
diff changeset
   612
	else if( iObserverActive && iAccessorInitialized  )
hgs
parents:
diff changeset
   613
		{
hgs
parents:
diff changeset
   614
        ExternalizeSingleChatItemL(aChangeType, aMsgHeader );
hgs
parents:
diff changeset
   615
		iObserverMessage.Complete( EIMOperationUnreadChange );
hgs
parents:
diff changeset
   616
		iObserverActive = EFalse;		
hgs
parents:
diff changeset
   617
		}
hgs
parents:
diff changeset
   618
		
hgs
parents:
diff changeset
   619
	TRACE( T_LIT( "CIMCacheSession::SendChatListChangeNotificationL() end") );
hgs
parents:
diff changeset
   620
	
hgs
parents:
diff changeset
   621
	}
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
// ---------------------------------------------------------
hgs
parents:
diff changeset
   624
// CIMCacheSession::ExternalizeSingleChatItemL
hgs
parents:
diff changeset
   625
// (other items were commented in a header).
hgs
parents:
diff changeset
   626
// ---------------------------------------------------------
hgs
parents:
diff changeset
   627
//
hgs
parents:
diff changeset
   628
void CIMCacheSession::ExternalizeSingleChatItemL( TIMCacheOperationsCode aChangeType, MIMCacheMessageHeader* aMsgHeader )
hgs
parents:
diff changeset
   629
	{
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
	 TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() Start") );
hgs
parents:
diff changeset
   632
hgs
parents:
diff changeset
   633
    RPointerArray<HBufC8> bufferedHeaderArray;
hgs
parents:
diff changeset
   634
    bufferedHeaderArray.Reset();
hgs
parents:
diff changeset
   635
    
hgs
parents:
diff changeset
   636
hgs
parents:
diff changeset
   637
    TInt availableSize = KMaxSize - 2*sizeof(TInt);//messageCount + more.
hgs
parents:
diff changeset
   638
    TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() availableSize ---- %d"),availableSize );
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
    TBool more = EFalse;
hgs
parents:
diff changeset
   641
hgs
parents:
diff changeset
   642
    if( aMsgHeader != NULL )
hgs
parents:
diff changeset
   643
        {
hgs
parents:
diff changeset
   644
        TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() inside if aMsgHeader") );
hgs
parents:
diff changeset
   645
        TInt dataSize = sizeof( TInt )+ //for service id.               
hgs
parents:
diff changeset
   646
                    sizeof( TInt )+ aMsgHeader->BuddyId().Size() ; // for buddyId length and buddyId.
hgs
parents:
diff changeset
   647
hgs
parents:
diff changeset
   648
        availableSize = availableSize - dataSize - sizeof( dataSize );
hgs
parents:
diff changeset
   649
        TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() inside if aMsgHeader availableSize --- %d"), availableSize );
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
        if( availableSize > 0 )
hgs
parents:
diff changeset
   652
            {
hgs
parents:
diff changeset
   653
            HBufC8* tempBuf = GetPackedChatItemBufferL( aMsgHeader , dataSize );
hgs
parents:
diff changeset
   654
            bufferedHeaderArray.AppendL( tempBuf );
hgs
parents:
diff changeset
   655
            }
hgs
parents:
diff changeset
   656
        }
hgs
parents:
diff changeset
   657
	    
hgs
parents:
diff changeset
   658
	    ExternalizeBufferedDataL(aChangeType, bufferedHeaderArray , KMaxSize , more );
hgs
parents:
diff changeset
   659
	    TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() after ExternalizeBufferedDataL") );
hgs
parents:
diff changeset
   660
	    bufferedHeaderArray.ResetAndDestroy(); // delete all buffered contacts.
hgs
parents:
diff changeset
   661
	    TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() after bufferedHeaderArray.resetanddestroy") );
hgs
parents:
diff changeset
   662
	    TRACE( T_LIT( "CIMCacheSession::ExternalizeSingleChatItemL() Start") );
hgs
parents:
diff changeset
   663
	}
hgs
parents:
diff changeset
   664
// ---------------------------------------------------------
hgs
parents:
diff changeset
   665
// CIMCacheSession::ExternalizeChatItemL
hgs
parents:
diff changeset
   666
// (other items were commented in a header).
hgs
parents:
diff changeset
   667
// ---------------------------------------------------------
hgs
parents:
diff changeset
   668
//
hgs
parents:
diff changeset
   669
void CIMCacheSession::ExternalizeChatItemL( TIMCacheOperationsCode aChangeType, 
hgs
parents:
diff changeset
   670
										    TInt aServiceId /*= KErrNotFound*/ )
hgs
parents:
diff changeset
   671
	{
hgs
parents:
diff changeset
   672
	
hgs
parents:
diff changeset
   673
    TRACE( T_LIT( "CIMCacheSession::ExternalizeL() begin") );
hgs
parents:
diff changeset
   674
    
hgs
parents:
diff changeset
   675
   	TInt availableSize = KMaxSize - 2*sizeof(TInt);
hgs
parents:
diff changeset
   676
   
hgs
parents:
diff changeset
   677
   	RPointerArray<HBufC8> bufferedHeaderArray;
hgs
parents:
diff changeset
   678
   	
hgs
parents:
diff changeset
   679
	TBool more = EFalse;
hgs
parents:
diff changeset
   680
	TInt i = 0;
hgs
parents:
diff changeset
   681
    if( aChangeType == EIMOperationFetchAll )
hgs
parents:
diff changeset
   682
        {
hgs
parents:
diff changeset
   683
        RPointerArray<MIMCacheMessageHeader> tempHeaderArray;
hgs
parents:
diff changeset
   684
    	iHelper->GetServiceChatHeaderArrayL( aServiceId , tempHeaderArray );
hgs
parents:
diff changeset
   685
  
hgs
parents:
diff changeset
   686
        TInt chatCount = tempHeaderArray.Count();
hgs
parents:
diff changeset
   687
         
hgs
parents:
diff changeset
   688
        for( i=0; i < chatCount; i++ )
hgs
parents:
diff changeset
   689
			{
hgs
parents:
diff changeset
   690
			MIMCacheMessageHeader* chatHeader = tempHeaderArray[ i ];
hgs
parents:
diff changeset
   691
hgs
parents:
diff changeset
   692
			TInt dataSize = sizeof( TInt )+ //for service id.               
hgs
parents:
diff changeset
   693
			sizeof( TInt )+ chatHeader->BuddyId().Size() ; // for buddyId length and buddyId.
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
			availableSize = availableSize - dataSize - sizeof( dataSize );
hgs
parents:
diff changeset
   696
hgs
parents:
diff changeset
   697
			if( availableSize > 0 )
hgs
parents:
diff changeset
   698
				{
hgs
parents:
diff changeset
   699
				HBufC8* tempBuf = GetPackedChatItemBufferL( chatHeader , dataSize );
hgs
parents:
diff changeset
   700
				bufferedHeaderArray.AppendL( tempBuf );
hgs
parents:
diff changeset
   701
				}
hgs
parents:
diff changeset
   702
			else
hgs
parents:
diff changeset
   703
				{
hgs
parents:
diff changeset
   704
				more = ETrue;
hgs
parents:
diff changeset
   705
				ExternalizeBufferedDataL(aChangeType, bufferedHeaderArray , KMaxSize , more );
hgs
parents:
diff changeset
   706
				bufferedHeaderArray.ResetAndDestroy(); // delete all buffered contacts.
hgs
parents:
diff changeset
   707
				availableSize = KMaxSize - 2*sizeof(TInt);
hgs
parents:
diff changeset
   708
				//preserve information for next trial.
hgs
parents:
diff changeset
   709
				}
hgs
parents:
diff changeset
   710
			}
hgs
parents:
diff changeset
   711
        if( i == chatCount )
hgs
parents:
diff changeset
   712
            {
hgs
parents:
diff changeset
   713
            more = EFalse;
hgs
parents:
diff changeset
   714
            ExternalizeBufferedDataL(aChangeType, bufferedHeaderArray , KMaxSize , more );
hgs
parents:
diff changeset
   715
            }
hgs
parents:
diff changeset
   716
        }
hgs
parents:
diff changeset
   717
 
hgs
parents:
diff changeset
   718
    bufferedHeaderArray.ResetAndDestroy(); // delete all buffered contacts.
hgs
parents:
diff changeset
   719
    
hgs
parents:
diff changeset
   720
    TRACE( T_LIT( "CIMCacheSession::ExternalizeL() end") );
hgs
parents:
diff changeset
   721
    }
hgs
parents:
diff changeset
   722
// ---------------------------------------------------------
hgs
parents:
diff changeset
   723
// CIMCacheSession::ExternalizeBufferedDataL
hgs
parents:
diff changeset
   724
// (other items were commented in a header).
hgs
parents:
diff changeset
   725
// ---------------------------------------------------------
hgs
parents:
diff changeset
   726
//
hgs
parents:
diff changeset
   727
void CIMCacheSession::ExternalizeBufferedDataL(TIMCacheOperationsCode aOperationCode,
hgs
parents:
diff changeset
   728
											   RPointerArray<HBufC8>& aArray , 
hgs
parents:
diff changeset
   729
											   TInt aTotalSize , 
hgs
parents:
diff changeset
   730
											   TBool aMore /*= EFalse*/)
hgs
parents:
diff changeset
   731
	{
hgs
parents:
diff changeset
   732
	TRACE( T_LIT( "CIMCacheSession::ExternalizeBufferedDataL() begin") );
hgs
parents:
diff changeset
   733
	TInt appendedMsgCount = aArray.Count(); 
hgs
parents:
diff changeset
   734
	CBufFlat* flatBuf = CBufFlat::NewL(aTotalSize);//( aTotalSize + ( sizeof(TInt) * appendedMsgCount ) + sizeof(TInt) );
hgs
parents:
diff changeset
   735
	CleanupStack::PushL( flatBuf );
hgs
parents:
diff changeset
   736
	RBufWriteStream writeAllStream ;
hgs
parents:
diff changeset
   737
	CleanupClosePushL( writeAllStream );
hgs
parents:
diff changeset
   738
hgs
parents:
diff changeset
   739
	writeAllStream.Open( *flatBuf );
hgs
parents:
diff changeset
   740
	writeAllStream.WriteInt16L( appendedMsgCount );
hgs
parents:
diff changeset
   741
	
hgs
parents:
diff changeset
   742
	for(TInt i = 0; i< appendedMsgCount ; i++ )
hgs
parents:
diff changeset
   743
		{
hgs
parents:
diff changeset
   744
		HBufC8* buf =  aArray[i];
hgs
parents:
diff changeset
   745
		writeAllStream.WriteInt16L(buf->Length());
hgs
parents:
diff changeset
   746
		writeAllStream.WriteL(*buf);			
hgs
parents:
diff changeset
   747
		}
hgs
parents:
diff changeset
   748
	
hgs
parents:
diff changeset
   749
	writeAllStream.WriteInt16L( aMore );//write more information at end.
hgs
parents:
diff changeset
   750
	
hgs
parents:
diff changeset
   751
	writeAllStream.CommitL(); 
hgs
parents:
diff changeset
   752
hgs
parents:
diff changeset
   753
	CIMCacheBufferArray* packet = CIMCacheBufferArray::NewL( flatBuf->Ptr(0) , aOperationCode );
hgs
parents:
diff changeset
   754
	iPacketsArray.Append(packet); // ownership to array
hgs
parents:
diff changeset
   755
	
hgs
parents:
diff changeset
   756
	CleanupStack::PopAndDestroy(); // writeAllStream
hgs
parents:
diff changeset
   757
	CleanupStack::PopAndDestroy(); // flatBuf
hgs
parents:
diff changeset
   758
	
hgs
parents:
diff changeset
   759
	TRACE( T_LIT( "CIMCacheSession::ExternalizeBufferedDataL() end") );
hgs
parents:
diff changeset
   760
	
hgs
parents:
diff changeset
   761
	}  	
hgs
parents:
diff changeset
   762
 
hgs
parents:
diff changeset
   763
// ---------------------------------------------------------
hgs
parents:
diff changeset
   764
// CIMCacheSession::ExternalizeSingleChatDataL
hgs
parents:
diff changeset
   765
// (other items were commented in a header).
hgs
parents:
diff changeset
   766
// ---------------------------------------------------------
hgs
parents:
diff changeset
   767
void CIMCacheSession::ExternalizeSingleChatDataL(TIMCacheOperationsCode aChangeType, MIMCacheMessageHeader* aChatHeader, CIMCacheMessageBase* aMessage )
hgs
parents:
diff changeset
   768
	{
hgs
parents:
diff changeset
   769
	
hgs
parents:
diff changeset
   770
	TInt availableSize = KMaxSize - 2*sizeof(TInt);//messageCount + more.
hgs
parents:
diff changeset
   771
hgs
parents:
diff changeset
   772
	TBool more = EFalse;
hgs
parents:
diff changeset
   773
hgs
parents:
diff changeset
   774
	if( aMessage && aChatHeader )
hgs
parents:
diff changeset
   775
		{
hgs
parents:
diff changeset
   776
		if( aChangeType == EIMOperationMessageAdded )
hgs
parents:
diff changeset
   777
			{
hgs
parents:
diff changeset
   778
			aMessage->SetRead()	;
hgs
parents:
diff changeset
   779
			}
hgs
parents:
diff changeset
   780
		RPointerArray<HBufC8> bufferedChatArray;
hgs
parents:
diff changeset
   781
			
hgs
parents:
diff changeset
   782
		TInt dataSize = sizeof( aMessage->MessageType() )+
hgs
parents:
diff changeset
   783
		                sizeof( aMessage->MessagerType() )+
hgs
parents:
diff changeset
   784
		                sizeof( aMessage->ContentType() )+
hgs
parents:
diff changeset
   785
		                sizeof( aMessage->TimeStamp().Int64() )+  
hgs
parents:
diff changeset
   786
		                sizeof( TInt )+ aChatHeader->BuddyId().Size() + // for buddy  length and buddy name
hgs
parents:
diff changeset
   787
		                sizeof( TInt )+ aMessage->Text().Size() ; // for message length and message
hgs
parents:
diff changeset
   788
		             
hgs
parents:
diff changeset
   789
		availableSize = availableSize - dataSize - sizeof( dataSize );
hgs
parents:
diff changeset
   790
		if( availableSize > 0 )
hgs
parents:
diff changeset
   791
		    {
hgs
parents:
diff changeset
   792
		     HBufC8* messageBuffer = GetPackedChatDataBufferL( aMessage , aChatHeader , dataSize );
hgs
parents:
diff changeset
   793
		     bufferedChatArray.AppendL( messageBuffer );
hgs
parents:
diff changeset
   794
		    }
hgs
parents:
diff changeset
   795
		    
hgs
parents:
diff changeset
   796
		ExternalizeBufferedDataL(aChangeType, bufferedChatArray , KMaxSize , more );
hgs
parents:
diff changeset
   797
		bufferedChatArray.ResetAndDestroy();
hgs
parents:
diff changeset
   798
		}
hgs
parents:
diff changeset
   799
	}
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
// ---------------------------------------------------------
hgs
parents:
diff changeset
   802
// CIMCacheSession::ExternalizeChatDataL
hgs
parents:
diff changeset
   803
// (other items were commented in a header).
hgs
parents:
diff changeset
   804
// ---------------------------------------------------------
hgs
parents:
diff changeset
   805
void CIMCacheSession::ExternalizeChatDataL(TIMCacheOperationsCode aChangeType ,MIMCacheMessageHeader* aChatHeader )
hgs
parents:
diff changeset
   806
    {    
hgs
parents:
diff changeset
   807
    RPointerArray<HBufC8> bufferedChatArray;
hgs
parents:
diff changeset
   808
    bufferedChatArray.Reset();
hgs
parents:
diff changeset
   809
    
hgs
parents:
diff changeset
   810
    TInt availableSize = KMaxSize - 2*sizeof(TInt);//messageCount + more.
hgs
parents:
diff changeset
   811
   
hgs
parents:
diff changeset
   812
    TBool more = EFalse;
hgs
parents:
diff changeset
   813
     
hgs
parents:
diff changeset
   814
    if( aChangeType == EIMOperationFetchAll &&  aChatHeader )
hgs
parents:
diff changeset
   815
        { 
hgs
parents:
diff changeset
   816
        TInt messageCount = aChatHeader->MessageCount();
hgs
parents:
diff changeset
   817
    	
hgs
parents:
diff changeset
   818
   		TInt index = 0;
hgs
parents:
diff changeset
   819
        for( index = 0 ; index < messageCount  ; index++ )
hgs
parents:
diff changeset
   820
            {
hgs
parents:
diff changeset
   821
            CIMCacheMessageBase* message = aChatHeader->GetMessage(index);
hgs
parents:
diff changeset
   822
            TInt dataSize = sizeof( message->MessageType() )+
hgs
parents:
diff changeset
   823
                            sizeof( message->MessagerType() )+
hgs
parents:
diff changeset
   824
                            sizeof( message->ContentType() )+
hgs
parents:
diff changeset
   825
                            sizeof( message->TimeStamp().Int64() )+  
hgs
parents:
diff changeset
   826
                            sizeof( TInt )+ aChatHeader->BuddyId().Size() + // for buddy  length and buddy name
hgs
parents:
diff changeset
   827
                            sizeof( TInt )+ message->Text().Size() ; // for message length and message
hgs
parents:
diff changeset
   828
                         
hgs
parents:
diff changeset
   829
            availableSize = availableSize - dataSize - sizeof( dataSize );
hgs
parents:
diff changeset
   830
            if( availableSize > 0 )
hgs
parents:
diff changeset
   831
                {
hgs
parents:
diff changeset
   832
                // mark message read
hgs
parents:
diff changeset
   833
    			 message->SetRead();
hgs
parents:
diff changeset
   834
                 HBufC8* messageBuffer = GetPackedChatDataBufferL( message , aChatHeader , dataSize );
hgs
parents:
diff changeset
   835
                 bufferedChatArray.AppendL( messageBuffer );
hgs
parents:
diff changeset
   836
                 }
hgs
parents:
diff changeset
   837
            else
hgs
parents:
diff changeset
   838
                {
hgs
parents:
diff changeset
   839
                //else set information for more and message nest to last sent message i.e index
hgs
parents:
diff changeset
   840
                more = ETrue;
hgs
parents:
diff changeset
   841
                ExternalizeBufferedDataL(aChangeType, bufferedChatArray , KMaxSize , more );
hgs
parents:
diff changeset
   842
    			bufferedChatArray.ResetAndDestroy();  
hgs
parents:
diff changeset
   843
    			availableSize = KMaxSize - 2*sizeof(TInt); //messageCount + more.  
hgs
parents:
diff changeset
   844
                index--;
hgs
parents:
diff changeset
   845
                }
hgs
parents:
diff changeset
   846
            }
hgs
parents:
diff changeset
   847
        if( index == messageCount )
hgs
parents:
diff changeset
   848
			{
hgs
parents:
diff changeset
   849
			more = EFalse;
hgs
parents:
diff changeset
   850
			ExternalizeBufferedDataL(aChangeType, bufferedChatArray , KMaxSize , more );
hgs
parents:
diff changeset
   851
			}
hgs
parents:
diff changeset
   852
        }
hgs
parents:
diff changeset
   853
     bufferedChatArray.ResetAndDestroy();    
hgs
parents:
diff changeset
   854
    }
hgs
parents:
diff changeset
   855
// ---------------------------------------------------------
hgs
parents:
diff changeset
   856
// CIMCacheSession::GetPackedChatDataBufferL
hgs
parents:
diff changeset
   857
// (other items were commented in a header).
hgs
parents:
diff changeset
   858
// ---------------------------------------------------------
hgs
parents:
diff changeset
   859
HBufC8* CIMCacheSession::GetPackedChatDataBufferL(CIMCacheMessageBase* aMsg , MIMCacheMessageHeader* aActiveHeader , const TInt aSize)
hgs
parents:
diff changeset
   860
    {
hgs
parents:
diff changeset
   861
    TRACE( T_LIT( "CIMCacheSession::GetPackedChatDataBufferL() begin") );
hgs
parents:
diff changeset
   862
    
hgs
parents:
diff changeset
   863
hgs
parents:
diff changeset
   864
    CBufFlat*   flatBuf = CBufFlat::NewL( aSize );
hgs
parents:
diff changeset
   865
    CleanupStack::PushL( flatBuf );
hgs
parents:
diff changeset
   866
hgs
parents:
diff changeset
   867
    RBufWriteStream writeStream ;
hgs
parents:
diff changeset
   868
    CleanupClosePushL( writeStream );
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
    writeStream.Open( *flatBuf );
hgs
parents:
diff changeset
   871
hgs
parents:
diff changeset
   872
    writeStream.WriteInt16L( aMsg->MessageType() );  
hgs
parents:
diff changeset
   873
    writeStream.WriteInt16L( aMsg->MessagerType() );
hgs
parents:
diff changeset
   874
    writeStream.WriteInt16L( aMsg->ContentType() );   
hgs
parents:
diff changeset
   875
    writeStream.WriteReal64L( aMsg->TimeStamp().Int64() );
hgs
parents:
diff changeset
   876
    writeStream.WriteInt16L( aActiveHeader->BuddyId().Length() );    
hgs
parents:
diff changeset
   877
    writeStream.WriteL( aActiveHeader->BuddyId() );
hgs
parents:
diff changeset
   878
    writeStream.WriteInt16L( aMsg->Text().Length() );    
hgs
parents:
diff changeset
   879
    writeStream.WriteL( aMsg->Text() );
hgs
parents:
diff changeset
   880
    
hgs
parents:
diff changeset
   881
    writeStream.CommitL();
hgs
parents:
diff changeset
   882
hgs
parents:
diff changeset
   883
    HBufC8* tempBuffer = flatBuf->Ptr(0).AllocL();
hgs
parents:
diff changeset
   884
    
hgs
parents:
diff changeset
   885
    CleanupStack::PopAndDestroy(); // flatBuf
hgs
parents:
diff changeset
   886
    CleanupStack::PopAndDestroy(); // writeStream
hgs
parents:
diff changeset
   887
    
hgs
parents:
diff changeset
   888
    TRACE( T_LIT( "CIMCacheSession::GetPackedChatDataBufferL() end") ); 
hgs
parents:
diff changeset
   889
    return tempBuffer;
hgs
parents:
diff changeset
   890
    }
hgs
parents:
diff changeset
   891
hgs
parents:
diff changeset
   892
// ---------------------------------------------------------
hgs
parents:
diff changeset
   893
// CIMCacheSession::GetPackedChatItemBufferL
hgs
parents:
diff changeset
   894
// (other items were commented in a header).
hgs
parents:
diff changeset
   895
// ---------------------------------------------------------
hgs
parents:
diff changeset
   896
//
hgs
parents:
diff changeset
   897
HBufC8* CIMCacheSession::GetPackedChatItemBufferL(MIMCacheMessageHeader* aChatHeader, TInt& aSize)
hgs
parents:
diff changeset
   898
    {
hgs
parents:
diff changeset
   899
    TRACE( T_LIT( "CIMCacheSession::GetPackedChatItemBufferL() end") );
hgs
parents:
diff changeset
   900
    
hgs
parents:
diff changeset
   901
    TInt  serviceId   = aChatHeader->ServiceId();
hgs
parents:
diff changeset
   902
    const TDesC& buddyId = aChatHeader->BuddyId();
hgs
parents:
diff changeset
   903
             
hgs
parents:
diff changeset
   904
     CBufFlat*   flatBuf = CBufFlat::NewL( aSize );
hgs
parents:
diff changeset
   905
     CleanupStack::PushL( flatBuf );
hgs
parents:
diff changeset
   906
     
hgs
parents:
diff changeset
   907
     RBufWriteStream writeStream ;
hgs
parents:
diff changeset
   908
     CleanupClosePushL( writeStream );
hgs
parents:
diff changeset
   909
     writeStream.Open( *flatBuf );
hgs
parents:
diff changeset
   910
        
hgs
parents:
diff changeset
   911
     writeStream.WriteInt16L( serviceId );
hgs
parents:
diff changeset
   912
     writeStream.WriteInt16L( buddyId.Length() );
hgs
parents:
diff changeset
   913
     writeStream.WriteL( buddyId );       
hgs
parents:
diff changeset
   914
     writeStream.CommitL();
hgs
parents:
diff changeset
   915
     
hgs
parents:
diff changeset
   916
     HBufC8* chatHeaderBuffer = flatBuf->Ptr(0).AllocL();
hgs
parents:
diff changeset
   917
    
hgs
parents:
diff changeset
   918
     CleanupStack::PopAndDestroy(2); // writeAllStream,flatBuf
hgs
parents:
diff changeset
   919
     
hgs
parents:
diff changeset
   920
     TRACE( T_LIT( "CIMCacheSession::GetPackedChatItemBufferL() end") );
hgs
parents:
diff changeset
   921
     
hgs
parents:
diff changeset
   922
     return chatHeaderBuffer;
hgs
parents:
diff changeset
   923
    }
hgs
parents:
diff changeset
   924
hgs
parents:
diff changeset
   925
hgs
parents:
diff changeset
   926
// end of file