imstutils/imconversationview/imcvuiapp/src/cimcvappmessageextensionshandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:18 +0200
changeset 0 5e5d6b214f4f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  message extention class
*
*/


#include "cimcvappmessageextensionshandler.h"
#include "cimcvenginefactory.h"
#include <eikrted.h>
#include <txtrich.h>
#include "imcvlogger.h"
#include "cimcvappsmileyutil.h"
#include "imcvuiliterals.h"
#include "cimcvengine.h"


// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::CIMCVAppMessageExtensionsHandler
// Constructor
// -----------------------------------------------------------------------------
//
CIMCVAppMessageExtensionsHandler::CIMCVAppMessageExtensionsHandler( MIMCVUiAppSkinVariant& aSkinVariant, 
                                                                    MIMCVAppUi& aAppUi,
                                                                    MIMCVEngineFactory& aEngineFactory )
    :iSkinVariant( aSkinVariant ),
    iAppUi( aAppUi ),
    iEngineFactory( aEngineFactory )
    {
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::~CIMCVAppMessageExtensionsHandler
// Destructor
// -----------------------------------------------------------------------------
//
CIMCVAppMessageExtensionsHandler::~CIMCVAppMessageExtensionsHandler()
    {
    iExtensionArray.ResetAndDestroy();
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::NewL
// Symbian two phased constructor
// -----------------------------------------------------------------------------
//
CIMCVAppMessageExtensionsHandler* CIMCVAppMessageExtensionsHandler::NewL(
                                MIMCVUiAppSkinVariant& aSkinVariant,
                                MIMCVAppUi& aAppUi,
                                MIMCVEngineFactory& aEngineFactory,
                                TBool /*aAddSmileyHandler = ETrue */)
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::CIMCVAppMessageExtensionsHandler()    start" ));
    CIMCVAppMessageExtensionsHandler* self = 
                new ( ELeave ) CIMCVAppMessageExtensionsHandler(aSkinVariant,aAppUi,aEngineFactory);
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::CIMCVAppMessageExtensionsHandler()    end" ));
    return self;
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ConstructL
// Symbian OS Constructor
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::ConstructL()
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConstructL()	start" ));
    //get the count of number of services
    RPointerArray<CIMCVEngine>& serviceEngines = iEngineFactory.GetServiceEngines();
    for(TInt i=0; i<serviceEngines.Count() ; i++)
        {
        CIMCVAppSmileyUtil* smiley = CIMCVAppSmileyUtil::NewL(iSkinVariant, iAppUi, EMessageExtensionSmiley, *serviceEngines[i] );
        CleanupStack::PushL( smiley );
        User::LeaveIfError( iExtensionArray.Append( smiley ));
        CleanupStack::Pop( smiley ); 
        } 
   IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConstructL()	end" ));
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::CreateServiceSmileyL
// Symbian OS Constructor
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::CreateServiceSmileyL( TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::HandleNewServiceL()  start" ));
    TInt error = KErrNone;
    CIMCVEngine& engine = iEngineFactory.GetServiceEngineL( aServiceId );
    //get the count of number of services
    TInt count = iExtensionArray.Count();
    for(TInt i=0; i<count ; i++)
        {
        if( iExtensionArray[i]->ServiceId() == aServiceId )
            {
			IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::CREATE SERVICE SMILEY ALREADY EXISTS" ));
			error = KErrAlreadyExists;
            break;
            }
        }
    if( error == KErrNone )
        {
        CIMCVAppSmileyUtil* smiley = CIMCVAppSmileyUtil::NewL(iSkinVariant, iAppUi, EMessageExtensionSmiley, engine );
        CleanupStack::PushL( smiley );
        User::LeaveIfError( iExtensionArray.Append( smiley ));
        CleanupStack::Pop( smiley ); 
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::HandleNewServiceL()  end" ));
    }
// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::DeleteServiceSmileyL
// Symbian OS Constructor
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::DeleteServiceSmileyL( TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::HandleServiceDeletedL()  start" ));
    TInt count = iExtensionArray.Count();
    for(TInt i=0; i<count ; i++)
        {
        if( iExtensionArray[i]->ServiceId() == aServiceId )
            {
			IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::DELET SMILEY SERVICES" ));
            MIMCVAppMessageExtension* smiley = iExtensionArray[ i ];
            iExtensionArray.Remove( i );
            delete smiley;
            smiley = NULL;
            iExtensionArray.Compress();
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::HandleServiceDeletedL()  end" ));
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ProcessMessageLC
// Process messages trough extensions.
// -----------------------------------------------------------------------------
//
HBufC* CIMCVAppMessageExtensionsHandler::ProcessMessageLC( 
                                            CEikRichTextEditor& aEditor,
                                            TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ProcessMessageLC()	start" ));
    HBufC* msg = ExtensionToStringLC( aEditor, aServiceId );
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->Reset( );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ProcessMessageLC()	end" ));
    return msg;
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ExtensionToStringL
// Convert extensions to strings.
// -----------------------------------------------------------------------------
//
HBufC* CIMCVAppMessageExtensionsHandler::ExtensionToStringLC( 
                                            CEikRichTextEditor& aEditor,
                                            TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ExtensionToStringLC()	start" ));
    HBufC* text = HBufC::NewMaxLC(KDefaultMsgLength );
    TPtr tBuf( text->Des() );

    HBufC* msgBuf = aEditor.GetTextInHBufL();
    if(!msgBuf)
        {
        tBuf.Zero();
        return text;	
        }
    CleanupStack::PushL( msgBuf );
    TPtr msgPtr( msgBuf->Des() );
   
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            tBuf = msgPtr;
            iExtensionArray[ a ]->ExtensionToStringL( aEditor, tBuf );
            CleanupStack::PopAndDestroy( msgBuf );
            msgBuf = NULL;
            msgBuf = tBuf.AllocLC();
            TPtr newPtr( msgBuf->Des() );
            msgPtr.Set( newPtr );
            break;
            }       
        }
    
    // Remove all CEditableText::EZeroWidthNoBreakSpace characters
    // which are used to go around CRichText editor bug
    // when msg contains only smiley pictures
    // These rows below can be removed when CRichText editor
    // don't need anyrmore this "hack"
    tBuf = msgPtr;

    TInt length = tBuf.Length();
	for( TInt i = length-1; i >=0 ; --i )
		{
		if( tBuf[ i ] ==  CEditableText::EZeroWidthNoBreakSpace )
			{
			tBuf.Delete( i, 1 ); // removing 1 character
			}
		}
    CleanupStack::PopAndDestroy( msgBuf );
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ExtensionToStringLC()	end" ));
    return text;
    }


// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::DeleteExtensionIcon
// Find right extension handler and delete extension
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::DeleteExtensionL( CEikRichTextEditor& aEditor,
        TInt aServiceId ,
        TMessageExtensionTypes /*aType*/,
        TInt aPos )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::DeleteExtensionL()	start" ));
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->DeleteExtensionL( aEditor, aPos );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::DeleteExtensionL()	end" ));
	}

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL
// Convert all extensions from strings to extensions in area.
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL( 
                                                CEikRichTextEditor& aEditor,
                                                TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL()	start" ));
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->ConvertSelectionToExtensionL( aEditor );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL()	end" ));
    }
    
// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL
// Convert all extensions from strings to extensions in area.
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL( 
                       CRichText& aRichText, 
                       TCursorSelection& aSelection,
                       TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL()	start" ));
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->ConvertSelectionToExtensionL( aRichText, aSelection );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToExtensionL()	end" ));
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL
// Convert all extensions from extensions to strings in area.
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL( 
                    CEikRichTextEditor& aEditor, 
                    TInt aServiceId,
                    TBool aPreserve /*= EFalse*/ )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL()	start" ));
    
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->ConvertSelectionToStringL( aEditor, aPreserve );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL()	end" ));
    }


// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::SizeChanged
// Convert all extensions from extensions to strings in area.
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::SizeChanged( TSize& aSize,
        TInt aServiceId )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::SizeChanged()	start" ));
   
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->SizeChanged( aSize );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::SizeChanged()	end" ));
    }

// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL
// Convert all extensions from extensions to strings in area.
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL(
    CEikRichTextEditor& aEditor,
    TInt aServiceId ,
    TDes& aResultString,
    TCursorSelection& aSelectionAfterConversion,
    TBool aPreserve )
    {
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL()	start" ));
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->ConvertSelectionToStringL(
                    aEditor, aResultString, aSelectionAfterConversion, aPreserve );
            break;
            }
        }
    IM_CV_LOGS(TXT("CIMCVAppMessageExtensionsHandler::ConvertSelectionToStringL()	end" ));
    }
    
// -----------------------------------------------------------------------------
// CIMCVAppMessageExtensionsHandler::InsertExtensionIcon
// Find right extension handler and insert extension
// -----------------------------------------------------------------------------
//
void CIMCVAppMessageExtensionsHandler::InsertExtensionL( CEikRichTextEditor& aEditor,
                                                    TInt aServiceId ,
                                                    TMessageExtensionTypes aType,                                                    
                                                    TBool& aCancelled,
                                                    TSize size)
    {
    for( TInt a( 0 ); a < iExtensionArray.Count(); ++a )
        {
        if( aType == iExtensionArray[ a ]->Type() && aServiceId == iExtensionArray[a]->ServiceId() )
            {
            iExtensionArray[ a ]->InsertExtensionL( aEditor, aCancelled, size );
            break;
            }
        }
    }
    
// end of file