browserutilities/browserdialogsprovider/Src/BrowserViewImagesListBox.cpp
changeset 0 dd21522fd290
child 68 92a765b5b3e7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/browserdialogsprovider/Src/BrowserViewImagesListBox.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,577 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*      View images popup dialog listbox
+*      
+*
+*/
+
+
+// INCLUDES
+#include "BrowserViewImagesListBox.h"
+#include "BrowserDialogsProviderConstants.h"
+
+#include <gulicon.h>
+#include <e32math.h>
+#include <akniconarray.h>
+#include <Oma2Agent.h>
+using namespace ContentAccess;
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::CBrowserViewImagesListBox
+// 
+//  EPOC first phase Constructor - must not leave
+//-----------------------------------------------------------------------------
+//
+CBrowserViewImagesListBox::CBrowserViewImagesListBox( )
+                        : CAknDoubleLargeGraphicPopupMenuStyleListBox(), 
+                        iFormat(), 
+                        iCodec(), 
+                        iDRMOutputBuf(NULL),
+                        iImageIndex(0)
+    {
+    iRetryingConvert = EFalse;
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::~CBrowserViewImagesListBox
+// 
+//  Destructor
+//-----------------------------------------------------------------------------
+//
+CBrowserViewImagesListBox::~CBrowserViewImagesListBox()
+    {
+    delete [] iDRMOutputBuf;
+    delete iConverter;
+    delete iCurrentBitmap;
+    }
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::ConstructL( 
+//                                CCoeControl& aParent, 
+//                                CArrayFixFlat<TBrCtlImageCarrier>& aImages )
+// 
+//  Second Phase constructor
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::ConstructL( 
+                                CCoeControl& aParent, 
+                                CArrayFixFlat<TBrCtlImageCarrier>& aImages )
+    {
+    iImages = &aImages;
+    
+    CAknDoubleLargeGraphicPopupMenuStyleListBox::ConstructL( &aParent, 0 );
+
+    iConverter = CMdaImageDescToBitmapUtility::NewL( *this );
+
+    iIcons = new( ELeave) CAknIconArray( 5 );       // iIcons must not be deleted in destructor! 
+
+    // create placeholder icon
+    CGulIcon* icon = CreatePlaceholderIconL();
+    CleanupStack::PushL(icon);
+    iIcons->AppendL(icon);
+    CleanupStack::Pop();    // icon
+
+    ItemDrawer()->ColumnData()->SetIconArray( iIcons );   // iIcons NOT DELETED IN DESTRUCTOR!!!
+
+    // ---------------------------------------------------------------------------------
+    // items
+
+    iItemList = STATIC_CAST(CDesCArray*, Model()->ItemTextArray());     // MUST NOT BE DELETED IN DESTRUCTOR
+
+    TBuf<KMaxAltTextLength> buf;
+    TInt cstart = 0;
+    TInt cend = 0;
+    
+    // append items with placeholder thumbnail
+    for(TInt i=0; i<iImages->Count(); i++)
+        {
+        buf = _L("0\t");
+        TBrCtlImageCarrier& img = iImages->At(i);
+        
+        if( img.AltText().Length() > 0 )
+            {            
+            buf.Append(img.AltText().Left( buf.MaxLength() - buf.Length() ) );
+            }
+        else
+            {
+            //get filename w/o extension from url
+            cstart = img.Url().LocateReverse('/') + 1;
+            cend   = img.Url().LocateReverse('.');
+            if ( cend <= cstart ) cend = img.Url().Length();
+                {
+                buf.Append( img.Url().Mid 
+                    ( cstart, 
+                            ( cend - cstart ) < ( buf.MaxLength() - buf.Length() ) 
+                                ?
+                            ( cend - cstart ) 
+                                :
+                            ( buf.MaxLength() - buf.Length() )
+            	        ) 
+                    );
+                }
+            }
+            
+        iItemList->AppendL(buf);
+        }
+        
+    ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::CurrentlySelectedImage()
+//-----------------------------------------------------------------------------
+//
+const TBrCtlImageCarrier& CBrowserViewImagesListBox::CurrentlySelectedImage()
+    {
+    return iImages->At( CurrentItemIndex() );
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::CreatePlaceholderIconL()
+//-----------------------------------------------------------------------------
+//
+CGulIcon* CBrowserViewImagesListBox::CreatePlaceholderIconL()
+    {
+    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+    CleanupStack::PushL(bitmap);
+    if(KErrNone != bitmap->Create(TSize(42,32), EColor16M))
+        User::Leave(KErrNoMemory);
+
+    // create icon
+    CGulIcon* icon = CGulIcon::NewL(bitmap); // bitmap is owned, no mask used
+    CleanupStack::Pop();    // bitmap
+    return icon;
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::Fit()
+//-----------------------------------------------------------------------------
+//
+TSize CBrowserViewImagesListBox::Fit( const TSize& aSrc, const TSize& aTgt )
+    {
+    TSize result1(aTgt);
+    TSize result2(aTgt);
+
+    TInt dA( aTgt.iWidth - aSrc.iWidth );
+    TInt dB( aTgt.iHeight - aSrc.iHeight );
+    TReal tmp = aSrc.iHeight + ((TReal)(aSrc.iHeight * dA) / (TReal)aSrc.iWidth);
+    TReal res;
+    Math::Round( res, tmp, 0);
+    result1.iHeight = (TInt)res;
+    tmp = aSrc.iWidth + ((TReal)(aSrc.iWidth * dB) / (TReal)aSrc.iHeight);
+    Math::Round( res, tmp, 0);
+    result2.iWidth = (TInt)res;
+
+    TSize result;
+    if(result1.iWidth <= aTgt.iWidth && result1.iHeight <= aTgt.iHeight)
+        result = result1;
+    else
+        result = result2;
+
+    return result;    
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::CreateIconL(
+//                                      CFbsBitmap* aBitmap, TBool aShrinkIt )
+//-----------------------------------------------------------------------------
+//
+CGulIcon* CBrowserViewImagesListBox::CreateIconL(
+                                        CFbsBitmap* aBitmap, TBool aShrinkIt)
+    {
+    CGulIcon* icon = NULL;
+
+    // create icon
+    if(aShrinkIt)
+        {
+        CFbsBitmap* bmp = new(ELeave)CFbsBitmap;
+        CleanupStack::PushL(bmp);
+        User::LeaveIfError(bmp->Create(TSize(42,32), EColor16M));
+    
+        // create bitmap device
+        CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(bmp);
+        CleanupStack::PushL(dev);
+    
+        // create graphics context for bitmap device
+        CGraphicsContext* ctx = NULL;
+        User::LeaveIfError( dev->CreateContext(ctx) );
+        CleanupStack::PushL(ctx);
+    
+        // calculate aspect ratio
+        TSize targetSize = Fit(aBitmap->SizeInPixels(), bmp->SizeInPixels());
+        // copy bitmap to temporary bitmap
+        ctx->DrawBitmap(TRect(TPoint(0,0), targetSize), aBitmap, TRect(TPoint(0,0), aBitmap->SizeInPixels()));
+
+        CleanupStack::PopAndDestroy(2);   // ctx, dev
+
+        icon = CGulIcon::NewL(bmp); // bmp is owned, no mask used
+        CleanupStack::Pop();  // bmp
+        delete aBitmap;
+        } 
+    else 
+        {
+        icon = CGulIcon::NewL(aBitmap); // bitmap is owned, no mask used
+        }
+
+    return icon;
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::StartConversionL()
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::StartConversionL()
+    {
+    // if we are out of index, stop
+    if (iImageIndex >= iImages->Count())
+        {
+        // zero non-owned pointers
+        iCurrentBitmap = NULL;
+        iIcons = NULL;
+        iItemList = NULL;
+
+        // delete converter because it is not needed anymore
+        delete iConverter;
+        iConverter = NULL;
+        return;
+        }
+
+    // begin open
+    TBrCtlImageCarrier& img = iImages->At( iImageIndex );
+    
+    if ( img.ImageType() == EImageTypeWbmp )
+        {
+        iConverter->OpenL( img.RawData(), &iFormat, &iCodec );
+        }
+    else if ( img.ImageType() == EImageTypeOta )
+        {
+        iConverter->OpenL( img.RawData(), &iFormat, &iCodec );
+        }
+    else
+        {
+        iConverter->OpenL( img.RawData() );        
+        }
+    // MiuoOpenComplete will be called next
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::MiuoConvertComplete( TInt aError )
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::MiuoConvertComplete( TInt aError )
+    {
+    TRAPD(err, MiuoConvertCompleteL(aError));
+    if(err!=KErrNone)
+        {
+        DeleteCurrentBitmap();
+        TRAP(err, ConvertNextImageL());
+        }
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::ConvertNextImageL()
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::ConvertNextImageL()
+    {
+    // close converter
+    iConverter->Close();    
+    iImageIndex++;
+    StartConversionL();    
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::CreateCurrentBitmapL( TBool aUseBitmapSize )
+//-----------------------------------------------------------------------------
+//
+TInt CBrowserViewImagesListBox::CreateCurrentBitmapL( TBool aUseBitmapSize )
+    {
+    DeleteCurrentBitmap();  // just in case
+    iCurrentBitmap = new(ELeave) CFbsBitmap;
+
+    TInt err = KErrNone;
+    if( aUseBitmapSize )
+        {
+        err = iCurrentBitmap->Create(iFrameInfo.iOverallSizeInPixels, EColor16M);
+        }
+    else
+        {
+        // Store the size of the thumbnail
+        err = iCurrentBitmap->Create( TSize(42,32), EColor16M);
+        }
+
+    return err;
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::MiuoOpenComplete(TInt aError)
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::MiuoOpenComplete(TInt aError)
+    {
+    TRAPD(err, MiuoOpenCompleteL(aError));
+    if(err!=KErrNone)
+        {
+        // just in case, delete iCurrentBitmap if MiuoOpenCompleteL left
+        // after allocating the bitmap
+        DeleteCurrentBitmap();        
+
+        // try to convert next thumbnail image until all have been tried
+        // if this fails, placeholders will still remain
+        TRAP(err, ConvertNextImageL());
+        }
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::MiuoOpenCompleteL( TInt aError )
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::MiuoOpenCompleteL( TInt aError )
+    {
+    if(aError==KErrNone)
+        {
+        iConverter->FrameInfo(0, iFrameInfo);
+        // create new current bitmap for conversion
+        TInt err = CreateCurrentBitmapL();
+        if(err!=KErrNone)
+            {
+            // unable to create bitmap, so we won't transfer its ownership to iIcons
+            // -> delete
+            DeleteCurrentBitmap();
+            // try next image if available
+            ConvertNextImageL();
+            }
+        else 
+            {
+            // start converter, MiuoConvertComplete will be called next
+            // if this leaves, iCurrentBitmap will remain allocated, but deleted in MiuoOpenComplete
+            iConverter->ConvertL(*iCurrentBitmap);
+            }
+        }
+    else 
+        {
+        TInt error(KErrNone);
+        
+        // error occurred, we decide to try next image. placeholder
+        // will remain in its place
+        // if this leaves, iCurrentBitmap is not allocated
+             
+        // input buffers for image conversion
+        TBrCtlImageCarrier& img = iImages->At( iImageIndex );
+        iImageDataPtr.Set( (const TUint8*) img.RawData().Ptr(),
+                                                img.RawData().Size() );
+            
+        
+        TInt inputBufLen = iImageDataPtr.Size() + 1; // Input buffer length
+        
+        HBufC8* bufInput = HBufC8::NewL( inputBufLen + 1 );
+        CleanupStack::PushL( bufInput );
+        TPtr8 ptrInput( NULL,0,0 );
+        ptrInput.Set( bufInput->Des() );
+        ptrInput.Append( EView );
+        ptrInput.Append( (const TUint8 *) iImageDataPtr.Ptr(), iImageDataPtr.Size() );
+        
+        // output buffer for image conversion
+        if ( iDRMOutputBuf )
+            {
+            delete [] iDRMOutputBuf;
+            iDRMOutputBuf = NULL;
+            }
+        TInt outputBufLen = iImageDataPtr.Size() + 256; // Output buffer length
+        iDRMOutputBuf = new (ELeave) TUint8[outputBufLen];
+        TPtr8 ptrOutput( iDRMOutputBuf, 0, outputBufLen );
+        
+        
+        // Do we have a DRM image?
+        TAgent agentDRM;
+        TRequestStatus status;
+        
+        ContentAccess::CManager* manager = CManager::NewLC();
+
+        RArray<ContentAccess::TAgent> agents;
+       //Add agents to cleanup stack
+		CleanupClosePushL(agents);
+ 
+        manager->ListAgentsL( agents );
+        for ( TInt i = 0; i < agents.Count(); i++ )
+		    {
+    		if ( agents[i].Name().Compare( KOmaDrm2AgentName ) == 0)
+    			{
+    			 agentDRM = agents[i];
+    			 break;
+    			}
+    		}
+    	
+    	//Cleanup the agents
+        CleanupStack::PopAndDestroy(/*agents*/);
+	
+    	// convert the DRM image (asynchronous)
+        manager->AgentSpecificCommand(  agentDRM, 
+                                        EBufferContainsOma1Dcf, 
+									    iImageDataPtr,
+									    ptrOutput, 
+									    status );
+        // wait for it to finish
+        User::WaitForRequest(status);
+        
+        // Conversion completed ok (if not image is skipped)
+        if ( status == KErrNone )
+            {
+            //Now decrypt the buffer.
+		    error = manager->AgentSpecificCommand(   
+		                                agentDRM,
+		                                EDecryptOma1DcfBuffer,
+										ptrInput,
+									    ptrOutput);
+            if ( !error )
+                {                
+                iImageDataPtr.Set( (const TUint8*) ptrOutput.Ptr(), 
+                                                    ptrOutput.Size() );
+                delete iConverter;
+                iConverter = NULL;
+                TRAP( error, iConverter = CMdaImageDescToBitmapUtility::NewL( *this ); );
+                
+                // Decrypted ok (if not image is skipped)
+                if ( !error )
+                    {
+                    TRAP_IGNORE( iConverter->OpenL( iImageDataPtr ) );
+                    }
+                }
+            }
+        CleanupStack::PopAndDestroy(); // bufInput
+        CleanupStack::Pop(); //manager        
+        }
+    }
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::MiuoConvertCompleteL( TInt aError )
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::MiuoConvertCompleteL(TInt aError)
+    {
+    if ( !aError )
+        {
+        // create icon out of the converted bitmap
+        // if retrying convert, we have original size bitmap so shrink it into thumbnail icon
+        CGulIcon* icon = CreateIconL(iCurrentBitmap, iRetryingConvert);
+        iCurrentBitmap = NULL;      // ownership transferred to icon
+        iRetryingConvert = EFalse;  // no more retrying
+        CleanupStack::PushL(icon);
+        iIcons->AppendL(icon);
+        CleanupStack::Pop();        // icon now owned by iIcons
+
+        // append item
+        TBuf<KMaxAltTextLength> buf;
+        TInt cstart = 1;
+        TInt cend = 1;
+        buf = _L("");
+        buf.AppendNum(iIcons->Count()-1);       // 0 is always the placeholder
+        buf.Append(_L("\t"));
+
+        TBrCtlImageCarrier& img = iImages->At(iImageIndex);
+
+        if ( img.AltText().Length() > 0 )
+            {
+            buf.Append( img.AltText().Left( buf.MaxLength() - buf.Length() ) );
+            }
+        else
+            {
+            //get filename w/o extension from url
+            cstart = img.Url().LocateReverse('/') + 1;
+            cend   = img.Url().LocateReverse('.');
+            if ( cend <= cstart ) cend = img.Url().Length();
+                {
+                buf.Append( img.Url().Mid
+                    ( cstart,
+                        ( cend - cstart ) < ( buf.MaxLength() - buf.Length() )
+                            ?
+                        ( cend - cstart )
+                            :
+                        ( buf.MaxLength() - buf.Length() )
+                	    ) 
+                    );
+                }
+            }
+            
+        // replace item (having placeholder icon) with real thumbnail
+        TRAPD(err, iItemList->InsertL(iImageIndex,buf));
+        // if succeeded, delete the old one that has moved next to the new item
+        // in case error occurred, the placeholder will remain.
+        if(err==KErrNone)
+            iItemList->Delete(iImageIndex+1);
+
+        // redraw list
+        HandleItemAdditionL();
+
+        // open next image and convert it
+        ConvertNextImageL();
+        }
+    else
+        {
+        if( aError == KErrArgument )
+            {
+            // retry this image
+            // iCurrentBitmap has been allocated when MiuoConvertComplete 
+            // is called, so delete it
+            DeleteCurrentBitmap();
+            CreateCurrentBitmapL(ETrue);        // use original image size
+            iRetryingConvert = ETrue;
+            iConverter->ConvertL(*iCurrentBitmap);      // retry conversion
+            }
+        else
+            {
+            DeleteCurrentBitmap();
+            // convert next image (anyway)
+            ConvertNextImageL();
+            }
+        }
+		}
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::DeleteCurrentBitmap()
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::DeleteCurrentBitmap()
+    {
+    delete iCurrentBitmap;
+    iCurrentBitmap = NULL;
+    }
+
+
+
+//-----------------------------------------------------------------------------
+//  CBrowserViewImagesListBox::DeleteCurrentBitmap()
+//
+// not used - comes from abstract base class
+//-----------------------------------------------------------------------------
+//
+void CBrowserViewImagesListBox::MiuoCreateComplete(TInt /* aError */)
+    {
+    }
+
+
+// End of File