codhandler/codui/src/CodConfirm.cpp
changeset 0 dd21522fd290
child 37 cb62a4f66ebe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/codhandler/codui/src/CodConfirm.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,312 @@
+/*
+* Copyright (c) 2005 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:  Implementation of class CCodConfirm.   
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <AknUtils.h>
+#include <AknDef.h>
+#include <StringLoader.h>
+#include <CodData.h>
+#include <CodDefs.h>
+#include <avkon.rsg>
+#include <CodUi.rsg>
+#include "CodConfirm.h"
+#include "CodLogger.h"
+#include <Oma2Agent.h>
+#include <AknLayout.cdl.h>
+
+
+#include <eikmobs.h>
+#include <aknPopup.h>
+#include <aknlists.h>
+#include    <StringLoader.h>
+
+_LIT( KListBoxSeparator, "\t" );
+
+// FORWARD DECLARATIONS
+
+
+// ================= TYPES =======================
+
+/**
+* Mime type to resource id mapping entry.
+*/
+struct TMimeAndResId
+    {
+    const TText8* iName;    ///< MIME type.
+    TInt iResId;            ///< Resource id.
+    };
+
+// ================= CONSTANTS =======================
+
+/// Number of bytes in a kilobyte.
+LOCAL_D const TInt KCodKbyte = 1024;
+
+/**
+* Null-terminated MIME-to-resId mapping table.
+* Order of entries is important (from most specific to most generic), as
+* entries are evaluated linearly.
+*/
+LOCAL_D const TMimeAndResId KCodMimeAndResIds[] =
+    {
+        { _S8( "application/vnd.nokia.ringing-tone" ),  R_QTN_CD_TYPE_RTONE },
+        { _S8( "application/x-nokiaGameData" ),         R_QTN_CD_TYPE_GAME_LEVEL },
+        { _S8( "application/vnd.oma.drm" ),             R_QTN_CD_TYPE_NOT_CLASSIFIED },
+        { _S8( "application/" ),                        R_QTN_CD_TYPE_APPLICATION },
+        { _S8( "image/vnd.nokia.ota-bitmap" ),          R_QTN_CD_TYPE_OPERATOR_LOGO },
+        { _S8( "image/vnd.nok-oplogo" ),                R_QTN_CD_TYPE_OPERATOR_LOGO },
+        { _S8( "image/vnd.nok-picturemessage" ),        R_QTN_CD_TYPE_PICTURE_MESSAGE },
+        { _S8( "image/" ),                              R_QTN_CD_TYPE_IMAGE },
+        { _S8( "audio/" ),                              R_QTN_CD_TYPE_SOUND },
+        { _S8( "text/X-vCard" ),                        R_QTN_CD_TYPE_VCARD },
+        { _S8( "text/" ),                               R_QTN_CD_TYPE_DOCUMENT },
+        { _S8( "" ),                                    R_QTN_CD_TYPE_NOT_CLASSIFIED },
+        { NULL,                                         0 }                                     
+    };
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CCodConfirm:CCodConfirm()
+// ---------------------------------------------------------
+//
+CCodConfirm::CCodConfirm()
+    {
+    }
+
+    
+
+// ---------------------------------------------------------
+// CCodConfirm::~CCodConfirm()
+// ---------------------------------------------------------
+//
+CCodConfirm::~CCodConfirm()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCodView::AllocTypeNameL
+// ---------------------------------------------------------------------------
+//
+ HBufC* CCodConfirm::AllocTypeNameL( const TDesC8& aMimeType )
+    {
+    const TMimeAndResId* mapping;
+    TInt resId = R_QTN_CD_VALUE_UNDEFINED;
+    for( mapping = &KCodMimeAndResIds[0]; mapping->iName; mapping++ )
+        {
+        TPtrC8 name( mapping->iName );
+        // Looking for partial match (leftmost part of aMimeType is compared
+        // to mapping->iName).
+        if( name.Length() <= aMimeType.Length() )
+            {
+            if( aMimeType.Left( name.Length() ).CompareF( name ) == 0 )
+                {
+                resId = mapping->iResId;
+                break;
+                }
+            }
+        }
+    return StringLoader::LoadL( resId, iCoeEnv );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCodView::DisplayType
+// ---------------------------------------------------------------------------
+//
+ TPtrC8 CCodConfirm::DisplayType( const CCodData& aData )
+    {
+    for ( TInt i = 0; i < (*aData[aData.ActiveDownload()]).Types().MdcaCount(); i++ )
+        {
+        TPtrC8 type( (*aData[aData.ActiveDownload()]).Types().MdcaPoint( i ) );
+        if (
+            type.Compare( KOma1DrmMessageContentType ) &&
+            type.Compare( KOma1XmlRoContentType ) &&
+            type.Compare( KOma1WbxmlRoContentType ) &&
+            type.Compare( KOma2RoContentType ) &&
+            type.Compare( KOma2TriggerContentType ) &&
+            type.Compare( KOma1DcfContentType ) &&
+            type.Compare( KOma2DcfContentType ) &&
+            type.Compare( KOmaImportContentType )
+           )
+            {
+            return type;    // Non-DRM, return it.
+            }
+        }
+    return (*aData[aData.ActiveDownload()]).Type();    // By default returns the first, whatever it is.
+    }
+
+    
+// ---------------------------------------------------------------------------
+// CCodConfirm::ShowDownloadConfirmationL
+// ---------------------------------------------------------------------------
+//
+TBool CCodConfirm::ShowDownloadConfirmationL(TInt aCbaResource, 
+                                          const CCodData& aData, 
+                                          TBool aCod )
+{
+    HBufC* itemText = NULL; // a buffer holding the text for each list item
+
+    CEikFormattedCellListBox* listBox = new ( ELeave ) CAknDoublePopupMenuStyleListBox;
+    CleanupStack::PushL( listBox );
+
+    // If supported show OK & Cancel buttons, otherwise just CANCEL
+    
+    CAknPopupList* popupList = CAknPopupList::NewL
+            ( listBox, aCbaResource, AknPopupLayouts::EMenuDoubleWindow );
+    CleanupStack::PushL( popupList );
+
+    TInt flags = CEikListBox::EDisableHighlight;
+    listBox->ConstructL( popupList, flags );
+    listBox->CreateScrollBarFrameL( ETrue );
+    listBox->ScrollBarFrame()->SetScrollBarVisibilityL
+        ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    MDesCArray* itemList = listBox->Model()->ItemTextArray();
+    CDesCArray* itemArray = (CDesCArray*)itemList;
+    
+    //-------------------------------------------
+    // Header
+    HBufC* header = StringLoader::LoadLC( R_QTN_CD_TITLE );
+    popupList->SetTitleL( *header );
+    CleanupStack::PopAndDestroy( header );  // header
+    header = NULL;
+    
+
+    // make description of buf
+    HBufC* buf;
+
+    //-------------------------------------------
+    // Name 
+    //
+    HBufC* popHeader = StringLoader::LoadLC( R_QTN_CD_DETAIL_NAME );
+    // If media count more than one, show album name if present
+    itemText = FormatListBoxItemLC( *popHeader, aData.Count() > 1 && aData.Name().Length()? aData.Name() : (*aData[aData.ActiveDownload()]).Name() );
+    itemArray->AppendL( *itemText );
+    CleanupStack::PopAndDestroy( 2, popHeader ); // itemText,popHeader
+    itemText = NULL;
+    popHeader = NULL;
+
+    //-------------------------------------------
+    // Content Size
+    //
+    HBufC* sizeHeader = StringLoader::LoadLC( R_QTN_CD_DETAIL_SIZE );
+    TInt size = aData.Size();
+    if( size >= KCodKbyte )
+        {
+        // Round up.
+        buf = StringLoader::LoadLC
+            ( R_QTN_SIZE_KB, (size - 1) / KCodKbyte + 1, iCoeEnv );
+        }
+    else
+        {
+        buf = StringLoader::LoadLC( R_QTN_SIZE_B, size, iCoeEnv );
+        }
+    buf->Des().Trim();   
+    itemText = FormatListBoxItemLC( *sizeHeader, *buf );
+    itemArray->AppendL( *itemText );
+    CleanupStack::PopAndDestroy( 3, sizeHeader ); // itemText, sizeHeader
+    itemText = NULL;
+    sizeHeader = NULL;
+
+    //-------------------------------------------
+    // Type 
+    //
+    popHeader = StringLoader::LoadLC( R_QTN_CD_DETAIL_TYPE );
+    buf = AllocTypeNameL( DisplayType(aData));
+    CleanupStack::PushL(buf);
+    itemText = FormatListBoxItemLC( *popHeader, *buf );
+    itemArray->AppendL( *itemText );
+    CleanupStack::PopAndDestroy( 3, popHeader ); // itemText, nameHeader
+    itemText = NULL;
+    popHeader = NULL;
+    
+    
+    //-------------------------------------------
+    // Price: only if it's aCod
+    //
+    if ( aCod ) 
+    {
+        popHeader = StringLoader::LoadLC( R_QTN_CD_DETAIL_PRICE );
+        itemText = FormatListBoxItemLC( *popHeader, aData.Price() );
+        itemArray->AppendL( *itemText );
+        CleanupStack::PopAndDestroy( 2, popHeader ); // itemText, nameHeader
+        itemText = NULL;
+        popHeader = NULL;    	
+    }
+
+    //-------------------------------------------
+    // Detail Description
+    //
+    popHeader = StringLoader::LoadLC( R_QTN_CD_DETAIL_DESCRIPT );   
+    HBufC* popValue = StringLoader::LoadLC(R_QTN_CD_VALUE_UNDEFINED ); 
+    if (aData.Description().Length())
+    {
+       itemText = FormatListBoxItemLC( *popHeader, aData.Description() );	
+    }
+    else
+    {
+    	itemText = FormatListBoxItemLC( *popHeader, *popValue );
+    } 
+    itemArray->AppendL( *itemText );
+    CleanupStack::PopAndDestroy( 3, popHeader ); // itemText, popValue
+    itemText = NULL;
+    popHeader = NULL;    	
+    
+
+    //-------------------------------------------
+    // Vendor Information 
+    //
+    popHeader = StringLoader::LoadLC( R_QTN_CD_DETAIL_VENDOR );
+    
+	popValue = StringLoader::LoadLC(R_QTN_CD_VALUE_UNDEFINED ); 
+    if (aData.Vendor().Length())
+       itemText = FormatListBoxItemLC( *popHeader, aData.Vendor() );
+    else 
+	   itemText = FormatListBoxItemLC( *popHeader, *popValue ); 
+    itemArray->AppendL( *itemText );
+    CleanupStack::PopAndDestroy( 3, popHeader ); // itemText, popValue
+    itemText = NULL;
+    popHeader = NULL;    	
+
+    TInt popupOk = popupList->ExecuteLD();
+
+
+
+    // cleanup
+    CleanupStack::Pop( popupList );
+    CleanupStack::PopAndDestroy( listBox ); // listBox
+    
+	return popupOk; 
+}
+// -----------------------------------------------------------------------------
+// CCodConfirm::FormatListBoxItemLC
+// -----------------------------------------------------------------------------
+//
+HBufC* CCodConfirm::FormatListBoxItemLC
+    ( const TDesC& aFirst, const TDesC& aSecond )
+    {
+    HBufC* res = HBufC::NewLC( aFirst.Length() + 
+                               aSecond.Length() + 
+                               KListBoxSeparator().Length() );
+    res->Des().Copy( aFirst );
+    res->Des().Append( KListBoxSeparator );
+    res->Des().Append( aSecond );
+    return res;
+    }