htiui/HtiServicePlugins/HtiScreenshotServicePlugin/src/HtiScreenshotServicePlugin.cpp
branchRCL_3
changeset 18 48060abbbeaf
parent 17 d40e813b23c0
child 19 b3cee849fa46
--- a/htiui/HtiServicePlugins/HtiScreenshotServicePlugin/src/HtiScreenshotServicePlugin.cpp	Thu Jul 15 18:39:46 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2559 +0,0 @@
-/*
-* Copyright (c) 2009 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:  SysInfoPlugin implementation
-*
-*/
-
-
-// INCLUDE FILES
-#include "../../../symbian_version.hrh"
-
-
-#include "HtiScreenshotServicePlugin.h"
-#include <HtiDispatcherInterface.h>
-#include <HtiLogging.h>
-
-#include <imageconversion.h>
-#include <ezcompressor.h>
-#include <hal.h>
-
-#include <AknLayoutConfig.h>
-#include <apgtask.h> 
-#include <AknCapServerDefs.h>
-
-#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
-#include <alf/alfdrawer.h>
-#endif
-
-// CONSTANTS
-const static TUid KScreenshotServiceUid = {0x1020DEC3};
-
-enum TScreenCommands
-    {
-    // Normal screencapture
-    ECmdScreen                = 0x01,
-    ECmdScreenRegion          = 0x02,
-    ECmdScreenZip             = 0x03,
-    ECmdScreenRegionZip       = 0x04,
-
-    // Text recognition
-    ECmdTextRcg               = 0x10,
-    ECmdTextRcg_u             = 0x11,
-
-    // Text bitmap
-    ECmdTextBitmap            = 0x12,
-    ECmdTextBitmap_u          = 0x13,
-
-    // Screencapture in series
-    ECmdScreenSeries          = 0x21,
-    ECmdScreenRegionSeries    = 0x22,
-    ECmdScreenZipSeries       = 0x23,
-    ECmdScreenRegionZipSeries = 0x24,
-
-    // Selects the screen to use
-    ECmdSelectScreen          = 0x30,
-
-    // Gets the current screen size and orientation
-    ECmdScreenMode            = 0x3A,
-    
-    // Rotates the screen to portrait or landscape
-    ECmdRotateScreen          = 0x3B,
-
-    // Screencapture on updated part of screen only
-    ECmdDeltaCaptureMask           = 0x80,
-    ECmdDeltaScreen                = 0x81,
-    ECmdDeltaScreenRegion          = 0x82,
-    ECmdDeltaScreenZip             = 0x83,
-    ECmdDeltaScreenRegionZip       = 0x84,
-    ECmdDeltaScreenReset           = 0x85
-    //ECmdDeltaScreenSeries          = 0xA1,
-    //ECmdDeltaScreenRegionSeries    = 0xA2,
-    //ECmdDeltaScreenZipSeries       = 0xA3,
-    //ECmdDeltaScreenRegionZipSeries = 0xA4
-    };
-
-enum TScreenResponse
-    {
-    ERspOk = 0xF0,
-    ERspNotFound = 0xF1
-    };
-
-enum THtiFontAttributes
-    {
-    EHtiFontAttBold = 0x01,
-    EHtiFontAttItalic = 0x02,
-    EHtiFontAttNotAA = 0x04,
-    EHtiFontAttPrintPositionFlag = 0x08,
-    EHtiFontAttPrintPositionValue = 0x10
-    };
-
-const static TInt KHtiFontAttSuperscriptValue = 0;
-const static TInt KHtiFontAttSubscriptValue = 1;
-
-//1 byte for cmd and 2*4 for 4 coordinates
-const static TInt KMinScreenRegionCmdLength = 9;
-const static TInt KScreenDisplayOffset = 1;
-const static TInt KScreenMIMEOffset = KScreenDisplayOffset + 1;
-const static TInt KScreenScreenNumber = KScreenMIMEOffset + 8;
-const static TInt KRegionDisplayOffset = KMinScreenRegionCmdLength;
-const static TInt KRegionMIMEOffset = KRegionDisplayOffset + 1;
-const static TInt KRegionScreenNumber = KRegionMIMEOffset + 8;
-
-const static TInt KSeriesDurationOffset = 1;
-const static TInt KSeriesIntervalOffset = KSeriesDurationOffset + 4;
-const static TInt KSeriesDisplayOffset = KSeriesIntervalOffset + 4;
-const static TInt KSeriesMIMEOffset = KSeriesDisplayOffset + 1;
-const static TInt KSeriesScreenNumber = KSeriesMIMEOffset + 8;
-const static TInt KMinSeriesCmdLength = KSeriesMIMEOffset;
-
-const static TInt KRegionSeriesTlX = KSeriesDisplayOffset + 1;
-const static TInt KRegionSeriesTlY = KRegionSeriesTlX + 2;
-const static TInt KRegionSeriesBlX = KRegionSeriesTlY + 2;
-const static TInt KRegionSeriesBlY = KRegionSeriesBlX + 2;
-const static TInt KRegionSeriesMIMEOffset = KRegionSeriesBlY + 2;
-const static TInt KRegionSeriesScreenNumber = KRegionSeriesMIMEOffset + 8;
-const static TInt KMinRegionSeriesCmdLength = KRegionSeriesMIMEOffset;
-
-const static TInt KDeltaResetCmdLength = 1;
-const static TInt KScreenModeCmdLength = 1;
-
-const static TInt KScreenNrOffset = 1;
-const static TInt KSelectScreenCmdLength = 2;
-const static TInt KRotateScreenCmdLength = 2;
-
-_LIT( KSeriesShotPath, "c:\\Hti\\SeriesShot\\" );
-
-//errors' descriptions
-_LIT8( KErrDescrInvalid, "invalid arguments" );
-_LIT8( KErrDescrInvalidMode, "invalid color mode" );
-_LIT8( KErrDescrRegiontEmpty, "region is empty" );
-_LIT8( KErrDescrRegionNotNormailized, "region is not normalized" );
-_LIT8( KErrDescrRegionOutOfScreen, "region is out of screen" );
-_LIT8( KErrDescrUnknownCommand, "unknown command" );
-_LIT8( KErrDescrFailedConvert, "failed to convert to image format" );
-_LIT8( KErrDescrFailedCompress, "failed to compress" );
-_LIT8( KErrDescrMIMENotSupported, "MIME type not supported" );
-_LIT8( KErrDescrScreenNotSupported, "screen not supported" );
-
-_LIT( KScreenshotPanic, "Screenshot plug-in invalid state" );
-
-//_LIT(KS60Sans, "Series 60 Sans");
-//_LIT(KS60SansTitleBold, "Series 60 Sans TitleSmBd");
-
-//const TInt KFonHeighMin = 110;
-//const TInt KFonHeighMax = 190;
-/*
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::InitFontCache()
-    {
-    //temporary
-    //just put harcoded data
-    //should be either external file or auto-defined based on logical fonts
-    //or some test app
-    TFontSpec fs;
-    fs.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
-    //primary font
-    fs.iTypeface.iName = KS60Sans;
-    fs.iHeight = 161;
-    fs.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
-    iFontCache.Append(fs);
-
-    fs.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
-
-    //Series 60 Sans TitleSmBd, 183
-    fs.iTypeface.iName = KS60SansTitleBold;
-    fs.iHeight = 183;
-    iFontCache.Append(fs);
-
-    //Series 60 Sans TitleSmBd, 172
-    fs.iTypeface.iName = KS60SansTitleBold;
-    fs.iHeight = 172;
-    iFontCache.Append(fs);
-
-    //Series 60 Sans,           122
-    fs.iTypeface.iName = KS60Sans;
-    fs.iHeight = 122;
-    iFontCache.Append(fs);
-    //Series 60 Sans,           116
-    fs.iTypeface.iName = KS60Sans;
-    fs.iHeight = 116;
-    iFontCache.Append(fs);
-
-    //Series 60 Sans TitleSmBd, 138
-    fs.iTypeface.iName = KS60SansTitleBold;
-    fs.iHeight = 138;
-    iFontCache.Append(fs);
-    }
-*/
-
-// ----------------------------------------------------------------------------
-TInt ImageDifferenceL( CFbsBitmap* aImage1, CFbsBitmap* aImage2,
-                       CFbsBitmap* &aResult, TRect &aRect )
-    {
-    HTI_LOG_TEXT( "ImageDifferenceL()" );
-
-    // By default return coordinates of the full image
-    aRect = TRect( 0, 0, aImage2->SizeInPixels().iWidth,
-                  aImage2->SizeInPixels().iHeight );
-
-//1. check that aImage1 and aImage2 are valid and can be compared
-    if ( aImage1 == NULL || aImage2 == NULL )
-        {
-        HTI_LOG_TEXT( "return KErrArgument" );
-        return KErrArgument;
-        }
-
-    if ( aImage1->SizeInPixels() != aImage2->SizeInPixels() )
-        {
-        HTI_LOG_TEXT( "return KErrGeneral (size)" );
-        return KErrGeneral;
-        }
-
-    if ( aImage1->DisplayMode() != aImage2->DisplayMode() )
-        {
-        HTI_LOG_TEXT( "return KErrGeneral (displaymode)" );
-        return KErrGeneral;
-        }
-
-
-//2. iterate through images from each border and compare to findout outline for diff region
-    TSize orgSize = aImage1->SizeInPixels();
-
-    TBitmapUtil srcBmpIterator1( aImage1 );
-    TBitmapUtil srcBmpIterator2( aImage2 );
-
-    srcBmpIterator1.Begin( TPoint( 0, 0 ) );
-    srcBmpIterator2.Begin( TPoint( 0, 0 ), srcBmpIterator1 );
-
-    TRect diffOutline = TRect( -1, -1, -1, -1 );
-
-    //2.1 top border iteration
-    TPoint c( 0,0 );
-    for ( ; c.iY < orgSize.iHeight && diffOutline.iTl.iY == -1; ++c.iY )
-        {
-        c.iX = 0;
-        srcBmpIterator1.SetPos( c );
-        srcBmpIterator2.SetPos( c );
-        for ( ; c.iX < orgSize.iWidth && diffOutline.iTl.iY == -1; ++c.iX )
-            {
-            if ( srcBmpIterator1.GetPixel() != srcBmpIterator2.GetPixel() )
-                {
-                diffOutline.iTl.iY = c.iY;
-                }
-
-            srcBmpIterator1.IncXPos();
-            srcBmpIterator2.IncXPos();
-            }
-        }
-
-    //2.2 bottom iteration
-    c.SetXY( 0, orgSize.iHeight - 1 );
-    for ( ; c.iY >= diffOutline.iTl.iY && diffOutline.iBr.iY == -1; --c.iY )
-        {
-        c.iX = 0;
-        srcBmpIterator1.SetPos( c );
-        srcBmpIterator2.SetPos( c );
-        for (; c.iX < orgSize.iWidth && diffOutline.iBr.iY == -1; ++c.iX )
-            {
-            if ( srcBmpIterator1.GetPixel() != srcBmpIterator2.GetPixel() )
-                {
-                diffOutline.iBr.iY = c.iY;
-                }
-
-            srcBmpIterator1.IncXPos();
-            srcBmpIterator2.IncXPos();
-            }
-        }
-
-    //2.3 left, goes in vertical lines
-    c.SetXY( 0, diffOutline.iTl.iY );
-    for ( ; c.iX < orgSize.iWidth && diffOutline.iTl.iX == -1; ++c.iX )
-        {
-        c.iY = diffOutline.iTl.iY;
-        srcBmpIterator1.SetPos( c );
-        srcBmpIterator2.SetPos( c );
-        for ( ; c.iY <= diffOutline.iBr.iY && diffOutline.iTl.iX == -1; ++c.iY )
-
-            {
-            if ( srcBmpIterator1.GetPixel() != srcBmpIterator2.GetPixel() )
-                {
-                diffOutline.iTl.iX = c.iX;
-                }
-
-            srcBmpIterator1.IncYPos();
-            srcBmpIterator2.IncYPos();
-            }
-        }
-    //2.4 right, goes in vertical lines
-    c.SetXY( orgSize.iWidth - 1, diffOutline.iTl.iY );
-    for ( ; c.iX >= diffOutline.iTl.iX && diffOutline.iBr.iX == -1; --c.iX )
-        {
-        c.iY = diffOutline.iTl.iY;
-        srcBmpIterator1.SetPos( c );
-        srcBmpIterator2.SetPos( c );
-        for ( ; c.iY <= diffOutline.iBr.iY && diffOutline.iBr.iX == -1; ++c.iY )
-
-            {
-            if ( srcBmpIterator1.GetPixel() != srcBmpIterator2.GetPixel() )
-                {
-                diffOutline.iBr.iX = c.iX;
-                }
-
-            srcBmpIterator1.IncYPos();
-            srcBmpIterator2.IncYPos();
-            }
-        }
-    srcBmpIterator2.End();
-    srcBmpIterator1.End();
-
-    //3. if there is some diff create CFbsBitmap in aResult and copy outlined image from aImage2
-    if ( diffOutline.iTl.iX == -1 &&
-         diffOutline.iTl.iY == -1 &&
-         diffOutline.iBr.iX == -1 &&
-         diffOutline.iBr.iY == -1 )
-        {
-        // No difference found
-        aRect = TRect( 0, 0, 0, 0 );
-        HTI_LOG_TEXT( "return KErrNotFound" );
-        return KErrNotFound;
-        }
-
-    aRect = diffOutline;
-
-    HTI_LOG_FORMAT( "Tlx - %d", aRect.iTl.iX );
-    HTI_LOG_FORMAT( "Tly - %d", aRect.iTl.iY );
-    HTI_LOG_FORMAT( "Bty - %d", aRect.iBr.iX );
-    HTI_LOG_FORMAT( "Bry - %d", aRect.iBr.iY );
-
-    // The bottom right co-ordinate is not included in the rectange
-    // (see TRect documentation) so we need to stretch the rectange
-    // for BitBlt to get the correct sized image.
-
-    TRect captureRect( diffOutline.iTl.iX, diffOutline.iTl.iY,
-                       diffOutline.iBr.iX + 1, diffOutline.iBr.iY + 1 );
-
-    aResult = new (ELeave) CFbsBitmap();
-    User::LeaveIfError( aResult->Create( captureRect.Size(), aImage2->DisplayMode() ) );
-    CleanupStack::PushL( aResult );
-
-    CFbsBitmapDevice* bmpDevice = CFbsBitmapDevice::NewL( aResult );
-    CleanupStack::PushL( bmpDevice );
-
-    CFbsBitGc* bmpCtx;
-    bmpDevice->CreateContext( bmpCtx );
-    bmpCtx->BitBlt( TPoint( 0, 0 ), aImage2, captureRect );
-
-    delete bmpCtx;
-    bmpCtx = NULL;
-
-    CleanupStack::PopAndDestroy(); // bmpDevice
-    CleanupStack::Pop(); // aResult
-
-    HTI_LOG_TEXT( "return KErrNone" );
-    return KErrNone;
-    }
-
-// ----------------------------------------------------------------------------
-CICLHandler::CICLHandler( CImageEncoder* aService, MICLObserver* anObserver ):
-    CActive( EPriorityStandard ),
-    iObserver( anObserver ),
-    iService( aService )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-// ----------------------------------------------------------------------------
-CICLHandler::~CICLHandler()
-    {
-    Cancel();
-    }
-
-// ----------------------------------------------------------------------------
-void CICLHandler::Start()
-    {
-    SetActive();
-    }
-
-// ----------------------------------------------------------------------------
-void CICLHandler::RunL()
-    {
-    iObserver->ICLComplete( iStatus.Int() );
-    }
-
-// ----------------------------------------------------------------------------
-void CICLHandler::DoCancel()
-    {
-    iService->Cancel();
-    }
-
-/*
-// ----------------------------------------------------------------------------
-TInt CICLHandler::RunError(TInt aError)
-    {
-
-    }
-*/
-
-// ----------------------------------------------------------------------------
-// Create instance of concrete ECOM interface implementation
-CHtiScreenshotServicePlugin* CHtiScreenshotServicePlugin::NewL()
-    {
-    CHtiScreenshotServicePlugin* self = new (ELeave) CHtiScreenshotServicePlugin;
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-// Constructor
-CHtiScreenshotServicePlugin::CHtiScreenshotServicePlugin():
-    iScreen( NULL ),
-    iEncodedBitmap( NULL ),
-    iScreenDevice( NULL ),
-    iBitmapEncoder( NULL ),
-    iICLHandler( NULL ),
-    iCompress( EFalse ),
-    iDeltaCapture( EFalse ),
-    iPreviousBitmap( NULL )
-    {
-    }
-
-// ----------------------------------------------------------------------------
-CHtiScreenshotServicePlugin::~CHtiScreenshotServicePlugin()
-    {
-    HTI_LOG_FUNC_IN( "~CHtiScreenshotServicePlugin" );
-
-    iFontCache.Close();
-
-    delete iScreen;
-    delete iEncodedBitmap;
-
-    delete iICLHandler;
-    delete iBitmapEncoder;
-
-    delete iScreenDevice;
-
-    delete iSeriesShot;
-
-    if ( iPreviousBitmap )
-        delete iPreviousBitmap;
-
-    iWs.Close();
-    HTI_LOG_FUNC_OUT( "~CHtiScreenshotServicePlugin" );
-    }
-
-// ----------------------------------------------------------------------------
-// Second phase construction.
-void CHtiScreenshotServicePlugin::ConstructL()
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::ConstructL" );
-    User::LeaveIfError( iWs.Connect() );
-
-    iScreenDevice = new ( ELeave ) CWsScreenDevice( iWs );
-    User::LeaveIfError( iScreenDevice->Construct() );
-
-    //InitFontCache();
-
-    iSeriesShot = CSeriesShot::NewL( this );
-
-    iPreviousBitmap = new ( ELeave ) CFbsBitmap;
-
-    //SelectEncoder( KImageTypeBMPUid );
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::ConstructL" );
-    }
-
-// ----------------------------------------------------------------------------
-TBool CHtiScreenshotServicePlugin::IsBusy()
-    {
-    if ( iICLHandler )
-        {
-        return iICLHandler->IsActive();
-        }
-
-    if ( iSeriesShot->IsOngoing() )
-        {
-        return ETrue;
-        }
-
-    return iEncodedBitmap != NULL;
-    }
-
-// ----------------------------------------------------------------------------
-inline TInt CHtiScreenshotServicePlugin::ParseInt16( const TUint8* aStart )
-    {
-    return aStart[0] + (aStart[1]<<8);
-    }
-
-// ----------------------------------------------------------------------------
-inline TInt CHtiScreenshotServicePlugin::ParseInt32( const TUint8* aStart )
-    {
-    return aStart[0] + (aStart[1]<<8) + (aStart[2]<<16) + (aStart[3]<<24);
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::SendTextRecgReplyL(
-                                    const TBool aResult,
-                                    const TRect& aLocation,
-                                    const TInt aFontIndex)
-    {
-    HTI_LOG_FUNC_IN( "SendTextRecgReplyL" );
-    HBufC8* sendMsg = HBufC8::NewL( 10 );
-    CleanupStack::PushL( sendMsg );
-    if ( aResult )
-        {
-        sendMsg->Des().Append( ERspOk );
-        TUint16 co = aLocation.iTl.iX;
-        sendMsg->Des().Append( (TUint8*)(&co), 2 );
-        co = aLocation.iTl.iY;
-        sendMsg->Des().Append( (TUint8*)(&co), 2 );
-        co = aLocation.iBr.iX;
-        sendMsg->Des().Append( (TUint8*)(&co), 2 );
-        co = aLocation.iBr.iY;
-        sendMsg->Des().Append( (TUint8*)(&co), 2 );
-        sendMsg->Des().Append( (TUint8)aFontIndex );
-        }
-    else
-        {
-        sendMsg->Des().Append( ERspNotFound );
-        sendMsg->Des().AppendFill( 0, 5 );
-        }
-
-    User::LeaveIfError( iDispatcher->DispatchOutgoingMessage(
-                            sendMsg,
-                            KScreenshotServiceUid) );
-
-    CleanupStack::Pop();
-    HTI_LOG_FUNC_OUT( "SendTextRecgReplyL" );
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::CopyUnicode( TDes & aTo, const TDesC8& aFrom )
-{
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::CopyUnicode" );
-    //aTo.Copy( reinterpret_cast<const TUint16*>(aFrom.Ptr()), aFrom.Length() );
-    TInt len = aFrom.Length()>>1;
-    aTo.SetLength( len );
-    for ( TInt i = 0; i < len; ++i )
-    {
-        aTo[i] = (TUint16)aFrom[i<<1] + (((TUint16)aFrom[(i<<1)+1])<<8);
-    }
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::CopyUnicode" );
-}
-
-// ----------------------------------------------------------------------------
-TInt CHtiScreenshotServicePlugin::ParseString( const TDesC8& aRequest,
-                                        TInt anOffset,
-                                        TBool aUnicode,
-                                        TDes& aResult)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::ParseString" );
-    //validate parameters
-    //if offset outside the string return empty string
-    if ( anOffset >= aRequest.Size() )
-        {
-        return anOffset;
-        }
-
-    TInt len = aRequest[ anOffset ];
-    HTI_LOG_FORMAT( "len %d", len );
-
-    if ( len> aResult.MaxLength() )
-        {
-        return KErrBadDescriptor;
-        }
-
-    TInt nextOffset = ( aUnicode ? len * 2 : len ) + anOffset + 1;
-    HTI_LOG_FORMAT( "nextOffset %d", nextOffset );
-    HTI_LOG_FORMAT( "reqSize %d", aRequest.Size() );
-    if ( nextOffset > aRequest.Size() )
-        {
-        return KErrArgument;
-        }
-
-    if ( aUnicode )
-        {
-        //const TUint8* ptr = aRequest.Mid( anOffset + 1, len * 2 ).Ptr();
-        //aResult.Copy( (const TUint16*)ptr, len );
-        CopyUnicode( aResult, aRequest.Mid( anOffset + 1, len * 2 ) );
-        }
-    else
-        {
-        aResult.Copy( aRequest.Mid( anOffset + 1, len ) );
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::ParseString" );
-    return nextOffset;
-    }
-
-// ----------------------------------------------------------------------------
-TInt CHtiScreenshotServicePlugin::ParseFontSpec( const TDesC8& aRequest,
-                    TInt anOffset,
-                    TBool aUnicode,
-                    TFontSpec& aResult)
-    {
-    if ( anOffset >= aRequest.Size() )
-        {
-        return KErrArgument;
-        }
-
-    //get font name
-    TPtr tn = aResult.iTypeface.iName.Des();
-    TInt offset = ParseString( aRequest,
-                    anOffset,
-                    aUnicode,
-                    tn );
-
-    if ( offset > anOffset )
-        {
-        HTI_LOG_DES(aResult.iTypeface.iName);
-        //check that we have valid descr
-        if ( offset + 2 <= aRequest.Size() )
-            {
-            aResult.iHeight = ParseInt16( aRequest.Ptr() + offset );
-            HTI_LOG_FORMAT( "font height %d", aResult.iHeight );
-            //check style byte
-            TUint8 style = aRequest[ offset + 2 ];
-            HTI_LOG_FORMAT( "style %d", style );
-
-            //stroke bit
-            if ( style & EHtiFontAttBold )
-                {
-                aResult.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
-                }
-            else
-                {
-                aResult.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
-                }
-            //posture
-            if ( style & EHtiFontAttItalic )
-                {
-                aResult.iFontStyle.SetPosture(EPostureItalic);
-                }
-            else
-                {
-                aResult.iFontStyle.SetPosture(EPostureUpright);
-                }
-            //bitmap glyph type
-            if ( style & EHtiFontAttNotAA )
-                {
-                aResult.iFontStyle.SetBitmapType( EMonochromeGlyphBitmap );
-                }
-            else
-                {
-                aResult.iFontStyle.SetBitmapType( EAntiAliasedGlyphBitmap );
-                }
-            //print position
-            if ( style & EHtiFontAttPrintPositionFlag )
-                {
-                TInt printPos = style & EHtiFontAttPrintPositionValue;
-                if ( printPos == KHtiFontAttSuperscriptValue )
-                    {
-                    aResult.iFontStyle.SetPrintPosition( EPrintPosSuperscript );
-                    }
-                else if ( printPos == KHtiFontAttSubscriptValue )
-                    {
-                    aResult.iFontStyle.SetPrintPosition( EPrintPosSubscript );
-                    }
-                }
-            else
-                {
-                aResult.iFontStyle.SetPrintPosition( EPrintPosNormal );
-                }
-            return offset + 3;
-            }
-        else
-            {
-            return KErrArgument;
-            }
-        }
-    else
-        {
-        return offset<0?offset:KErrArgument;
-        }
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::ProcessTextRcgMessageL(
-                                    const TDesC8& aMessage)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::ProcessTextRcgMessageL" );
-    TBool unicode = aMessage[0] & 0x1;
-
-    TBuf<0xFF> text;
-
-    TInt offset = ParseString(aMessage, 1, unicode, text);
-
-    HTI_LOG_FORMAT( "offset %d ", offset );
-    if ( offset > 1 )
-        {
-        HTI_LOG_DES(text);
-
-        if ( offset + 1 < aMessage.Size() )
-            {
-            TInt numOfFonts = aMessage[ offset ];
-            HTI_LOG_FORMAT( "num of fonts %d", numOfFonts );
-            iFontCache.Reset();
-            TInt nextOffset  = offset + 1;
-            for ( TInt i = 0; i < numOfFonts; ++i )
-                {
-                TFontSpec fontSpec;
-                nextOffset = ParseFontSpec(aMessage,
-                                            nextOffset,
-                                            unicode,
-                                            fontSpec);
-                if ( nextOffset < 0 )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                        nextOffset,
-                        KErrDescrInvalid,
-                        KScreenshotServiceUid);
-                    return;
-                    }
-                else
-                    {
-                    iFontCache.Append( fontSpec );
-                    }
-                }
-
-            //parameters parsing END
-            //get screenshot
-            TRect empty;
-            CreateBitmapL( empty, ENone );
-
-            //call text rcg routines
-            TInt fontIndex;
-            TRect resultRect;
-
-            //recognize text using fonts from iFontCache
-            TBool result = RecognizeTextL( text, resultRect, fontIndex );
-
-            SendTextRecgReplyL( result, resultRect, fontIndex );
-
-            delete iScreen;
-            iScreen = NULL;
-            }
-        else
-            {
-            //no fonts data
-            iDispatcher->DispatchOutgoingErrorMessage(
-                        KErrArgument,
-                        KErrDescrInvalid,
-                        KScreenshotServiceUid);
-
-            }
-        }
-    else if ( offset == 1 )
-        {
-        //empty text
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        KErrArgument,
-                        KErrDescrInvalid,
-                        KScreenshotServiceUid);
-        }
-    else
-        {
-        //error
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        offset,
-                        KErrDescrInvalid,
-                        KScreenshotServiceUid);
-        }
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::ProcessTextRcgMessageL" );
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::ProcessTextBitmapMessageL(
-                                    const TDesC8& aMessage)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::ProcessTextBitmapMessageL" );
-    TBool unicode = aMessage[0] & 0x1;
-
-    TDisplayMode displayMode = ENone;
-    //check display
-    if ( aMessage.Size() > KScreenDisplayOffset )
-        {
-        displayMode = (TDisplayMode)aMessage[KScreenDisplayOffset];
-        if ( displayMode >= EColorLast )
-            {
-            iDispatcher->DispatchOutgoingErrorMessage(
-                            KErrArgument,
-                            KErrDescrInvalidMode,
-                            KScreenshotServiceUid);
-            return;
-            }
-        }
-
-    //check mime
-    TPtrC8 mime;
-    if ( aMessage[KScreenMIMEOffset] > 0 &&
-        ( aMessage[KScreenMIMEOffset] + KScreenMIMEOffset+1 ) < aMessage.Size() )
-        {
-        mime.Set( aMessage.Mid(KScreenMIMEOffset+1, aMessage[KScreenMIMEOffset] ) );
-        if ( !IsMIMETypeSupported( mime ) )
-            {
-            iDispatcher->DispatchOutgoingErrorMessage(
-                            KErrArgument,
-                            KErrDescrMIMENotSupported,
-                            KScreenshotServiceUid);
-            return;
-            }
-        }
-    else if ( aMessage[KScreenMIMEOffset] != 0 )
-        {
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        KErrArgument,
-                        KErrDescrInvalidMode,
-                        KScreenshotServiceUid);
-        return;
-        }
-
-    TBuf<0xFF> text;
-    TInt preTextOffset = KScreenMIMEOffset + aMessage[KScreenMIMEOffset] + 1;
-    TInt offset = ParseString( aMessage, preTextOffset, unicode, text );
-
-    HTI_LOG_FORMAT( "offset %d ", offset );
-    if ( offset == preTextOffset )
-        {
-        //empty text
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        KErrArgument,
-                        KErrDescrInvalid,
-                        KScreenshotServiceUid);
-        }
-    else if ( offset < preTextOffset )
-        {
-        //error
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        offset,
-                        KErrDescrInvalid,
-                        KScreenshotServiceUid);
-        }
-
-    HTI_LOG_DES(text);
-    TFontSpec fontSpec;
-    offset = ParseFontSpec(aMessage,
-                            offset,
-                            unicode,
-                            fontSpec);
-    if ( offset < 0 )
-        {
-        iDispatcher->DispatchOutgoingErrorMessage(
-            offset,
-            KErrDescrInvalid,
-            KScreenshotServiceUid);
-
-        return;
-        }
-
-    //check colors
-    HTI_LOG_TEXT( "check colors" );
-    if ( offset + 2*4 != aMessage.Size() )
-        {
-        iDispatcher->DispatchOutgoingErrorMessage(
-            offset,
-            KErrDescrInvalid,
-            KScreenshotServiceUid);
-        return;
-        }
-
-    //extract colors
-    TUint32 fgColor = ParseInt32( aMessage.Ptr() + offset );
-    TUint32 bgColor = ParseInt32( aMessage.Ptr() + offset + 4 );
-    HTI_LOG_FORMAT( "FG color %d", fgColor );
-    HTI_LOG_FORMAT( "BG color %d", bgColor );
-
-    //END parsing
-    //generate and return bitmap
-    CFont* useFont;
-
-    User::LeaveIfError( iScreenDevice->GetNearestFontToDesignHeightInPixels(
-                            useFont, fontSpec ) );
-
-    TDisplayMode dm = displayMode==ENone || displayMode==0?
-                                        iScreenDevice->DisplayMode():
-                                        displayMode;
-
-
-    delete iScreen;
-    iScreen = NULL;
-    iScreen = CHtiTextRcg::GetTextBitmapL(
-                            text,
-                            useFont,
-                            TRgb( fgColor ),
-                            TRgb( bgColor ),
-                            dm );
-
-    iScreenDevice->ReleaseFont( useFont );
-
-    //Encode iBitmap
-    iCompress = EFalse;
-    if ( mime.Length() == 0 )
-        {
-        EncodeBitmapL(); //use default encoder BMP
-        }
-    else
-        {
-        HTI_LOG_DES( mime );
-        EncodeBitmapL( mime );
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::ProcessTextBitmapMessageL" );
-    }
-
-/*
-// ----------------------------------------------------------------------------
-TBool CHtiScreenshotServicePlugin::RecognizeTextAllL(
-                        const TDesC& aText,
-                        TPoint& aResult)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::RecognizeTextAllL" );
-
-    TSize screenRect = iScreenDevice->SizeInPixels();
-    TInt nofTF = iScreenDevice->NumTypefaces();
-    HTI_LOG_FORMAT( "Number of typefaces %d", nofTF );
-    TBool returnValue = EFalse;
-    for ( TInt i = 0; i < nofTF; ++i )
-        {
-        TTypefaceSupport tf;
-        iScreenDevice->TypefaceSupport(tf, i);
-
-        HTI_LOG_DES(tf.iTypeface.iName);
-
-        if ( tf.iIsScalable )
-            {
-            //iterate throuh heighes
-
-            HTI_LOG_FORMAT( "num of heighs %d", tf.iNumHeights );
-            HTI_LOG_FORMAT( "min h in tw %d", tf.iMinHeightInTwips );
-            HTI_LOG_FORMAT( "max h in tw %d", tf.iMaxHeightInTwips );
-            HTI_LOG_FORMAT( "scalable %d", tf.iIsScalable );
-
-            HTI_LOG_TEXT( "-----------------------" );
-
-            TInt minHeight = Max(tf.iMinHeightInTwips, KFonHeighMin );
-            TInt maxHeight = Min(tf.iMaxHeightInTwips, KFonHeighMax );
-
-            if ( minHeight > maxHeight )
-                {
-                continue;
-                }
-
-            for ( TInt v = 0; v < 2; ++v )
-                {
-                TInt lastFontHeight = 0;
-                for ( TInt fh = minHeight; fh <= maxHeight; ++fh )
-                    {
-                    TFontSpec fs( tf.iTypeface.iName, fh );
-                    fs.iFontStyle.SetBitmapType( EAntiAliasedGlyphBitmap );
-                    switch ( v )
-                        {
-                        case 1:
-                            {
-                            fs.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
-                            HTI_LOG_TEXT( "BOLD" );
-                            }
-                            break;
-                        default:
-                            {
-                            HTI_LOG_TEXT( "DEFAULT" );
-                            }
-                        }
-                    HTI_LOG_FORMAT( "hh  %d", fh );
-
-                    CFont* useFont = NULL;
-
-                    iScreenDevice->GetNearestFontToDesignHeightInTwips(useFont, fs);
-
-                    if ( screenRect.iHeight < useFont->HeightInPixels() ||
-                         screenRect.iWidth < useFont->MaxNormalCharWidthInPixels()
-                        )
-                        {
-                        break;
-                        }
-
-                    if ( useFont->HeightInPixels() == lastFontHeight )
-                        {
-                        continue;
-                        }
-
-
-                    lastFontHeight = useFont->HeightInPixels();
-
-                    returnValue = iTextRcg.RecognizeTextL(
-                                                iScreen,
-                                                aText,
-                                                useFont,
-                                                aResult);
-                    //HTI_LOG_TEXT( "ReleaseFont" );
-                    iScreenDevice->ReleaseFont(useFont);
-
-                    if ( returnValue )
-                        {
-                        HTI_LOG_TEXT( "Found" );
-                        HTI_LOG_DES( aText );
-                        HTI_LOG_DES( tf.iTypeface.iName );
-                        HTI_LOG_FORMAT( "Font height in twips %d", fh );
-                        HTI_LOG_FORMAT( "X %d", aResult.iX );
-                        HTI_LOG_FORMAT( "Y %d", aResult.iY );
-                        return returnValue;
-                        }
-                    }
-                }
-            }
-        else
-            {//non scal. font
-            TFontSpec fs( tf.iTypeface.iName,0 ); //height doesn't matter for
-                                                //not scalable font
-
-            CFont* useFont = NULL;
-            //HTI_LOG_TEXT( "GetFont" );
-            iScreenDevice->GetNearestFontToDesignHeightInTwips( useFont, fs );
-
-            returnValue = iTextRcg.RecognizeTextL(
-                                        iScreen,
-                                        aText,
-                                        useFont,
-                                        aResult );
-            //HTI_LOG_TEXT( "ReleaseFont" );
-            iScreenDevice->ReleaseFont( useFont );
-
-            if ( returnValue )
-                {
-                HTI_LOG_TEXT( "Found" );
-                HTI_LOG_DES( aText );
-                HTI_LOG_DES(tf.iTypeface.iName );
-                HTI_LOG_FORMAT( "X %d", aResult.iX );
-                HTI_LOG_FORMAT( "Y %d", aResult.iY );
-                return returnValue;
-                }
-            }
-        }
-
-    //
-
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::RecognizeTextAllL" );
-    //return returnValue;
-    return EFalse;
-    }
-*/
-
-// ----------------------------------------------------------------------------
-TBool CHtiScreenshotServicePlugin::RecognizeTextL(
-                        const TDesC& aText,
-                        TRect& aResult,
-                        TInt& aFontIndex)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::RecognizeTextL" );
-
-    TSize screenRect = iScreenDevice->SizeInPixels();
-    TInt cacheSize = iFontCache.Count();
-    HTI_LOG_FORMAT( "Cache size %d", cacheSize );
-
-    TBool returnValue = EFalse;
-    for ( TInt i = 0; i < cacheSize; ++i )
-        {
-        CFont* useFont = NULL;
-
-        User::LeaveIfError(iScreenDevice->GetNearestFontToDesignHeightInPixels(
-                                useFont, iFontCache[i] ) );
-        if ( iFontCache[i].iFontStyle.BitmapType()==EAntiAliasedGlyphBitmap )
-            {
-            iTextRcg.SetHint( EHintEdge );
-            }
-        else
-            {
-            iTextRcg.SetHint( EHintNone );
-            }
-
-        //check that font in valid size
-        if ( screenRect.iHeight < useFont->HeightInPixels() ||
-             screenRect.iWidth < useFont->MaxNormalCharWidthInPixels()
-            )
-            {
-            break;
-            }
-
-        returnValue = iTextRcg.RecognizeTextL( iScreen, aText, useFont,
-                aResult );
-
-        iScreenDevice->ReleaseFont( useFont );
-
-        if ( returnValue )
-            {
-            HTI_LOG_FORMAT( "Found! fontIndex %d", i );
-            HTI_LOG_DES( aText );
-            HTI_LOG_DES( iFontCache[i].iTypeface.iName );
-            HTI_LOG_FORMAT( "TL X %d", aResult.iTl.iX );
-            HTI_LOG_FORMAT( "TL Y %d", aResult.iTl.iY );
-            HTI_LOG_FORMAT( "BR X %d", aResult.iBr.iX );
-            HTI_LOG_FORMAT( "BR Y %d", aResult.iBr.iY );
-            aFontIndex = i;
-            return returnValue;
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::RecognizeTextL" );
-    return EFalse;
-    }
-
-/*
-TBool CHtiScreenshotServicePlugin::RecognizeTextL(
-                        const TDesC& aText,
-                        const TDesC& aTypeface,
-                        TPoint& aResult)
-    {
-    HTI_LOG_FUNC_IN( "RecognizeTextL typeface" );
-    //const CFont* fontUsed = NULL;// AknLayoutUtils::FontFromName(aTypeface);
-    CFont* useFont = NULL;
-    TFontSpec fs(aTypeface, 0);
-
-    iScreenDevice->GetNearestFontInTwips(useFont, fs);
-
-    TBool returnValue = iTextRcg.RecognizeTextL(iScreen, aText, useFont, aResult);
-
-HTI_LOG_FUNC_OUT( "RecognizeTextL" );
-    return returnValue;
-}
-*/
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::ProcessMessageL(const TDesC8& aMessage,
-                THtiMessagePriority /*aPriority*/)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::ProcessMessage");
-
-    if ( iICLHandler )
-        {
-        if ( iICLHandler->IsActive() || iEncodedBitmap)
-            {
-            User::Leave( KErrInUse );
-            }
-        }
-
-    if ( iSeriesShot->IsOngoing() )
-        User::Leave( KErrInUse );
-
-    // update the current screen mode
-    TPixelsAndRotation currentPixelsAndRotation;
-    iScreenDevice->GetScreenModeSizeAndRotation(
-            iScreenDevice->CurrentScreenMode(), currentPixelsAndRotation );
-    iScreenDevice->SetScreenSizeAndRotation( currentPixelsAndRotation );
-
-    if ( aMessage.Length() > 0 )
-        {
-        // set/reset delta capture status
-        iDeltaCapture = ( aMessage[0] & ECmdDeltaCaptureMask ) ? ETrue : EFalse;
-        if ( iDeltaCapture )
-            {
-            HTI_LOG_TEXT( "DeltaCapture ETrue" );
-            }
-
-        //if text recogn call separate handler
-        if ( aMessage[0] == ECmdTextRcg ||
-             aMessage[0] == ECmdTextRcg_u )
-            {
-            ProcessTextRcgMessageL( aMessage );
-            return;
-            }
-        else if ( aMessage[0] == ECmdTextBitmap ||
-                  aMessage[0] == ECmdTextBitmap_u )
-            {
-            ProcessTextBitmapMessageL( aMessage );
-            return;
-            }
-
-        iCompress = ( aMessage[0] == ECmdScreenZip ) ||
-                    ( aMessage[0] == ECmdScreenRegionZip ) ||
-                    ( aMessage[0] == ECmdScreenZipSeries ) ||
-                    ( aMessage[0] == ECmdScreenRegionZipSeries ) ||
-                    ( aMessage[0] == ECmdDeltaScreenZip ) ||
-                    ( aMessage[0] == ECmdDeltaScreenRegionZip );
-
-        HTI_LOG_FORMAT( "cmd 0x%x", aMessage[0] );
-        TPtrC8 mime;
-
-        switch ( aMessage[0] )
-            {
-            case ECmdScreen:
-            case ECmdScreenZip:
-            case ECmdDeltaScreen:
-            case ECmdDeltaScreenZip:
-                {
-                TRect empty;
-                TDisplayMode displayMode = ENone;
-                //check display
-                if ( aMessage.Length() > KScreenDisplayOffset )
-                    {
-                    displayMode = ( TDisplayMode ) aMessage[KScreenDisplayOffset];
-                    if ( displayMode >= EColorLast )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrInvalidMode,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-                    }
-
-                bool screenNumberSet = false;
-                //check screen number
-                if ( (aMessage.Length() > KScreenScreenNumber) && 
-                        ((aMessage[aMessage.Length()-1] == 0) || (aMessage[aMessage.Length()-1] == 1)))
-                    {
-                    TInt screenNumber = aMessage[aMessage.Length()-1];
-                    HTI_LOG_FORMAT( "set screen number: %d", screenNumber );
-                    screenNumberSet = true;
-                    TInt screens;
-                    TInt ret = HAL::Get(HAL::EDisplayNumberOfScreens, screens);
-                    if(ret)
-                        {
-                        HTI_LOG_FORMAT( "HAL::Get failed %d", ret );
-                        User::Leave(ret);
-                        }
-                    HTI_LOG_FORMAT( "HAL::Get number of screens %d", screens );
-                    if( ( screenNumber>screens-1 ) || ( screenNumber<0 ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                KErrArgument, KErrDescrScreenNotSupported, KScreenshotServiceUid);
-                        return;
-                        }
-                    SetScreenNumber(screenNumber);
-                    }
-
-                CreateBitmapL( empty, displayMode );
-
-                //check mime
-                if ( aMessage.Length() > KScreenMIMEOffset )
-                    {
-                    if(screenNumberSet)
-                        {
-                        mime.Set( aMessage.Mid( KScreenMIMEOffset, aMessage.Length()-1-KScreenMIMEOffset ) );
-                        }
-                    else
-                        {
-                        mime.Set( aMessage.Mid( KScreenMIMEOffset ) );
-                        }
-                    if ( !IsMIMETypeSupported( mime ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrMIMENotSupported,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-                    }
-                }              
-                break;
-
-            case ECmdScreenRegion:
-            case ECmdScreenRegionZip:
-            case ECmdDeltaScreenRegion:
-            case ECmdDeltaScreenRegionZip:
-                {
-                //check screen number
-                bool screenNumberSet = false;
-                if ( (aMessage.Length() > KRegionScreenNumber) && 
-                        ((aMessage[aMessage.Length()-1] == 0) || (aMessage[aMessage.Length()-1] == 1)))
-                    {
-                    TInt screenNumber = aMessage[aMessage.Length()-1];
-                    screenNumberSet = true;
-                    TInt screens;
-                    TInt ret = HAL::Get(HAL::EDisplayNumberOfScreens, screens);
-                    if(ret)
-                        {
-                        HTI_LOG_FORMAT( "HAL::Get failed %d", ret );
-                        User::Leave(ret);
-                        }
-                    HTI_LOG_FORMAT( "HAL::Get number of screens %d", screens );
-                    if( ( screenNumber>screens-1 ) || ( screenNumber<0 ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                KErrArgument, KErrDescrScreenNotSupported, KScreenshotServiceUid);
-                        return;
-                        }
-                    SetScreenNumber(screenNumber);
-                    }
-
-                if ( aMessage.Length() >= KMinScreenRegionCmdLength )
-                    {
-                    TRect region;
-                    const TUint8* ptr = aMessage.Ptr();
-                    region.iTl.iX = ParseInt16( ptr + 1 );
-                    region.iTl.iY = ParseInt16( ptr + 3 );
-                    region.iBr.iX = ParseInt16( ptr + 5 );
-                    region.iBr.iY = ParseInt16( ptr + 7 );
-
-                    //check empty and normmalizaed
-                    if ( !region.IsNormalized() )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrRegionNotNormailized,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-
-                    if ( region.IsEmpty() )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrRegiontEmpty,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-
-                    TRect screenRect;
-                    screenRect.iBr = iScreenDevice->SizeInPixels().AsPoint();
-                    screenRect.iBr.iX++; //TRect::Contains() omitts
-                    screenRect.iBr.iY++; //right bottom rows
-
-                    TDisplayMode displayMode = ENone;
-                    if ( aMessage.Length() > KRegionDisplayOffset )
-                        {
-                        displayMode = ( TDisplayMode ) aMessage[KRegionDisplayOffset];
-                        if ( displayMode >= EColorLast )
-                            {
-                            iDispatcher->DispatchOutgoingErrorMessage(
-                                            KErrArgument,
-                                            KErrDescrInvalidMode,
-                                            KScreenshotServiceUid );
-                            return;
-                            }
-                        }
-
-                    if ( screenRect.Contains( region.iTl ) &&
-                         screenRect.Contains( region.iBr ) )
-                        {
-                        CreateBitmapL( region, displayMode );
-                        }
-                    else
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrRegionOutOfScreen,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-                    
-                    //check mime
-                    if ( aMessage.Length() > KRegionMIMEOffset )
-                        {
-                        if(!screenNumberSet)
-                            {
-                            mime.Set( aMessage.Mid( KRegionMIMEOffset ) );
-                            }
-                        else
-                            {
-                            mime.Set( aMessage.Mid( KRegionMIMEOffset, aMessage.Length()-1-KRegionMIMEOffset ) );
-                            }
-                        if ( !IsMIMETypeSupported( mime ) )
-                            {
-                            iDispatcher->DispatchOutgoingErrorMessage(
-                                            KErrArgument,
-                                            KErrDescrMIMENotSupported,
-                                            KScreenshotServiceUid );
-                            return;
-                            }
-                        }
-
-                    }
-                else
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalid,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-                }
-                break;
-
-            case ECmdScreenSeries:
-            case ECmdScreenZipSeries:
-                {
-                if ( aMessage.Length() < KMinSeriesCmdLength )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalid,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-                
-                bool screenNumberSet = false;
-                if ( (aMessage.Length() > KSeriesScreenNumber) && 
-                        ((aMessage[aMessage.Length()-1] == 0) || (aMessage[aMessage.Length()-1] == 1)) )
-                    {
-                    TInt screenNumber = aMessage[aMessage.Length()-1];
-                    screenNumberSet = true;
-                    TInt screens;
-                    TInt ret = HAL::Get(HAL::EDisplayNumberOfScreens, screens);
-                    if(ret)
-                        {
-                        HTI_LOG_FORMAT( "HAL::Get failed %d", ret );
-                        User::Leave(ret);
-                        }
-                    HTI_LOG_FORMAT( "HAL::Get number of screens %d", screens );
-                    if( ( screenNumber>screens-1 ) || ( screenNumber<0 ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                KErrArgument, KErrDescrScreenNotSupported, KScreenshotServiceUid);
-                        return;
-                        }
-                    SetScreenNumber(screenNumber);
-                    }
-
-                TInt duration = ParseInt32( aMessage.Ptr() + KSeriesDurationOffset );
-                TInt interval = ParseInt32( aMessage.Ptr() + KSeriesIntervalOffset );
-
-                TDisplayMode displayMode = ( TDisplayMode ) aMessage[KSeriesDisplayOffset];
-                if ( displayMode >= EColorLast )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalidMode,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-                
-                if ( aMessage.Length() > KSeriesMIMEOffset )
-                    {
-                    if(screenNumberSet)
-                        {
-                        mime.Set( aMessage.Mid( KSeriesMIMEOffset, aMessage.Length()-1-KSeriesMIMEOffset ) );
-                        }
-                    else
-                        {
-                        mime.Set( aMessage.Mid( KSeriesMIMEOffset ) );
-                        }
-                    if ( !IsMIMETypeSupported( mime ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrMIMENotSupported,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-                    }
-
-                TRect empty;
-                iSeriesShot->StartL( duration, interval, displayMode, empty, mime );
-                }
-                return;
-
-            case ECmdScreenRegionSeries:
-            case ECmdScreenRegionZipSeries:
-                {
-                bool screenNumberSet = false;
-                if ( (aMessage.Length() > KRegionSeriesScreenNumber) && 
-                        ((aMessage[aMessage.Length()-1] == 0) || (aMessage[aMessage.Length()-1] == 1)) )
-                    {
-                    TInt screenNumber = aMessage[aMessage.Length()-1];
-                    screenNumberSet = true;
-                    TInt screens;
-                    TInt ret = HAL::Get(HAL::EDisplayNumberOfScreens, screens);
-                    if(ret)
-                        {
-                        HTI_LOG_FORMAT( "HAL::Get failed %d", ret );
-                        User::Leave(ret);
-                        }
-                    HTI_LOG_FORMAT( "HAL::Get number of screens %d", screens );
-                    if( ( screenNumber>screens-1 ) || ( screenNumber<0 ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                KErrArgument, KErrDescrScreenNotSupported, KScreenshotServiceUid);
-                        return;
-                        }
-                    SetScreenNumber(screenNumber);
-                    }
-
-                if ( aMessage.Length() < KMinRegionSeriesCmdLength )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalid,
-                                    KScreenshotServiceUid);
-                    return;
-                    }
-                TInt duration = ParseInt32( aMessage.Ptr() + KSeriesDurationOffset );
-                TInt interval = ParseInt32( aMessage.Ptr() + KSeriesIntervalOffset );
-
-                TDisplayMode displayMode = ( TDisplayMode ) aMessage[KSeriesDisplayOffset];
-                if ( displayMode >= EColorLast )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalidMode,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-                TRect region;
-                const TUint8* ptr = aMessage.Ptr();
-                region.iTl.iX = ParseInt16( ptr + KRegionSeriesTlX );
-                region.iTl.iY = ParseInt16( ptr + KRegionSeriesTlY );
-                region.iBr.iX = ParseInt16( ptr + KRegionSeriesBlX );
-                region.iBr.iY = ParseInt16( ptr + KRegionSeriesBlY );
-
-                //check empty and normmalizaed
-                if ( !region.IsNormalized() )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrRegionNotNormailized,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-                if ( region.IsEmpty() )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrRegiontEmpty,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-                TRect screenRect;
-                screenRect.iBr = iScreenDevice->SizeInPixels().AsPoint();
-                screenRect.iBr.iX++; //TRect::Contains() omitts
-                screenRect.iBr.iY++; //right bottom rows
-
-                if ( !screenRect.Contains( region.iTl ) ||
-                     !screenRect.Contains( region.iBr ) )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrRegionOutOfScreen,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-                
-                if ( aMessage.Length() > KRegionSeriesMIMEOffset )
-                    {
-                    if(screenNumberSet)
-                        {
-                        mime.Set( aMessage.Mid( KRegionSeriesMIMEOffset, aMessage.Length()-1-KRegionSeriesMIMEOffset ) );
-                        }
-                    else
-                        {
-                        mime.Set( aMessage.Mid( KRegionSeriesMIMEOffset ) );
-                        }
-                    if ( !IsMIMETypeSupported( mime ) )
-                        {
-                        iDispatcher->DispatchOutgoingErrorMessage(
-                                        KErrArgument,
-                                        KErrDescrMIMENotSupported,
-                                        KScreenshotServiceUid );
-                        return;
-                        }
-                    }
-
-                iSeriesShot->StartL( duration, interval, displayMode, region, mime );
-                }
-                return;
-
-            case ECmdSelectScreen:
-                {
-                if ( aMessage.Length() != KSelectScreenCmdLength )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalid,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-                TInt screenNr = aMessage[KScreenNrOffset];
-
-                TInt screens;
-                TInt ret=HAL::Get( HAL::EDisplayNumberOfScreens, screens );
-                if ( ret )
-                    {
-                    HTI_LOG_FORMAT( "HAL::Get failed %d", ret );
-                    User::Leave( ret );
-                    }
-
-
-                if ( ( screenNr > screens - 1 ) || ( screenNr < 0 ) )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrScreenNotSupported,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-
-                HTI_LOG_FORMAT( "Number of screens %d", screens );
-                HTI_LOG_FORMAT( "Setting to screen index %d", screenNr );
-
-                // Clear the previous delta bitmap to avoid error
-                iPreviousBitmap->Reset();
-
-                // delete old screendevice and create a new one
-                delete iScreenDevice;
-                iScreenDevice = NULL;
-                iScreenDevice = new ( ELeave ) CWsScreenDevice( iWs );
-                User::LeaveIfError( iScreenDevice->Construct( screenNr ) );
-
-                TBuf8<1> okMsg;
-                okMsg.Append( ECmdSelectScreen );
-                iDispatcher->DispatchOutgoingMessage(
-                    okMsg.AllocL(), KScreenshotServiceUid );
-                }
-                return;
-
-            case ECmdDeltaScreenReset:
-                {
-                if ( aMessage.Length() != KDeltaResetCmdLength )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalid,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-                iPreviousBitmap->Reset();
-                TBuf8<1> okMsg;
-                okMsg.Append( ECmdDeltaScreenReset );
-                iDispatcher->DispatchOutgoingMessage(
-                    okMsg.AllocL(), KScreenshotServiceUid );
-                }
-                return;
-
-            case ECmdScreenMode:
-                {
-                if ( aMessage.Length() != KScreenModeCmdLength )
-                    {
-                    iDispatcher->DispatchOutgoingErrorMessage(
-                                    KErrArgument,
-                                    KErrDescrInvalid,
-                                    KScreenshotServiceUid );
-                    return;
-                    }
-
-                TInt focusScreen = iWs.GetFocusScreen();
-                TPixelsAndRotation sizeAndRotation;
-                TDisplayMode mode = ENone;
-                TInt thisScreen = iScreenDevice->GetScreenNumber();
-                iScreenDevice->GetDefaultScreenSizeAndRotation( sizeAndRotation );
-                mode = iScreenDevice->DisplayMode();
-
-                HTI_LOG_FORMAT( "This screen   = %d", thisScreen );
-                HTI_LOG_FORMAT( "Screen width  = %d", sizeAndRotation.iPixelSize.iWidth );
-                HTI_LOG_FORMAT( "Screen height = %d", sizeAndRotation.iPixelSize.iHeight );
-                HTI_LOG_FORMAT( "Rotation      = %d", sizeAndRotation.iRotation );
-                HTI_LOG_FORMAT( "Display mode  = %d", mode );
-                HTI_LOG_FORMAT( "Focus screen  = %d", focusScreen );
-                TBuf8<8> respMsg;
-                respMsg.Append( thisScreen );
-                respMsg.Append( ( TUint8* )( &( sizeAndRotation.iPixelSize.iWidth ) ), 2 );
-                respMsg.Append( ( TUint8* )( &( sizeAndRotation.iPixelSize.iHeight ) ), 2 );
-                respMsg.Append( sizeAndRotation.iRotation );
-                respMsg.Append( mode );
-                respMsg.Append( focusScreen );
-                iDispatcher->DispatchOutgoingMessage(
-                    respMsg.AllocL(), KScreenshotServiceUid );
-                }
-                return;
-           case ECmdRotateScreen:
-               {
-               if (aMessage.Length() != KRotateScreenCmdLength)
-                   {
-                   iDispatcher->DispatchOutgoingErrorMessage(KErrArgument,
-                           KErrDescrInvalid, KScreenshotServiceUid);
-                   return;
-                   }
-               HandleRotateScreen(aMessage.Right(aMessage.Length() -1));
-               return;
-               }
-            default:
-                //Error: unknown command
-                iDispatcher->DispatchOutgoingErrorMessage(
-                                KErrArgument,
-                                KErrDescrUnknownCommand,
-                                KScreenshotServiceUid );
-                return;
-            } // switch
-
-        //Encode iBitmap
-        if ( mime.Length() == 0 )
-            {
-            EncodeBitmapL(); //use default encoder BMP
-            }
-        else
-            {
-            HTI_LOG_DES( mime );
-            EncodeBitmapL( mime );
-            }
-        }
-    else
-        {
-        //error: empty request
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        KErrArgument,
-                        KErrDescrUnknownCommand,
-                        KScreenshotServiceUid );
-        }
-
-    HTI_LOG_FUNC_OUT( "HtiScreenshotServicePlugin::ProcessMessage" );
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::HandleRotateScreen(const TDesC8& aData)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::HandleRotateScreen" );
-             
-    TInt orientation = aData[0];
-    if (orientation > 1 || orientation < 0)
-        {
-        iDispatcher->DispatchOutgoingErrorMessage(KErrArgument,
-                KErrDescrInvalid, KScreenshotServiceUid);
-        return;
-        }
-
-    TBool isLandScape = orientation;
-
-    RWsSession ws;
-    User::LeaveIfError(ws.Connect());
-    CWsScreenDevice* screenDevice = new (ELeave) CWsScreenDevice(ws);
-    CleanupStack::PushL(screenDevice);
-    User::LeaveIfError(screenDevice->Construct());
-    TSize currentScreenSize = screenDevice->SizeInPixels();
-
-    TBool needsRotating = ETrue;
-    if (currentScreenSize.iWidth > currentScreenSize.iHeight && isLandScape)
-        {
-        // we are already in landscape 
-        HTI_LOG_TEXT("The screen are already in landscape.");
-        needsRotating = EFalse;
-        }
-    if (currentScreenSize.iWidth < currentScreenSize.iHeight
-            && (!isLandScape))
-        {
-        // we are already in portrait 
-        HTI_LOG_TEXT("The screen are already in portrait.");
-        needsRotating = EFalse;
-        }
-
-    CAknLayoutConfig* layoutConfigPtr = CAknLayoutConfig::NewL();
-    CleanupStack::PushL(layoutConfigPtr);
-
-    CAknLayoutConfig& layoutConfig = *layoutConfigPtr;
-
-    const CAknLayoutConfig::THardwareStateArray& hwStates =
-            layoutConfig.HardwareStates();
-    const CAknLayoutConfig::TScreenModeArray& screenModes =
-            layoutConfig.ScreenModes();
-
-    TInt newHwStateIndex = KErrNotFound;
-
-    // lets select alternate state from current
-    TSize newScreenSize;
-    if (needsRotating)
-        {
-        newScreenSize = TSize(currentScreenSize.iHeight,
-                currentScreenSize.iWidth);
-        HTI_LOG_FORMAT("Rotate the screen to the new width %d", newScreenSize.iWidth);
-        HTI_LOG_FORMAT("Rotate the screen to the new height %d", newScreenSize.iHeight);
-        }
-    else // basicly select current state again to ensure correct mode is informed to akncapserver
-        {
-        newScreenSize = TSize(currentScreenSize.iWidth,
-                currentScreenSize.iHeight);
-        }
-
-    for (TInt i = 0; i < hwStates.Count(); i++)
-        {
-        const CAknLayoutConfig::THardwareState hwState = hwStates.At(i);
-
-        const CAknLayoutConfig::TScreenMode normal = screenModes.Find(
-                hwState.ScreenMode());
-
-        if (normal.SizeInPixels() == newScreenSize)
-            {
-            newHwStateIndex = i;
-            break;
-            }
-        }
-
-    if (newHwStateIndex >= 0)
-        {
-        const CAknLayoutConfig::THardwareState newHwState = hwStates.At(
-                newHwStateIndex);
-        TApaTaskList taskList(ws);
-        TApaTask aknCapsrvTask = taskList.FindApp(KAknCapServerUid);
-        TInt keyCode = newHwState.KeyCode();
-        HTI_LOG_FORMAT( "Send key code %d to akncapserver", keyCode );
-        aknCapsrvTask.SendKey(keyCode, 0);
-        }
-
-    TBuf8<1> okMsg;
-    okMsg.Append(0);
-    iDispatcher->DispatchOutgoingMessage(okMsg.AllocL(),
-            KScreenshotServiceUid);
-
-    CleanupStack::PopAndDestroy(layoutConfigPtr);
-    CleanupStack::PopAndDestroy(screenDevice);
-    ws.Close();
-             
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::HandleRotateScreen" );
-    }
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::CreateBitmapL( TRect& aRegion,
-                                                 TDisplayMode aMode )
-    {
-    HTI_LOG_FUNC_IN( "CreateBitmapL" );
-    //create bitmap
-    TSize imageSize = aRegion.IsEmpty() ? iScreenDevice->SizeInPixels() :
-                        aRegion.Size();
-
-    TDisplayMode displayMode = aMode == ENone ?
-                                        iScreenDevice->DisplayMode() : aMode;
-
-    delete iScreen;//in case ICLComplete was not called
-    iScreen = NULL;
-    iScreen = new( ELeave ) CFbsBitmap;
-    User::LeaveIfError( iScreen->Create( imageSize, displayMode ) );
-
-	TInt err = KErrNone;
-	TRect region;
-    if ( aRegion.IsEmpty() )
-        {
-        err = iScreenDevice->CopyScreenToBitmap( iScreen );
-		region = imageSize;
-        }
-    else
-        {
-        err = iScreenDevice->CopyScreenToBitmap( iScreen, aRegion );
-		region = aRegion;
-        }
-    if (err == KErrNoMemory)
-	    {
-		HTI_LOG_TEXT( "screenshot in camera mode" );
-#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
-		err = CAlfDrawer::FallbackCopyScreenToBitmap(*iScreenDevice, iScreen, region);
-#endif
-		}
-
-    if ( iDeltaCapture )
-        {
-        HTI_LOG_TEXT( "DeltaCapture enabled" );
-
-
-        CFbsBitmap* differenceBitmap = NULL;
-        TInt err = ImageDifferenceL( iPreviousBitmap,
-                                     iScreen,
-                                     differenceBitmap,
-                                     iDeltaRect );
-
-        iPreviousBitmap->Reset();
-        iPreviousBitmap->Duplicate( iScreen->Handle() );
-
-        if ( err == KErrNone )
-            {
-            delete iScreen;
-            iScreen = differenceBitmap;
-            }
-        else if ( err == KErrNotFound )
-            {
-            delete iScreen;
-            iScreen = NULL;
-
-            if ( !iSeriesShot->IsOngoing() )
-                {
-                // Nothing has changed on the screen.
-                // Send just iDeltaRect coordidates
-                HBufC8* buf = HBufC8::NewL( 4 * 2 ); // 2 bytes for each coordinate
-                buf->Des().SetLength( 4 * 2 );
-                TUint16* ptr = (TUint16*) buf->Des().Ptr();
-                ptr[0] = (TUint16) iDeltaRect.iTl.iX;
-                ptr[1] = (TUint16) iDeltaRect.iTl.iY;
-                ptr[2] = (TUint16) iDeltaRect.iBr.iX;
-                ptr[3] = (TUint16) iDeltaRect.iBr.iY;
-                // Response also sent in ICLComplete
-                iDispatcher->DispatchOutgoingMessage( buf, KScreenshotServiceUid );
-                }
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "CreateBitmapL" );
-    }
-/*
-
-// ----------------------------------------------------------------------------
-void CleanupRArray( TAny* object )
-    {
-    ((RImageTypeDescriptionArray*)object)->ResetAndDestroy();
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::SelectEncoder( const TUid aEncoderUid )
-    {
-    //select encoder
-    RImageTypeDescriptionArray imageTypeArray;
-    CImageEncoder::GetImageTypesL( imageTypeArray );
-    CleanupStack::PushL( TCleanupItem(CleanupRArray, &imageTypeArray) );
-
-    //select specified encoder
-    TBool found = EFalse;
-    for ( TInt i = 0; i < imageTypeArray.Count(); ++i )
-        {
-        if ( imageTypeArray[i]->ImageType() == aEncoderUid )
-            {
-            iImageEncoderType = imageTypeArray[i]->ImageType();
-            iImageEncoderSubtype = imageTypeArray[i]->SubType();
-            found = ETrue;
-            }
-        }
-
-    if ( !found )
-        {
-        User::Leave( KErrNotFound );
-        }
-    CleanupStack::PopAndDestroy(); //imageTypeArray
-    }
-*/
-
-// ----------------------------------------------------------------------------
-TBool CHtiScreenshotServicePlugin::IsMIMETypeSupported(TDesC8 &aMime)
-    {
-    HTI_LOG_DES(aMime);
-    RFileExtensionMIMETypeArray array;
-    CImageEncoder::GetFileTypesL(array);
-    for ( TInt i = 0; i < array.Count(); i++ )
-        {
-        if ( array[i]->MIMEType() == aMime )
-            {
-            HTI_LOG_TEXT( "MIME supported" );
-            array.ResetAndDestroy();
-            return ETrue;
-            }
-        }
-    HTI_LOG_TEXT( "MIME not supported" );
-    array.ResetAndDestroy();
-    return EFalse;
-    }
-
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::EncodeBitmapL(const TDesC8& aImageTypeMIME )
-    {
-    HTI_LOG_FUNC_IN( "EncodeBitmapL" );
-    delete iBitmapEncoder;
-    iBitmapEncoder = NULL;
-    delete iICLHandler;
-    iICLHandler = NULL;
-
-    if ( iScreen )
-        {
-        HTI_LOG_TEXT( "create encoder" );
-        if ( aImageTypeMIME  == KNullDesC8 )
-            {
-            iBitmapEncoder = CImageEncoder::DataNewL( iEncodedBitmap,
-                                        CImageEncoder::EOptionNone,
-                                        KImageTypeBMPUid);//,
-                                        //iImageEncoderSubtype);
-            }
-        else
-            {
-            iBitmapEncoder = CImageEncoder::DataNewL( iEncodedBitmap,
-                                        aImageTypeMIME);
-            }
-
-        HTI_LOG_TEXT( "create CICLHandler" );
-        iICLHandler = new(ELeave) CICLHandler( iBitmapEncoder, this );
-        iBitmapEncoder->Convert( &(iICLHandler->iStatus), *iScreen );
-
-        HTI_LOG_TEXT( "CICLHandler start");
-        iICLHandler->Start();
-        }
-    else
-        {
-        HTI_LOG_TEXT( "Nothing to encode" );
-        }
-
-    HTI_LOG_FUNC_OUT( "EncodeBitmapL" );
-    }
-
-// ----------------------------------------------------------------------------
-TInt CHtiScreenshotServicePlugin::Compress()
-    {
-    __ASSERT_ALWAYS(iEncodedBitmap!=NULL,User::Panic(KScreenshotPanic, KErrGeneral));
-    TInt err = KErrNone;
-    HBufC8* zippedTemp = NULL;
-
-    HTI_LOG_FORMAT( "image size %d", iEncodedBitmap->Size() );
-    TInt numOfSteps = 4;
-    TInt comprBufferIncrease = iEncodedBitmap->Size()/numOfSteps;
-
-    //straight way to handle cases
-    //when compressed data larger than uncompressed
-    //try until buffer for compr. data twice bigger than original data
-    for ( TInt i = 0; i < numOfSteps; ++i )
-        {
-        delete zippedTemp;
-        TRAP( err, zippedTemp = HBufC8::NewL( iEncodedBitmap->Size() +
-                                              i*comprBufferIncrease ) );
-        if ( err == KErrNone )
-            {
-            //try to zip
-            HTI_LOG_TEXT( "try to zip" );
-            TPtr8 zippedTempPtr = zippedTemp->Des();
-            TRAP( err, CEZCompressor::CompressL( zippedTempPtr,
-                                                 *iEncodedBitmap ) );
-            if ( err == KErrNone || err != KEZlibErrBuf )
-                {
-                break;
-                }
-            }
-        else
-            {
-            break;
-            }
-        }
-
-    if ( err == KErrNone )
-        {
-        delete iEncodedBitmap;
-        iEncodedBitmap = zippedTemp;
-        }
-    else
-        {
-        HTI_LOG_FORMAT( "compre error %d", err );
-        delete zippedTemp;
-        }
-
-    return err;
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::ICLComplete( TInt anError)
-    {
-    HTI_LOG_FUNC_IN( "ICLComplete" );
-
-    //delete what we dont need right away
-    delete iBitmapEncoder;
-    iBitmapEncoder = NULL;
-    delete iICLHandler;
-    iICLHandler = NULL;
-
-
-    if ( anError==KErrNone )
-        {
-        TInt err = KErrNone;
-
-
-        //compress
-        if ( iCompress )
-            {
-            HTI_LOG_TEXT( "compress" );
-            err = Compress();
-            }
-
-        //send
-        if ( err == KErrNone )
-            {
-
-            if ( !iSeriesShot->IsOngoing() )
-                {
-                // Not a series shot
-
-                if ( iDeltaCapture )
-                    {
-                    // DeltaCapture on
-
-                    // If we have encoded the bitmap then we
-                    // also have some difference in the bitmap
-
-                    HTI_LOG_TEXT( "Sending image with coordinates..." );
-
-                    HBufC8* buf = HBufC8::NewL( (4*2) + iEncodedBitmap->Size() );
-                    buf->Des().SetLength(4*2);
-                    TUint16* ptr = (TUint16*) buf->Des().Ptr();
-                    ptr[0] = (TUint16) iDeltaRect.iTl.iX;
-                    ptr[1] = (TUint16) iDeltaRect.iTl.iY;
-                    ptr[2] = (TUint16) iDeltaRect.iBr.iX;
-                    ptr[3] = (TUint16) iDeltaRect.iBr.iY;
-
-                    buf->Des().Append(*iEncodedBitmap);
-
-                    delete iEncodedBitmap;
-                    iEncodedBitmap = NULL;
-
-                    // Response also sent in CreateBitmapL
-                    err = iDispatcher->DispatchOutgoingMessage(buf,
-                                            KScreenshotServiceUid);
-                    }
-                else
-                    {
-                    // Normal case
-                    HTI_LOG_TEXT( "Sending image..." );
-                    err = iDispatcher->DispatchOutgoingMessage(iEncodedBitmap,
-                                            KScreenshotServiceUid);
-                    }
-
-                if (  err == KErrNoMemory )
-                    {
-                    HTI_LOG_TEXT( "wait for memory" );
-                    iDispatcher->AddMemoryObserver( this );
-                    }
-                else if ( err == KErrNone )
-                    {
-                    iEncodedBitmap = NULL;
-                    }
-                else //just drop
-                    {
-                    HTI_LOG_TEXT( "ERROR: Impossible to send image" );
-                    delete iEncodedBitmap;
-                    iEncodedBitmap = NULL;
-                    }
-                }
-            }
-        else
-            {
-            iSeriesShot->Cancel();
-            iDispatcher->DispatchOutgoingErrorMessage(
-                    err,
-                    KErrDescrFailedCompress,
-                    KScreenshotServiceUid);
-            delete iEncodedBitmap;
-            iEncodedBitmap = NULL;
-            }
-        }
-    else
-        {
-        iSeriesShot->Cancel();
-        iDispatcher->DispatchOutgoingErrorMessage(
-                        anError,
-                        KErrDescrFailedConvert,
-                        KScreenshotServiceUid);
-        delete iEncodedBitmap;
-        iEncodedBitmap = NULL;
-        }
-
-    if ( iSeriesShot->IsOngoing() )
-        {
-        iSeriesShot->SaveImage( iEncodedBitmap, iCompress );
-        delete iEncodedBitmap;
-        iEncodedBitmap = NULL;
-
-        // Check if there's still more to do
-        if ( iSeriesShot->IsOngoing() )
-            {
-            iSeriesShot->TriggerNewShot();
-            }
-        else
-            {
-            // - No, timer still active
-            // SeriesShot can complete here and in CSeriesShot::TimerExpired
-            SeriesShotCompletedL(iSeriesShot->ConstructCompletedMessageL());
-            }
-        }
-
-    HTI_LOG_FUNC_OUT( "ICLComplete" );
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::NotifyMemoryChange( TInt aAvailableMemory )
-    {
-    if ( iEncodedBitmap )
-        {
-        if ( aAvailableMemory>= iEncodedBitmap->Size() )
-            {
-            TInt err = iDispatcher->DispatchOutgoingMessage(iEncodedBitmap,
-                                KScreenshotServiceUid);
-
-            if ( err == KErrNone)
-                {
-                iEncodedBitmap = NULL;
-                iDispatcher->RemoveMemoryObserver( this );
-                }
-            else if ( err != KErrNoMemory )
-                {
-                delete iEncodedBitmap;
-                iEncodedBitmap = NULL;
-                iDispatcher->RemoveMemoryObserver( this );
-                }
-            }
-        }
-    else
-        {
-        //some error, should not be called
-        iDispatcher->RemoveMemoryObserver(this);
-        }
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::SeriesShotCompletedL(HBufC8* aMsg)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::SeriesShotCompletedL" );
-    User::LeaveIfError( iDispatcher->DispatchOutgoingMessage(
-                        aMsg,
-                        KScreenshotServiceUid) );
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::SeriesShotCompletedL" );
-    }
-
-// ----------------------------------------------------------------------------
-TBool CHtiScreenshotServicePlugin::StartShotL(TRect aRegion, TDisplayMode aDisplayMode, TDesC8 &aMimeType)
-    {
-    HTI_LOG_FUNC_IN( "CHtiScreenshotServicePlugin::StartShot" );
-    CreateBitmapL( aRegion, aDisplayMode );
-
-    if ( aMimeType.Length()==0 )
-        EncodeBitmapL(); //use default encoder BMP
-    else
-        EncodeBitmapL( aMimeType );
-
-    HTI_LOG_FUNC_OUT( "CHtiScreenshotServicePlugin::StartShot" );
-    return iScreen ? ETrue : EFalse;
-    }
-
-// ----------------------------------------------------------------------------
-void CHtiScreenshotServicePlugin::SetScreenNumber(TInt aScreenNumber)
-    {
-    HTI_LOG_FUNC_IN("CHtiScreenshotServicePlugin::SetScreenNumber");
-    TInt currentScreen = iScreenDevice->GetScreenNumber();
-    HTI_LOG_FORMAT("current screen: %d", currentScreen);
-    HTI_LOG_FORMAT("new screen number: %d", aScreenNumber);
-    if(aScreenNumber == currentScreen)
-        {
-        return;
-        }
-
-    // Clear the previous delta bitmap to avoid error
-    iPreviousBitmap->Reset();
-    //delete old screendevice and create a new one
-    delete iScreenDevice;
-    iScreenDevice = NULL;
-    iScreenDevice = new (ELeave) CWsScreenDevice(iWs);
-    User::LeaveIfError(iScreenDevice->Construct(aScreenNumber));
-    HTI_LOG_FUNC_OUT("CHtiScreenshotServicePlugin::SetScreenNumber");
-    }
-
-// ----------------------------------------------------------------------------
-CSeriesShot* CSeriesShot::NewL( MSeriesShotObserver* aServicePlugin )
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShot::NewL" );
-    CSeriesShot* self = new (ELeave) CSeriesShot( aServicePlugin );
-    CleanupStack::PushL (self);
-    self->ConstructL();
-    CleanupStack::Pop();
-    HTI_LOG_FUNC_OUT( "CSeriesShot::NewL" );
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::ConstructL()
-    {
-    User::LeaveIfError(iFs.Connect());
-    }
-
-// ----------------------------------------------------------------------------
-CSeriesShot::CSeriesShot( MSeriesShotObserver* aServicePluginObserver ):
-    iServicePluginObserver( aServicePluginObserver ),
-    iDurationTimer( NULL ),
-    iIntervalTimer( NULL ),
-    isEncoding( EFalse )
-    {
-    }
-
-// ----------------------------------------------------------------------------
-CSeriesShot::~CSeriesShot()
-    {
-    Cancel();
-    iFs.Close();
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::ClearShots()
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShot::ClearShots" );
-
-    iFs.MkDirAll( KSeriesShotPath );
-
-    // Delete all files
-    TFileName files;
-    files.Append( KSeriesShotPath );
-    files.Append( _L( "*.*" ) );
-    HTI_LOG_DES(files);
-
-
-    CFileMan *fileman = CFileMan::NewL( iFs );
-    TInt err = fileman->Delete( files );
-    HTI_LOG_FORMAT( "delete %d", err );
-    if ( err != KErrNotFound )
-        User::LeaveIfError( err );
-    delete fileman;
-
-
-    HTI_LOG_FUNC_OUT( "CSeriesShot::ClearShots" );
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::StartL( TTimeIntervalMicroSeconds32 aDuration,
-                         TTimeIntervalMicroSeconds32 aInterval,
-                         TDisplayMode aDisplayMode,
-                         TRect aRegion,
-                         TPtrC8 aMime )
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShot::StartL" );
-    HTI_LOG_FORMAT( "Duration      : %d microseconds", aDuration.Int() );
-    HTI_LOG_FORMAT( "Interval      : %d microseconds", aInterval.Int() );
-    HTI_LOG_FORMAT( "Displaymode   : %d", aDisplayMode );
-    HTI_LOG_FORMAT( "TopLeft X     : %d", aRegion.iTl.iX );
-    HTI_LOG_FORMAT( "TopLeft Y     : %d", aRegion.iTl.iY );
-    HTI_LOG_FORMAT( "BottomRight X : %d", aRegion.iBr.iX );
-    HTI_LOG_FORMAT( "BottomRight Y : %d", aRegion.iBr.iY );
-
-    iDisplayMode = aDisplayMode;
-    iRegion = aRegion;
-    iIndex = 0;
-
-    iMimeType.Zero();
-    iMimeType.Append( aMime );
-    HTI_LOG_DES( iMimeType );
-
-#ifdef __ENABLE_LOGGING__
-    HTI_LOG_TEXT( "Supported MIME types:" );
-    RFileExtensionMIMETypeArray array;
-    CImageEncoder::GetFileTypesL( array );
-    for ( TInt i = 0; i < array.Count(); i++ )
-        HTI_LOG_DES( array[i]->MIMEType() );
-    array.ResetAndDestroy();
-#endif
-
-    iExtension.Zero();
-    if ( iMimeType.Length() == 0 )
-        iExtension.Append( _L( ".bmp" ) );
-    else
-        GetMIMEExtension( iMimeType, iExtension );
-
-    ClearShots();
-
-    iDurationTimer = CSeriesShotTimer::NewL( this, EDuration, aDuration );
-    iIntervalTimer = CSeriesShotTimer::NewL( this, EInterval, aInterval );
-    iDurationTimer->Start();
-    TimerExpired( EInterval ); // trigger first shot immidietly
-
-    HTI_LOG_FUNC_OUT( "CSeriesShot::StartL" );
-    }
-
-void CSeriesShot::TimerExpired( TInt aId )
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShot::TimerExpired" );
-    switch ( aId )
-        {
-        case EDuration:
-            HTI_LOG_TEXT( "EDuration" );
-
-            delete iDurationTimer;
-            iDurationTimer = NULL;
-
-            if ( iIntervalTimer ) // I'm paranoid
-                {
-                delete iIntervalTimer;
-                iIntervalTimer = NULL;
-                }
-            // SeriesShot can complete here and in CHtiScreenshotServicePlugin::ICLComplete
-            if ( isEncoding == EFalse )
-                iServicePluginObserver->SeriesShotCompletedL( ConstructCompletedMessageL() );
-
-            break;
-
-        case EInterval:
-            HTI_LOG_TEXT( "EInterval" );
-
-            isEncoding = iServicePluginObserver->StartShotL( iRegion, iDisplayMode, iMimeType );
-
-            break;
-
-        default:
-            break;
-        }
-    HTI_LOG_FUNC_OUT( "CSeriesShot::TimerExpired" );
-    }
-
-// ----------------------------------------------------------------------------
-TBool CSeriesShot::IsOngoing()
-    {
-    // It still might be encoding when duration timer has expired
-    return ( iDurationTimer || isEncoding ) ? ETrue : EFalse;
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::SaveImage( TDesC8* aImage, TBool isCompressed )
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShot::SaveImage" );
-
-    isEncoding = EFalse;
-
-    TFileName filename( KSeriesShotPath );
-    filename.AppendFormat( _L( "%04d" ), iIndex );
-    iIndex++;
-    filename.Append( iExtension );
-    if ( isCompressed )
-        filename.Append( _L( "z" ) );
-    HTI_LOG_DES( filename );
-
-    RFile file;
-    User::LeaveIfError( file.Create( iFs, filename, EFileWrite ) );
-    User::LeaveIfError( file.Write( *aImage ) );
-    file.Close();
-
-    HTI_LOG_FUNC_IN( "CSeriesShot::SaveImage" );
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::TriggerNewShot()
-    {
-    if ( iDurationTimer )
-        iIntervalTimer->Start();
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::Cancel()
-    {
-    if ( iDurationTimer )
-        {
-        delete iDurationTimer;
-        iDurationTimer = NULL;
-        }
-    if ( iIntervalTimer )
-        {
-        delete iIntervalTimer;
-        iIntervalTimer = NULL;
-        }
-    ClearShots();
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::EncodeCompleted()
-    {
-    isEncoding = EFalse;
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShot::GetMIMEExtension( TDesC8 &aMime, TDes &aExt )
-    {
-    RFileExtensionMIMETypeArray array;
-    CImageEncoder::GetFileTypesL( array );
-    for ( TInt i = 0; i < array.Count(); i++ )
-        {
-        if ( array[i]->MIMEType() == aMime )
-            aExt.Append( array[i]->FileExtension() );
-        }
-    array.ResetAndDestroy();
-
-    if ( aExt == KNullDesC ) // should not happen
-        aExt.Append( _L( ".xxx" ) );
-    }
-
-// ----------------------------------------------------------------------------
-HBufC8* CSeriesShot::ConstructCompletedMessageL()
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShot::ConstructCompletedMessageL" );
-    // Serialshot completed send ok message.
-
-    CDir* dir = NULL;
-    User::LeaveIfError( iFs.GetDir(
-        KSeriesShotPath, KEntryAttNormal, ESortByName, dir ) );
-
-    TInt msgSize = 0;
-
-    if ( dir->Count() == 0 )
-        {
-        HTI_LOG_TEXT( "No shots found! Leaving..." );
-        User::Leave( KErrNotFound );
-        }
-
-    for ( TInt i = 0; i < dir->Count(); i++ )
-        {
-        msgSize += 1; // for length field
-        msgSize += KSeriesShotPath().Length();
-        msgSize += (*dir)[i].iName.Length();
-        }
-
-    HBufC8* msg = HBufC8::NewL( msgSize );
-
-    for ( TInt i = 0; i < dir->Count(); i++ )
-        {
-        msg->Des().Append( KSeriesShotPath().Length() + (*dir)[i].iName.Length() );
-        msg->Des().Append( KSeriesShotPath );
-        msg->Des().Append( (*dir)[i].iName );
-        }
-
-    delete dir;
-
-    HTI_LOG_FUNC_OUT( "CSeriesShot::ConstructCompletedMessageL" );
-    return msg;
-    }
-
-// ----------------------------------------------------------------------------
-CSeriesShotTimer* CSeriesShotTimer::NewL( MSeriesShotTimerObserver* aObserver,
-                                        TInt aId,
-                                        TTimeIntervalMicroSeconds32 aTime )
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShotTimer::NewL" );
-    CSeriesShotTimer* self = new (ELeave) CSeriesShotTimer( aObserver, aId, aTime );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    HTI_LOG_FUNC_OUT( "CSeriesShotTimer::NewL" );
-    return self;
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShotTimer::ConstructL()
-    {
-    HTI_LOG_FUNC_IN( "CSeriesShotTimer::ConstructL" );
-    CTimer::ConstructL();
-    if ( !IsAdded() ) // CTimer should add it but it seems that it does NOT!
-        {
-        CActiveScheduler::Add( this );
-        }
-    HTI_LOG_FUNC_OUT( "CSeriesShotTimer::ConstructL" );
-    }
-
-// ----------------------------------------------------------------------------
-CSeriesShotTimer::CSeriesShotTimer( MSeriesShotTimerObserver* aObserver,
-                                  TInt aId,
-                                  TTimeIntervalMicroSeconds32 aTime ):
-    CTimer( EPriorityStandard ),
-    iObserver( aObserver ),
-    iId( aId ),
-    iTime( aTime )
-    {
-    }
-
-// ----------------------------------------------------------------------------
-CSeriesShotTimer::~CSeriesShotTimer()
-    {
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShotTimer::RunL()
-    {
-    iObserver->TimerExpired( iId );
-    }
-
-// ----------------------------------------------------------------------------
-void CSeriesShotTimer::Start()
-    {
-    HTI_LOG_FORMAT( "Start CSeriesShotTimer : %d microseconds", iTime.Int() );
-    After( iTime );
-    }