simpledatamodeladapter/simpleimplugin/src/simpleimconversation.cpp
branchRCL_3
changeset 17 2669f8761a99
parent 16 2580314736af
child 18 fbd2e7cec7ef
equal deleted inserted replaced
16:2580314736af 17:2669f8761a99
     1 /*
       
     2 * Copyright (c) 2009 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:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <ximpobjectfactory.h>
       
    20 #include <imobjectfactory.h>
       
    21 #include <simplefactory.h>
       
    22 #include <imconversationinfo.h>
       
    23 #include <utf.h>
       
    24 #include <ximpprotocolconnectionhost.h>
       
    25 #include <protocolimdatahost.h>
       
    26 #include <protocolimconversationdatahost.h>
       
    27 #include <spsettings.h>
       
    28 #include <cch.h>
       
    29 #include <cimcachefactory.h>
       
    30 #include <mimcacheupdater.h>
       
    31 
       
    32 #include "simpleimconversation.h"
       
    33 #include "presenceplugincommon.h"
       
    34 #include "mpresencepluginconnectionobs.h"
       
    35 #include "simpleimplugindefs.h"
       
    36 #include "simpleimlogger.h"
       
    37 
       
    38 // ======== MEMBER FUNCTIONS ========
       
    39 
       
    40 // ---------------------------------------------------------------------------
       
    41 // CPresencePluginGroups::CPresencePluginGroups
       
    42 // ---------------------------------------------------------------------------
       
    43 //
       
    44 CSimpleImConversation::CSimpleImConversation( 
       
    45     MPresencePluginConnectionObs& aObs, MSimpleConnection& aConn,
       
    46     TUint aServiceId ):
       
    47   	iConnectionObs( &aObs ),
       
    48   	iConnection( &aConn ),
       
    49   	iServiceId( aServiceId )  	
       
    50     {
       
    51     }
       
    52 
       
    53 
       
    54 // ---------------------------------------------------------------------------
       
    55 // CSimpleImConversation::NewL
       
    56 // ---------------------------------------------------------------------------
       
    57 //
       
    58 CSimpleImConversation* CSimpleImConversation::NewL(
       
    59     MPresencePluginConnectionObs& aObs,
       
    60     MSimpleConnection& aConn, TUint aServiceId)
       
    61     { 
       
    62     CSimpleImConversation* self = 
       
    63         new( ELeave ) CSimpleImConversation ( aObs, aConn, aServiceId );
       
    64     CleanupStack::PushL( self );
       
    65     self->ConstructL();
       
    66     CleanupStack::Pop( self );
       
    67     return self;
       
    68     }
       
    69 
       
    70 
       
    71 // ---------------------------------------------------------------------------
       
    72 // CSimpleImConversation::ConstructL()
       
    73 // ---------------------------------------------------------------------------
       
    74 //
       
    75 void CSimpleImConversation::ConstructL()
       
    76     {
       
    77     DP_IMP("CSimpleImConversation::ConstructL")
       
    78     
       
    79     iImHandler = TSimpleFactory::NewInstantMessageL( 
       
    80         *iConnection, *this );
       
    81     
       
    82     iImCacheFactory = CIMCacheFactory::InstanceL();
       
    83     }
       
    84 
       
    85 
       
    86 // ---------------------------------------------------------------------------
       
    87 // CSimpleImConversation::~CSimpleImConversation
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 CSimpleImConversation::~CSimpleImConversation()
       
    91     {
       
    92     DP_IMP("CSimpleImConversation::~CSimpleImConversation")
       
    93     
       
    94     if ( iImHandler )
       
    95         {
       
    96         DP_IMP("Close the msg handler")
       
    97         iImHandler->Close();
       
    98         }
       
    99     
       
   100     // Release the imcache, all the conversation will lost here
       
   101     if ( iImCacheFactory )
       
   102         {
       
   103         DP_IMP("Release IM Cache")
       
   104         CIMCacheFactory::Release();
       
   105         iImCacheFactory = NULL;
       
   106         }
       
   107 
       
   108     iImCacheUpdater = NULL;
       
   109     iHost = NULL;
       
   110     }
       
   111 
       
   112 
       
   113 // ---------------------------------------------------------------------------
       
   114 // CSimpleImConversation::SetHost
       
   115 // ---------------------------------------------------------------------------
       
   116 //
       
   117 void CSimpleImConversation::SetHost( MProtocolImDataHost& aHost )
       
   118     {
       
   119     DP_IMP("CSimpleImConversation::SetHost")
       
   120     
       
   121     iHost = &aHost;
       
   122     }
       
   123 
       
   124 
       
   125 // ---------------------------------------------------------------------------
       
   126 // CSimpleImConversation::GetInterface()
       
   127 // ---------------------------------------------------------------------------
       
   128 //
       
   129 TAny* CSimpleImConversation::GetInterface(
       
   130     TInt32 aInterfaceId,
       
   131     TIfGetOps aOptions )
       
   132     {
       
   133     DP_IMP("CSimpleImConversation::GetInterface")
       
   134     
       
   135     if ( MProtocolImConversation::KInterfaceId == aInterfaceId )
       
   136         {
       
   137         return this;
       
   138         }
       
   139     
       
   140     if ( MXIMPBase::EPanicIfUnknown == aOptions )
       
   141         {
       
   142         User::Panic( KSimpleImPluginName, KErrExtensionNotSupported );
       
   143         }
       
   144     
       
   145     return NULL;
       
   146     }
       
   147 
       
   148 
       
   149 // ---------------------------------------------------------------------------
       
   150 // CSimpleImConversation::GetInterface() const
       
   151 // ---------------------------------------------------------------------------
       
   152 //
       
   153 const TAny* CSimpleImConversation::GetInterface(
       
   154         TInt32 aInterfaceId, TIfGetOps aOptions ) const
       
   155     {
       
   156     DP_IMP("CSimpleImConversation::GetInterface")
       
   157     
       
   158     if ( MProtocolImConversation::KInterfaceId == aInterfaceId )
       
   159         {
       
   160         // caller wants this interface
       
   161         return const_cast<CSimpleImConversation*>( this );
       
   162         }
       
   163     
       
   164     if ( MXIMPBase::EPanicIfUnknown == aOptions )
       
   165         {
       
   166         User::Panic( KSimpleImPluginName, KErrExtensionNotSupported );
       
   167         }
       
   168     
       
   169     return NULL;
       
   170     }
       
   171 
       
   172 
       
   173 // ---------------------------------------------------------------------------
       
   174 // CSimpleImConversation::GetInterfaceId() const
       
   175 // ---------------------------------------------------------------------------
       
   176 //
       
   177 TInt32 CSimpleImConversation::GetInterfaceId() const
       
   178     {
       
   179     DP_IMP("CSimpleImConversation::GetInterfaceId")
       
   180     
       
   181     return MProtocolImConversation::KInterfaceId;
       
   182     }
       
   183 
       
   184 
       
   185 // ---------------------------------------------------------------------------
       
   186 // From MProtocolImConversation.
       
   187 // CSimpleImConversation::DoSendMessageL()
       
   188 // ---------------------------------------------------------------------------
       
   189 //
       
   190 void CSimpleImConversation::DoSendMessageL(
       
   191     const MImConversationInfo& aImMessage,
       
   192     TXIMPRequestId aReqId )
       
   193     {
       
   194     DP_IMP( "CSimpleImConversation::DoSendMessageL" )
       
   195     
       
   196     iCompleted = EFalse;    
       
   197     
       
   198     TPtrC16 msgText16 = aImMessage.TextMessage();
       
   199     DP_IMP2( "CSimpleImConversation::DoSendMessageL, CONTENT: %S",
       
   200         &msgText16 )
       
   201     HBufC8* contentData = CnvUtfConverter::ConvertFromUnicodeToUtf8L(
       
   202         msgText16 );
       
   203     CleanupStack::PushL( contentData );
       
   204     
       
   205     const MDesCArray& recipients = aImMessage.RecipientL();
       
   206     for ( TInt i = 0; i < recipients.MdcaCount(); i++ )
       
   207         {
       
   208         TPtrC16 recipientsPtr16 = recipients.MdcaPoint( i );
       
   209         HBufC8* recipientsData = CnvUtfConverter::ConvertFromUnicodeToUtf8L(
       
   210                     recipientsPtr16 );
       
   211         CleanupStack::PushL( recipientsData );
       
   212         DP_IMP2( "CSimpleImConversation::DoSendMessageL, RECIPIENT: %S",
       
   213             &recipientsPtr16 )
       
   214         
       
   215         TInt result = iImHandler->SendInstantMessage( *contentData,
       
   216             *recipientsData );
       
   217         CleanupStack::PopAndDestroy( recipientsData );
       
   218         
       
   219         if ( KErrInUse == result )
       
   220             {
       
   221             User::Leave( KErrInUse );
       
   222             }
       
   223         }
       
   224     
       
   225     CleanupStack::PopAndDestroy( contentData );
       
   226     iXimpId = aReqId;
       
   227     }
       
   228 
       
   229 
       
   230 // ---------------------------------------------------------------------------
       
   231 // From MProtocolImConversation.
       
   232 // CSimpleImConversation::DoForwardMessageL()
       
   233 // ---------------------------------------------------------------------------
       
   234 //
       
   235 void CSimpleImConversation::DoForwardMessageL(
       
   236     const MImConversationInfo& /*aImMessage*/,
       
   237     TXIMPRequestId /*aReqId*/ )
       
   238     {
       
   239     DP_IMP( "CSimpleImConversation::DoForwardMessageL, NOT SUPPORTED" )
       
   240     
       
   241     User::Leave( KErrNotSupported );
       
   242     }
       
   243 
       
   244 
       
   245 // ---------------------------------------------------------------------------
       
   246 // From MProtocolImConversation.
       
   247 // CSimpleImConversation::DoSendMessageToGroupL()
       
   248 // ---------------------------------------------------------------------------
       
   249 //
       
   250 void  CSimpleImConversation::DoSendMessageToGroupL(
       
   251     const MImConversationInfo& /*aImMessage*/,
       
   252     const TDesC* /*aGroupId*/, TXIMPRequestId /*aReqId*/ )
       
   253     {
       
   254     DP_IMP( "CSimpleImConversation::DoSendMessageToGroupL, NOT SUPPORTED" )
       
   255     
       
   256     User::Leave( KErrNotSupported );
       
   257     }
       
   258 
       
   259 
       
   260 // ---------------------------------------------------------------------------
       
   261 // From MProtocolImConversation.
       
   262 // CSimpleImConversation::DoBlockUsersL()
       
   263 // ---------------------------------------------------------------------------
       
   264 //
       
   265 TXIMPRequestId CSimpleImConversation::DoBlockUsersL(
       
   266     const MDesCArray* /*aUserIds*/,
       
   267     TXIMPRequestId /*aReqId*/ )
       
   268     {
       
   269     DP_IMP( "CSimpleImConversation::DoBlockUsersL, NOT SUPPORTED" )
       
   270     
       
   271     User::Leave( KErrNotSupported );
       
   272     return TXIMPRequestId();
       
   273     }
       
   274 
       
   275 
       
   276 // ---------------------------------------------------------------------------
       
   277 // From MProtocolImConversation.
       
   278 // CSimpleImConversation::DoUnBlockUsersL()
       
   279 // ---------------------------------------------------------------------------
       
   280 //
       
   281 TXIMPRequestId CSimpleImConversation::DoUnBlockUsersL(
       
   282     const MDesCArray* /*aUserIds*/,
       
   283     TXIMPRequestId /*aReqId*/ )
       
   284     {
       
   285     DP_IMP( "CSimpleImConversation::DoUnBlockUsersL, NOT SUPPORTED" )
       
   286     
       
   287     User::Leave( KErrNotSupported );
       
   288     return TXIMPRequestId();
       
   289     }
       
   290 
       
   291 
       
   292 // ---------------------------------------------------------------------------
       
   293 // From MProtocolImConversation.
       
   294 // CSimpleImConversation::DoGetBlockedListRequestL()
       
   295 // ---------------------------------------------------------------------------
       
   296 //
       
   297 void CSimpleImConversation::DoGetBlockedListRequestL(
       
   298     const MXIMPIdentity& /*aImMessageId*/,
       
   299     TXIMPRequestId /*aReqId*/ )
       
   300     {
       
   301     DP_IMP( "CSimpleImConversation::DoGetBlockedListRequestL, NOT SUPPORTED" )
       
   302     
       
   303     User::Leave( KErrNotSupported );
       
   304     }
       
   305 
       
   306 
       
   307 // ---------------------------------------------------------------------------
       
   308 // From MProtocolImConversation.
       
   309 // CSimpleImConversation::DoGetMessageListL()
       
   310 // ---------------------------------------------------------------------------
       
   311 //
       
   312 void CSimpleImConversation::DoGetMessageListL(
       
   313     const MXIMPIdentity& /*aImMessageId*/,
       
   314     const TDesC* /*aGroupId*/,
       
   315     const TInt /*aMessageCount*/,
       
   316     TBool /*aDeliveryReportWanted*/,
       
   317     TXIMPRequestId /*aReqId*/ )
       
   318     {
       
   319     DP_IMP( "CSimpleImConversation::DoGetMessageListL, NOT SUPPORTED" )
       
   320     
       
   321     User::Leave( KErrNotSupported );
       
   322     }
       
   323 
       
   324 
       
   325 // ---------------------------------------------------------------------------
       
   326 // From MProtocolImConversation.
       
   327 // CSimpleImConversation::DoRejectMessageL()
       
   328 // ---------------------------------------------------------------------------
       
   329 //
       
   330 void CSimpleImConversation::DoRejectMessageL(
       
   331     const MXIMPIdentity& /*aImMessageId*/,
       
   332     const TDesC& /*aMessageID*/,
       
   333     TXIMPRequestId /*aReqId*/ )
       
   334     {
       
   335     DP_IMP( "CSimpleImConversation::DoRejectMessageL, NOT SUPPORTED" )
       
   336     
       
   337     User::Leave( KErrNotSupported );
       
   338     }
       
   339 
       
   340 
       
   341 // ---------------------------------------------------------------------------
       
   342 // From MSimpleInstantMsgObserver.
       
   343 // CSimpleImConversation::SendInstantMsgReqComplete()
       
   344 // ---------------------------------------------------------------------------
       
   345 //
       
   346 void CSimpleImConversation::SendInstantMsgReqComplete( 
       
   347     TInt /*aOpid*/, TInt aStatus)
       
   348     {
       
   349     DP_IMP("CSimpleImConversation::SendInstantMsgReqComplete")
       
   350     
       
   351     CompleteXimpReq( aStatus );
       
   352     }
       
   353 
       
   354 
       
   355 // ---------------------------------------------------------------------------
       
   356 // From MSimpleInstantMsgObserver.
       
   357 // CSimpleImConversation::HandleReceiveTextMessage()
       
   358 // ---------------------------------------------------------------------------
       
   359 //
       
   360 void CSimpleImConversation::HandleReceiveTextMessage( 
       
   361     TPtrC8 aFrom, TPtrC8 aContent )
       
   362     {
       
   363     DP_IMP( "CSimpleImConversation::HandleReceiveTextMessage" )
       
   364     
       
   365     TRAPD( err, DoHandleReceiveTextMessageL( aFrom, aContent ) )
       
   366     
       
   367     if ( KErrNone != err )
       
   368         {
       
   369         // Do nothing
       
   370         DP_IMP2( "CSimpleImConversation::HandleReceiveTextMessage, ERROR: %i",
       
   371             err )
       
   372         }
       
   373     }
       
   374 
       
   375 
       
   376 // ---------------------------------------------------------------------------
       
   377 // CSimpleImConversation::CompleteXimpReq()
       
   378 // ---------------------------------------------------------------------------
       
   379 //
       
   380 void CSimpleImConversation::CompleteXimpReq( TInt aStatus )
       
   381     {
       
   382     DP_IMP( "CSimpleImConversation::CompleteXimpReq" )
       
   383     
       
   384     if ( iCompleted )
       
   385         {
       
   386         DP_IMP("CSimpleImConversation::CompleteXimpReq return")
       
   387         return;
       
   388         }
       
   389     
       
   390     iCompleted = ETrue;
       
   391     iConnectionObs->CompleteReq( iXimpId, aStatus );
       
   392     iXimpId = TXIMPRequestId();
       
   393     }
       
   394 
       
   395 
       
   396 // ---------------------------------------------------------------------------
       
   397 // CSimpleImConversation::DoHandleReceiveTextMessageL()
       
   398 // ---------------------------------------------------------------------------
       
   399 //
       
   400 void CSimpleImConversation::DoHandleReceiveTextMessageL( TPtrC8 aFrom,
       
   401     TPtrC8 aContent )
       
   402     {
       
   403     DP_IMP( "CSimpleImConversation::DoHandleReceiveTextMessageL" )
       
   404     
       
   405     CreateImCacheUpdaterIfNeededL();
       
   406     
       
   407     if ( iHost )
       
   408         {
       
   409         MXIMPObjectFactory& objFact = iConnectionObs->Host()->ObjectFactory();
       
   410         MImObjectFactory& imObjFact = iHost->ImObjectFactory();
       
   411         
       
   412         MXIMPIdentity* identity = objFact.NewIdentityLC(); // CS:1
       
   413         MImConversationInfo* convinfo = imObjFact.
       
   414             NewImConversationInfoLC(); // CS:2
       
   415         
       
   416         HBufC16* sendername = CnvUtfConverter::ConvertToUnicodeFromUtf8L(
       
   417             aFrom );
       
   418         CleanupStack::PushL( sendername ); // CS:3
       
   419         identity->SetIdentityL( *sendername );
       
   420         CleanupStack::PopAndDestroy( sendername ); // CS:2
       
   421         convinfo->SetMessageIdL( identity );
       
   422         
       
   423         HBufC16* messagecontent = CnvUtfConverter::ConvertToUnicodeFromUtf8L(
       
   424             aContent );
       
   425         CleanupStack::PushL( messagecontent ); // CS:3
       
   426         convinfo->SetTextMessageL( *messagecontent );
       
   427         CleanupStack::PopAndDestroy( messagecontent ); // CS:2
       
   428         
       
   429         iHost->ConversationDataHost().HandleNewTextMessageL( convinfo );
       
   430         TRAP_IGNORE( iImCacheUpdater->AppendReceiveMessageL(
       
   431             identity->Identity(), convinfo->TextMessage() ) );
       
   432         
       
   433         CleanupStack::Pop(); // CS:1
       
   434         CleanupStack::Pop(); // CS:0
       
   435         }
       
   436     else
       
   437         {
       
   438         DP_IMP( " --> PROTOCOL IM DATA HOST IS NULL!" )
       
   439         }
       
   440     }
       
   441 
       
   442 // ---------------------------------------------------------------------------
       
   443 // CSimpleImConversation::ResolveUsernameL
       
   444 // ---------------------------------------------------------------------------
       
   445 //
       
   446 void CSimpleImConversation::ResolveUsernameL( 
       
   447         TUint aServiceId, RBuf& aUserName ) const
       
   448     {
       
   449     DP_IMP( "CSimpleImConversation::ResolveUsernameL" )
       
   450     
       
   451     CCch* cchApi = CCch::NewLC();
       
   452     CCchService* service = cchApi->GetService( aServiceId );
       
   453 
       
   454     User::LeaveIfError( service->GetConnectionParameter( 
       
   455         ECCHUnknown, ECchUsername, aUserName ) );
       
   456     
       
   457     DP_IMP2( "CSimpleImConversation::ResolveUsernameL, USERNAME: %S",
       
   458         &aUserName )
       
   459     
       
   460     CleanupStack::PopAndDestroy( cchApi );
       
   461     }
       
   462 
       
   463 
       
   464 // ---------------------------------------------------------------------------
       
   465 // CSimpleImConversation::CreateImCacheUpdaterIfNeededL()
       
   466 // ---------------------------------------------------------------------------
       
   467 //
       
   468 void CSimpleImConversation::CreateImCacheUpdaterIfNeededL()
       
   469     {
       
   470     if ( !iImCacheUpdater )
       
   471         {
       
   472         DP_IMP( "CSimpleImConversation::CreateImCacheUpdaterIfNeededL," )
       
   473         DP_IMP( "CREATING UPDATER" )
       
   474         
       
   475         RBuf username;
       
   476         CleanupClosePushL( username );
       
   477         const TInt KMaxUserNameLength = 255;
       
   478         username.CreateL( KMaxUserNameLength );
       
   479         ResolveUsernameL( iServiceId, username );
       
   480         
       
   481         iImCacheUpdater =
       
   482             iImCacheFactory->CreateUpdaterL( iServiceId, username, EFalse );
       
   483         CleanupStack::PopAndDestroy( &username );
       
   484         }
       
   485     }
       
   486 
       
   487 // End of file