imstutils/imconversationview/imcvuiengine/src/cimcvengineopenchats.cpp
branchRCL_3
changeset 28 3104fc151679
parent 27 2b7283837edb
child 29 9a48e301e94b
equal deleted inserted replaced
27:2b7283837edb 28:3104fc151679
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation for Open ConversationList 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 
       
    21 #include "cimcvengineopenchats.h"
       
    22 #include "cimcvenginemessagehandler.h"
       
    23 #include "mimcvenginechatinterface.h"
       
    24 #include "mimcvenginemessagecontainerinfo.h"
       
    25 
       
    26 #include <escapeutils.h>
       
    27 #include <collate.h>
       
    28 #include "imcvuiliterals.h"
       
    29 #include "imcvlogger.h"
       
    30 
       
    31 
       
    32 // ============================ MEMBER FUNCTIONS ===============================
       
    33 
       
    34 
       
    35 // -----------------------------------------------------------------------------
       
    36 // CIMCVEngineOpenChats : Ctor
       
    37 //
       
    38 // -----------------------------------------------------------------------------
       
    39 //
       
    40 CIMCVEngineOpenChats::CIMCVEngineOpenChats(CIMCVEngineMessageHandler& aMessageHandler, 
       
    41 								MIMCVEngineChatInterface& aChatInterface) :    
       
    42      iActiveItem(-1),
       
    43      iMessageHandler(aMessageHandler),
       
    44      iChatInterface(aChatInterface)
       
    45     {
       
    46     }
       
    47 
       
    48 
       
    49 // -----------------------------------------------------------------------------
       
    50 // CIMCVEngineOpenChats : NewL
       
    51 //
       
    52 // -----------------------------------------------------------------------------
       
    53 //
       
    54 CIMCVEngineOpenChats* CIMCVEngineOpenChats::NewL(CIMCVEngineMessageHandler& aMessageHandler,
       
    55 								MIMCVEngineChatInterface& aChatInterface,TInt aServiceId )
       
    56     {
       
    57     CIMCVEngineOpenChats* self = new ( ELeave ) CIMCVEngineOpenChats(aMessageHandler, aChatInterface);     
       
    58     self->ConstructL(aServiceId);       
       
    59     return self;
       
    60     }
       
    61 
       
    62 // -----------------------------------------------------------------------------
       
    63 // CIMCVEngineOpenChats : Destructor
       
    64 //
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 CIMCVEngineOpenChats::~CIMCVEngineOpenChats()
       
    68     {
       
    69     iChatInterface.UnregisterNewMsgObserver();  
       
    70     iChatInterface.UnregisterChatListObserver(this);  
       
    71     iOpenChatsArray.Reset();
       
    72     }
       
    73 
       
    74 
       
    75 // -----------------------------------------------------------------------------
       
    76 // CIMCVEngineOpenChats: GetDisplayNameL
       
    77 // -----------------------------------------------------------------------------
       
    78 //
       
    79 TPtrC CIMCVEngineOpenChats::GetDisplayNameL(TInt aIndex) const
       
    80 	{
       
    81 	if ( (aIndex >= iOpenChatsArray.Count()) || (aIndex <0) )
       
    82 	    {	      
       
    83 	    User::LeaveIfError(KErrArgument);
       
    84 	    }
       
    85     else 
       
    86 		{		
       
    87 		
       
    88 		MIMCVEngineMessageReadInterface* arrayItem = 
       
    89 						(MIMCVEngineMessageReadInterface*) iOpenChatsArray[aIndex];
       
    90 		
       
    91 		if (arrayItem)
       
    92 			{
       
    93 			return arrayItem->Name();				
       
    94 			}			
       
    95 		}
       
    96 		
       
    97 		return TPtrC(KNullDesC);
       
    98 	}
       
    99 	
       
   100 
       
   101 // -----------------------------------------------------------------------------
       
   102 // CIMCVEngineOpenChats: GetTargetIdL
       
   103 // -----------------------------------------------------------------------------
       
   104 //
       
   105 const TDesC& CIMCVEngineOpenChats::GetTargetIdL(TInt aIndex) const
       
   106 	{
       
   107 	if ( ( aIndex < iOpenChatsArray.Count() ) && (aIndex >= 0 ) )
       
   108 	    {	      
       
   109 			MIMCVEngineMessageReadInterface* arrayItem = 
       
   110 						(MIMCVEngineMessageReadInterface *)iOpenChatsArray[aIndex];
       
   111 			if (arrayItem)
       
   112 				{
       
   113 				return arrayItem->TargetId().Target();	
       
   114 				}     
       
   115 			}
       
   116 	return (KNullDesC);		
       
   117 	}
       
   118 
       
   119 
       
   120 
       
   121 // -----------------------------------------------------------------------------
       
   122 // CIMCVEngineOpenChats: FindIndexL
       
   123 // -----------------------------------------------------------------------------
       
   124 //
       
   125 TInt CIMCVEngineOpenChats::FindIndexL(const TDesC& aItem)
       
   126 	{
       
   127 	
       
   128 	HBufC* decodedItemId = EscapeUtils::EscapeDecodeL( aItem );	
       
   129 	
       
   130 	// Create custom collation method to ignore punctuations
       
   131     // index 0 gets the default method
       
   132     TCollationMethod collation =
       
   133         *Mem::CollationMethodByIndex( 0 );
       
   134         
       
   135     collation.iFlags |= TCollationMethod::EIgnoreNone;
       
   136 	
       
   137 	for (TInt index=0; index<iOpenChatsArray.Count(); index++)
       
   138 		{
       
   139 		TPtrC ptrId1( GetTargetIdL(index) );
       
   140 		TPtrC ptrId2( decodedItemId->Des() );
       
   141 
       
   142 	    // domains are compared only when it is really needed
       
   143 	    // check if userid part is the same in both ids   
       
   144 	    TInt idResult = ptrId1.CompareC( ptrId2, KCollationLevel, &collation );
       
   145 
       
   146 		if( !idResult )
       
   147 			{
       
   148 			delete decodedItemId;
       
   149 			return index;
       
   150 			}
       
   151 		}
       
   152 	
       
   153 	delete decodedItemId;
       
   154 	return KErrNotFound;
       
   155 	}
       
   156 	
       
   157 // -----------------------------------------------------------------------------
       
   158 // CIMCVEngineOpenChats: Count
       
   159 // -----------------------------------------------------------------------------
       
   160 //
       
   161 TInt CIMCVEngineOpenChats::Count() const
       
   162 	{
       
   163 	return iOpenChatsArray.Count();
       
   164 	}
       
   165 
       
   166 
       
   167 // -----------------------------------------------------------------------------
       
   168 // CIMCVEngineOpenChats: SetActiveItemL
       
   169 // -----------------------------------------------------------------------------
       
   170 //
       
   171 void CIMCVEngineOpenChats::SetActiveItemL( const TInt aIndex )
       
   172 	{
       
   173 	
       
   174 	if ( (aIndex >= iOpenChatsArray.Count()) || (aIndex <0) )
       
   175 	    {	      
       
   176 	    User::LeaveIfError(KErrArgument);
       
   177 	    }
       
   178 	    
       
   179 	iActiveItem = aIndex;
       
   180 
       
   181 	}
       
   182 
       
   183 
       
   184 // -----------------------------------------------------------------------------
       
   185 // CIMCVEngineOpenChats: GetActiveItem
       
   186 // -----------------------------------------------------------------------------
       
   187 //
       
   188 const TDesC& CIMCVEngineOpenChats::GetActiveItem() const
       
   189 	{
       
   190 	
       
   191 	if ( (iActiveItem < iOpenChatsArray.Count()) && (iActiveItem >= 0) )
       
   192 	    {	      
       
   193 	    MIMCVEngineMessageReadInterface *arrayItem = 
       
   194 	    (MIMCVEngineMessageReadInterface *)iOpenChatsArray[iActiveItem];
       
   195 	    if (arrayItem)
       
   196 	        {
       
   197 	        return arrayItem->TargetId().Target();	
       
   198 	        }
       
   199 	    }
       
   200 	return (KNullDesC); 
       
   201 	
       
   202 	}
       
   203 
       
   204 
       
   205 // -----------------------------------------------------------------------------
       
   206 // CIMCVEngineOpenChats: IsMsgPendingL
       
   207 // -----------------------------------------------------------------------------
       
   208 //
       
   209 TBool CIMCVEngineOpenChats::IsMsgPendingL( const TInt aIndex ) const
       
   210 	{
       
   211 	if(aIndex >= (iOpenChatsArray.Count()) || aIndex <0)
       
   212 	    {	      
       
   213 	    User::LeaveIfError(KErrArgument);
       
   214 	    }
       
   215     else 
       
   216 		{
       
   217 		MIMCVEngineMessageReadInterface *arrayItem = 
       
   218 								(MIMCVEngineMessageReadInterface *)iOpenChatsArray[aIndex];
       
   219 		if (arrayItem)
       
   220 			{
       
   221 			return arrayItem->UnreadCount();        	
       
   222 			}
       
   223 		}
       
   224 	return EFalse;			
       
   225 	}
       
   226 
       
   227 
       
   228 // -----------------------------------------------------------------------------
       
   229 // CIMCVEngineOpenChats: ConstructL
       
   230 // -----------------------------------------------------------------------------
       
   231 //
       
   232 void CIMCVEngineOpenChats::ConstructL( TInt aServiceId )
       
   233 	{
       
   234 	IM_CV_LOGS(TXT("CIMCVEngineOpenChats ::CONSTRUCTL () ") );
       
   235 	iChatInterface.RegisterNewMsgObserver( this ); 
       
   236 	iChatInterface.RegisterChatListObserver( this );	
       
   237 
       
   238 	RArray<SIMCacheChatItem> chatItem = iMessageHandler.GetChatListL( aServiceId ); 
       
   239 	IM_CV_LOGS(TXT("CIMCVEngineOpenChats :: CHAT ITEMS COUNT %d"), chatItem.Count () );
       
   240 	
       
   241 	for (int index=0; index<chatItem.Count(); index++)
       
   242 		{
       
   243 		
       
   244 		iChatInterface.MessageReadInterfaceL(chatItem[index].iServiceId,
       
   245 		                                           *chatItem[index].iBuddyId );
       
   246 		
       
   247 		delete chatItem[index].iBuddyId;	    
       
   248     			
       
   249 		}
       
   250 	chatItem.Reset();
       
   251 	chatItem.Close();
       
   252 	}
       
   253 	
       
   254 
       
   255 // -----------------------------------------------------------------------------
       
   256 // CIMCVEngineOpenChats: Insert
       
   257 // -----------------------------------------------------------------------------
       
   258 //
       
   259 void CIMCVEngineOpenChats::Insert( MIMCVEngineMessageReadInterface* aContainerInfo )
       
   260 	{	
       
   261     iOpenChatsArray.Append( aContainerInfo );
       
   262     
       
   263     if (iChatObserver)
       
   264 	    {    
       
   265 	    TRAP_IGNORE( iChatObserver->HandleChangeL(iMessageHandler.ServiceId(), iOpenChatsArray.Count()-1, ENewChat) );	  
       
   266 	    }
       
   267 	}
       
   268 
       
   269 
       
   270 // -----------------------------------------------------------------------------
       
   271 // CIMCVEngineOpenChats: RemoveL
       
   272 // -----------------------------------------------------------------------------
       
   273 //
       
   274 void CIMCVEngineOpenChats::RemoveL( MIMCVEngineMessageReadInterface& aContainerInfo )
       
   275 	{
       
   276 	TInt index = FindIndexL(aContainerInfo.TargetId().Target());
       
   277 	
       
   278 	if (KErrNotFound != index)
       
   279 		{
       
   280 		iOpenChatsArray.Remove(index);
       
   281 		iOpenChatsArray.Compress();
       
   282 		if (iChatObserver)
       
   283 			{
       
   284 			iChatObserver->HandleChangeL(iMessageHandler.ServiceId(), index, EChatClosed);		
       
   285 			}
       
   286 		}
       
   287 	}
       
   288 
       
   289 
       
   290 // -----------------------------------------------------------------------------
       
   291 // CIMCVEngineOpenChats: RegisterObserver
       
   292 // -----------------------------------------------------------------------------
       
   293 //
       
   294 void CIMCVEngineOpenChats::RegisterObserver(MIMCVEngineOpenChatsObserver* aChatObserver)
       
   295 	{
       
   296 	iChatObserver = aChatObserver;
       
   297 	}
       
   298 
       
   299 
       
   300 // -----------------------------------------------------------------------------
       
   301 // CIMCVEngineOpenChats: UnRegisterObserver
       
   302 // -----------------------------------------------------------------------------
       
   303 //
       
   304 void CIMCVEngineOpenChats::UnRegisterObserver()
       
   305 	{
       
   306 	iChatObserver = NULL;
       
   307  	}
       
   308 
       
   309 
       
   310 // -----------------------------------------------------------------------------
       
   311 // CIMCVEngineOpenChats: HandleChatEventL
       
   312 // -----------------------------------------------------------------------------
       
   313 //
       
   314 void CIMCVEngineOpenChats::HandleChatEventL( TChatEventType /*aEvent*/, 
       
   315 											MIMCVEngineMessage* aMessage /*= NULL*/ ) 
       
   316 	{
       
   317 	if (aMessage)
       
   318 		{
       
   319 		TInt index = KErrNotFound;
       
   320 		
       
   321 		 index = FindIndexL(aMessage->Recipient()) ;
       
   322 		
       
   323 		if (KErrNotFound != index)
       
   324 			{
       
   325 			MIMCVEngineMessageReadInterface *arrayItem = 
       
   326 								(MIMCVEngineMessageReadInterface *)iOpenChatsArray[index];
       
   327 			if (arrayItem && iChatObserver)
       
   328 				{
       
   329 				TInt serviceId = iMessageHandler.ServiceId();
       
   330 				iChatObserver->SetStatusMsgL(serviceId, index,aMessage->Text());
       
   331 				iChatObserver->HandleChangeL(serviceId, index, EUnReadCountChanged);			
       
   332 				}	
       
   333 			}		
       
   334 		}	
       
   335 	}
       
   336 
       
   337 
       
   338 // -----------------------------------------------------------------------------
       
   339 // CIMCVEngineOpenChats: HandleChatListEvent
       
   340 // -----------------------------------------------------------------------------
       
   341 //
       
   342 void CIMCVEngineOpenChats::HandleChatListEvent( TInt aServiceId ,TChatListEventType aEvent, 
       
   343 									MIMCVEngineMessageReadInterface* aContainerInfo
       
   344 									) 
       
   345 	{
       
   346 		
       
   347 	switch (aEvent)
       
   348 		{
       
   349 		case EChatItemAdded:
       
   350 			{				
       
   351 			Insert(aContainerInfo);
       
   352 			break;
       
   353 			}
       
   354 
       
   355 		case EChatItemDeleted:
       
   356 			{				
       
   357 			TRAP_IGNORE(RemoveL(*aContainerInfo));
       
   358 			break;
       
   359 			}
       
   360 		case EChatAllItemDeleted:
       
   361 		    {
       
   362 		    // not owns
       
   363 		    iOpenChatsArray.Reset();
       
   364 		    if (iChatObserver)
       
   365 		        {
       
   366 		        TRAP_IGNORE( iChatObserver->HandleChangeL( aServiceId, KErrNotFound, EChatAllClosed ) );      
       
   367 		        }
       
   368 		    }
       
   369 		default:
       
   370 			break;
       
   371 		}
       
   372 	
       
   373 	}
       
   374 	
       
   375 // -----------------------------------------------------------------------------
       
   376 // CIMCVEngineOpenChats: ResetL
       
   377 // -----------------------------------------------------------------------------
       
   378 //
       
   379 void CIMCVEngineOpenChats::ResetL()
       
   380 	{
       
   381 	iOpenChatsArray.Reset();
       
   382 	iActiveItem = -1;		
       
   383 	}
       
   384 		
       
   385 // End of File
       
   386