messagingappbase/msgeditor/modelsrc/MsgAttachmentModel.cpp
author hgs
Wed, 03 Nov 2010 09:52:46 +0530
changeset 79 2981cb3aa489
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  MsgAttachmentModel implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// ========== INCLUDE FILES ================================
hgs
parents:
diff changeset
    21
#include <eikenv.h>
hgs
parents:
diff changeset
    22
#include <gulicon.h>
hgs
parents:
diff changeset
    23
#include <apgicnfl.h>           // apamasked bitmaps
hgs
parents:
diff changeset
    24
#include <coeutils.h>           // for ConeUtils::FileExists
hgs
parents:
diff changeset
    25
#include <DocumentHandler.h>    // for KGameMimeType
hgs
parents:
diff changeset
    26
#include <data_caging_path_literals.hrh>
hgs
parents:
diff changeset
    27
#include <msvids.h>             // KMsvNullIndexEntryId
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include <AknUtils.h>
hgs
parents:
diff changeset
    30
#include <AknsUtils.h>          // skinned icons
hgs
parents:
diff changeset
    31
#include <AknsConstants.h>      // skinned icon ids
hgs
parents:
diff changeset
    32
#include <aknlayout.cdl.h> // LAF
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
#include <msgeditor.mbg>
hgs
parents:
diff changeset
    35
#include <msgeditor_ah.mbg>
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
#include "MsgEditorCommon.h"
hgs
parents:
diff changeset
    38
#include "MsgAttachmentModel.h"
hgs
parents:
diff changeset
    39
#include "MsgAttachmentModelObserver.h"
hgs
parents:
diff changeset
    40
#include "MsgAttachmentInfo.h"
hgs
parents:
diff changeset
    41
#include "MsgAttachmentUtils.h"
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
#include "MsgEditorLogging.h"
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// ========== EXTERNAL DATA STRUCTURES =====================
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// ========== EXTERNAL FUNCTION PROTOTYPES =================
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ========== CONSTANTS ====================================
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
const TUint KAttachArrayGranularity = 16;
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
const TInt32 KMaxGameEngineDataID = 1000;
hgs
parents:
diff changeset
    54
const TInt   KGameEngineUID = 0x101F5EDA;
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
/**
hgs
parents:
diff changeset
    57
* UID of the messaging centre to show correct icon for email
hgs
parents:
diff changeset
    58
* attachments
hgs
parents:
diff changeset
    59
*/
hgs
parents:
diff changeset
    60
const TInt KMceUID = 0x100058C5;
hgs
parents:
diff changeset
    61
_LIT8( KEMailMessageMimeType, "message/rfc822" );
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
_LIT8( KTextDataType, "text/plain" );
hgs
parents:
diff changeset
    64
const TInt KNotepadUID3 = 0x1000599d;
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
// ========== MACROS =======================================
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
// ========== LOCAL CONSTANTS AND MACROS ===================
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
// ========== MODULE DATA STRUCTURES =======================
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// ========== LOCAL FUNCTION PROTOTYPES ====================
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
// ========== LOCAL FUNCTIONS ==============================
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
// ========== MEMBER FUNCTIONS =============================
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------
hgs
parents:
diff changeset
    80
// CMsgAttachmentModel::NewL
hgs
parents:
diff changeset
    81
//
hgs
parents:
diff changeset
    82
// Factory method.
hgs
parents:
diff changeset
    83
// ---------------------------------------------------------
hgs
parents:
diff changeset
    84
//
hgs
parents:
diff changeset
    85
EXPORT_C CMsgAttachmentModel* CMsgAttachmentModel::NewL( TBool aReadOnly )
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
    CMsgAttachmentModel* self = new ( ELeave ) CMsgAttachmentModel( aReadOnly );
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    90
    self->ConstructL();
hgs
parents:
diff changeset
    91
    CleanupStack::Pop();
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    return self;
hgs
parents:
diff changeset
    94
    }
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
// ---------------------------------------------------------
hgs
parents:
diff changeset
    97
// CMsgAttachmentModel::~CMsgAttachmentModel
hgs
parents:
diff changeset
    98
//
hgs
parents:
diff changeset
    99
// Destructor.
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------
hgs
parents:
diff changeset
   101
//
hgs
parents:
diff changeset
   102
EXPORT_C CMsgAttachmentModel::~CMsgAttachmentModel()
hgs
parents:
diff changeset
   103
    {
hgs
parents:
diff changeset
   104
    delete iDRMFWDLockIcon;
hgs
parents:
diff changeset
   105
    delete iDRMSDIconRightsValid;
hgs
parents:
diff changeset
   106
    delete iDRMFWDLockIconNoRights;
hgs
parents:
diff changeset
   107
    delete iDRMSDIconNoRights;
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    if ( iAttachInfoArray )
hgs
parents:
diff changeset
   110
        {
hgs
parents:
diff changeset
   111
        iAttachInfoArray->ResetAndDestroy();
hgs
parents:
diff changeset
   112
        }
hgs
parents:
diff changeset
   113
    delete iAttachInfoArray;
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    iAppList.Close();
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
// ---------------------------------------------------------
hgs
parents:
diff changeset
   119
// CMsgAttachmentModel::SetObserver
hgs
parents:
diff changeset
   120
//
hgs
parents:
diff changeset
   121
// Sets attachment model observer.
hgs
parents:
diff changeset
   122
// ---------------------------------------------------------
hgs
parents:
diff changeset
   123
//
hgs
parents:
diff changeset
   124
EXPORT_C void CMsgAttachmentModel::SetObserver(
hgs
parents:
diff changeset
   125
    MMsgAttachmentModelObserver* aObserver )
hgs
parents:
diff changeset
   126
    {
hgs
parents:
diff changeset
   127
    iAttachmentModelObserver = aObserver;
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
// ---------------------------------------------------------
hgs
parents:
diff changeset
   131
// CMsgAttachmentModel::NumberOfItems
hgs
parents:
diff changeset
   132
//
hgs
parents:
diff changeset
   133
// Returns number of attachments.
hgs
parents:
diff changeset
   134
// ---------------------------------------------------------
hgs
parents:
diff changeset
   135
//
hgs
parents:
diff changeset
   136
EXPORT_C TInt CMsgAttachmentModel::NumberOfItems() const
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
    return iAttachInfoArray->Count();
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
// ---------------------------------------------------------
hgs
parents:
diff changeset
   142
// CMsgAttachmentModel::AttachmentInfoAt
hgs
parents:
diff changeset
   143
//
hgs
parents:
diff changeset
   144
// Returns reference to attachment info at given index.
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------
hgs
parents:
diff changeset
   146
//
hgs
parents:
diff changeset
   147
EXPORT_C CMsgAttachmentInfo& CMsgAttachmentModel::AttachmentInfoAt(
hgs
parents:
diff changeset
   148
    TInt aIndex ) const
hgs
parents:
diff changeset
   149
    {
hgs
parents:
diff changeset
   150
    return *iAttachInfoArray->At( aIndex );
hgs
parents:
diff changeset
   151
    }
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
// ---------------------------------------------------------
hgs
parents:
diff changeset
   154
// CMsgAttachmentModel::BitmapForFileL
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
// Returns pointer to bitmap of the application that handles given file.
hgs
parents:
diff changeset
   157
// If application not found returns default bitmap and sets supported flag
hgs
parents:
diff changeset
   158
// of the aAttaInfo to EFalse.
hgs
parents:
diff changeset
   159
// ---------------------------------------------------------
hgs
parents:
diff changeset
   160
//
hgs
parents:
diff changeset
   161
EXPORT_C CGulIcon* CMsgAttachmentModel::BitmapForFileL(
hgs
parents:
diff changeset
   162
    CMsgAttachmentInfo& aAttaInfo )
hgs
parents:
diff changeset
   163
    {
hgs
parents:
diff changeset
   164
    MEBLOGGER_ENTERFN( "BitmapForFileL" );
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    TUid appUid( KNullUid );
hgs
parents:
diff changeset
   167
    // Get bitmap based on datatype:
hgs
parents:
diff changeset
   168
    TInt err = iAppList.AppForDataType( aAttaInfo.DataType(), appUid );
hgs
parents:
diff changeset
   169
    /*
hgs
parents:
diff changeset
   170
    // Get bitmap based on recognition:
hgs
parents:
diff changeset
   171
    // How to handle this with file handles?!
hgs
parents:
diff changeset
   172
    TDataType dataType;
hgs
parents:
diff changeset
   173
    TInt err = iAppList.AppForDocument( aAttaInfo.FileName(), appUid, dataType );
hgs
parents:
diff changeset
   174
    TInt err = iAppList.AppForDocumentAndService(
hgs
parents:
diff changeset
   175
    	const TDesC& aFileName,
hgs
parents:
diff changeset
   176
    	RFs& aFSession,
hgs
parents:
diff changeset
   177
    	RFile& aFile,
hgs
parents:
diff changeset
   178
    	TUid aServiceUid,
hgs
parents:
diff changeset
   179
    	TUid& aAppUid,
hgs
parents:
diff changeset
   180
    	TDataType& aDataType);
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    if ( dataType.Des8().FindF( KGameMimeType ) != KErrNotFound )
hgs
parents:
diff changeset
   183
        {
hgs
parents:
diff changeset
   184
        appUid = AppUidFromGameFileL( dataType, aAttaInfo.FileName() );
hgs
parents:
diff changeset
   185
        }
hgs
parents:
diff changeset
   186
    */
hgs
parents:
diff changeset
   187
    if ( aAttaInfo.DataType().Des8().Compare( KEMailMessageMimeType ) == 0 )
hgs
parents:
diff changeset
   188
        {
hgs
parents:
diff changeset
   189
        appUid.iUid = KMceUID;
hgs
parents:
diff changeset
   190
        err = KErrNone;
hgs
parents:
diff changeset
   191
        }
hgs
parents:
diff changeset
   192
    else if ( aAttaInfo.DataType().Des8().Compare( KTextDataType ) == 0 )
hgs
parents:
diff changeset
   193
        {
hgs
parents:
diff changeset
   194
        appUid.iUid = KNotepadUID3;
hgs
parents:
diff changeset
   195
        err = KErrNone;
hgs
parents:
diff changeset
   196
        }
hgs
parents:
diff changeset
   197
    
hgs
parents:
diff changeset
   198
    TBool supported( ( err == KErrNone ) && ( appUid.iUid != 0 ) );
hgs
parents:
diff changeset
   199
    
hgs
parents:
diff changeset
   200
    // Case Imelody: content type text/x-imelody. AppForDataType() returns 'no-app'.
hgs
parents:
diff changeset
   201
    // But Imelody should be opened into text editor.
hgs
parents:
diff changeset
   202
    // AppForDocument resolves correct application icon.
hgs
parents:
diff changeset
   203
    // Content type length check removed from if()
hgs
parents:
diff changeset
   204
    if ( !supported )
hgs
parents:
diff changeset
   205
        {
hgs
parents:
diff changeset
   206
        TDataType dataType;
hgs
parents:
diff changeset
   207
        TMsvAttachmentId attachmentId = aAttaInfo.AttachmentId();
hgs
parents:
diff changeset
   208
        // OPEN: is there need to handle attachmentId == 0 differently?
hgs
parents:
diff changeset
   209
        RFile attachmentFile;
hgs
parents:
diff changeset
   210
        TRAP( err, attachmentFile = iAttachmentModelObserver->GetAttachmentFileL( attachmentId ) );
hgs
parents:
diff changeset
   211
        if ( err == KErrNone && attachmentFile.SubSessionHandle() != KNullHandle )
hgs
parents:
diff changeset
   212
            {
hgs
parents:
diff changeset
   213
            err = iAppList.AppForDocument( attachmentFile, appUid, dataType );
hgs
parents:
diff changeset
   214
            attachmentFile.Close();
hgs
parents:
diff changeset
   215
            }
hgs
parents:
diff changeset
   216
        supported = ( ( err == KErrNone ) && ( appUid.iUid != 0 ) );
hgs
parents:
diff changeset
   217
        }
hgs
parents:
diff changeset
   218
    
hgs
parents:
diff changeset
   219
    aAttaInfo.SetSupported( supported );
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    CGulIcon* addIcon = NULL;
hgs
parents:
diff changeset
   222
    CGulIcon* icon = NULL;
hgs
parents:
diff changeset
   223
    if ( aAttaInfo.DRMDataType() )
hgs
parents:
diff changeset
   224
        {
hgs
parents:
diff changeset
   225
        MAknsSkinInstance* skins = AknsUtils::SkinInstance();
hgs
parents:
diff changeset
   226
        switch ( aAttaInfo.DRMDataType() )
hgs
parents:
diff changeset
   227
            {
hgs
parents:
diff changeset
   228
            case CMsgAttachmentInfo::ECombinedDeliveryInvalidRights:
hgs
parents:
diff changeset
   229
                {
hgs
parents:
diff changeset
   230
                if ( !iDRMFWDLockIconNoRights )
hgs
parents:
diff changeset
   231
                    {
hgs
parents:
diff changeset
   232
                    iDRMFWDLockIconNoRights = AknsUtils::CreateGulIconL( 
hgs
parents:
diff changeset
   233
                                        skins, 
hgs
parents:
diff changeset
   234
                                        KAknsIIDQgnPropDrmExpForbidSuper, 
hgs
parents:
diff changeset
   235
                                        KMsgEditorMbm, 
hgs
parents:
diff changeset
   236
                                        EMbmMsgeditorQgn_prop_drm_exp_forbid_super, 
hgs
parents:
diff changeset
   237
                                        EMbmMsgeditorQgn_prop_drm_exp_forbid_super_mask );  
hgs
parents:
diff changeset
   238
                    AknIconUtils::SetSize( iDRMFWDLockIconNoRights->Bitmap(), iAddIconSize );
hgs
parents:
diff changeset
   239
                    }                
hgs
parents:
diff changeset
   240
                addIcon = iDRMFWDLockIconNoRights;
hgs
parents:
diff changeset
   241
                }
hgs
parents:
diff changeset
   242
                break;
hgs
parents:
diff changeset
   243
                
hgs
parents:
diff changeset
   244
            case CMsgAttachmentInfo::ESeparateDeliveryInvalidRights:
hgs
parents:
diff changeset
   245
                {
hgs
parents:
diff changeset
   246
                if ( !iDRMSDIconNoRights )
hgs
parents:
diff changeset
   247
                    {
hgs
parents:
diff changeset
   248
                    iDRMSDIconNoRights = AknsUtils::CreateGulIconL( 
hgs
parents:
diff changeset
   249
                                        skins, 
hgs
parents:
diff changeset
   250
                                        KAknsIIDQgnPropDrmRightsExpSuper, 
hgs
parents:
diff changeset
   251
                                        KMsgEditorMbm, 
hgs
parents:
diff changeset
   252
                                        EMbmMsgeditorQgn_prop_drm_rights_exp_super, 
hgs
parents:
diff changeset
   253
                                        EMbmMsgeditorQgn_prop_drm_rights_exp_super_mask );  
hgs
parents:
diff changeset
   254
                    AknIconUtils::SetSize( iDRMSDIconNoRights->Bitmap(), iAddIconSize );
hgs
parents:
diff changeset
   255
                    }                
hgs
parents:
diff changeset
   256
                addIcon = iDRMSDIconNoRights;
hgs
parents:
diff changeset
   257
                }
hgs
parents:
diff changeset
   258
                break;
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
            case CMsgAttachmentInfo::EForwardLockedOrCombinedDelivery:
hgs
parents:
diff changeset
   261
                {
hgs
parents:
diff changeset
   262
                // OPEN: What should the addIcon be if file is not supported?
hgs
parents:
diff changeset
   263
                // Now it will be "iDRMFWDLockIcon"
hgs
parents:
diff changeset
   264
                if ( !iDRMFWDLockIcon )
hgs
parents:
diff changeset
   265
                    {
hgs
parents:
diff changeset
   266
                    iDRMFWDLockIcon = AknsUtils::CreateGulIconL( 
hgs
parents:
diff changeset
   267
                                        skins, 
hgs
parents:
diff changeset
   268
                                        KAknsIIDQgnPropDrmSendForbidSuper, 
hgs
parents:
diff changeset
   269
                                        KMsgEditorMbm, 
hgs
parents:
diff changeset
   270
                                        EMbmMsgeditorQgn_prop_drm_send_forbid_super, 
hgs
parents:
diff changeset
   271
                                        EMbmMsgeditorQgn_prop_drm_send_forbid_super_mask );  
hgs
parents:
diff changeset
   272
                    AknIconUtils::SetSize( iDRMFWDLockIcon->Bitmap(), iAddIconSize );
hgs
parents:
diff changeset
   273
                    }
hgs
parents:
diff changeset
   274
                
hgs
parents:
diff changeset
   275
                addIcon = iDRMFWDLockIcon;
hgs
parents:
diff changeset
   276
                }
hgs
parents:
diff changeset
   277
                break;
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
            case CMsgAttachmentInfo::ESeparateDeliveryValidRights:
hgs
parents:
diff changeset
   280
                {
hgs
parents:
diff changeset
   281
                if ( !iDRMSDIconRightsValid )
hgs
parents:
diff changeset
   282
                    {
hgs
parents:
diff changeset
   283
                    iDRMSDIconRightsValid = AknsUtils::CreateGulIconL( 
hgs
parents:
diff changeset
   284
                                        skins, 
hgs
parents:
diff changeset
   285
                                        KAknsIIDQgnPropDrmRightsValidSuper, 
hgs
parents:
diff changeset
   286
                                        KMsgEditorMbm, 
hgs
parents:
diff changeset
   287
                                        EMbmMsgeditorQgn_prop_drm_rights_valid_super, 
hgs
parents:
diff changeset
   288
                                        EMbmMsgeditorQgn_prop_drm_rights_valid_super );  
hgs
parents:
diff changeset
   289
                    AknIconUtils::SetSize( iDRMSDIconRightsValid->Bitmap(), iAddIconSize );
hgs
parents:
diff changeset
   290
                    }
hgs
parents:
diff changeset
   291
                
hgs
parents:
diff changeset
   292
                addIcon = iDRMSDIconRightsValid;
hgs
parents:
diff changeset
   293
                }
hgs
parents:
diff changeset
   294
                break;
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
            default:
hgs
parents:
diff changeset
   297
                break;
hgs
parents:
diff changeset
   298
            }
hgs
parents:
diff changeset
   299
        }
hgs
parents:
diff changeset
   300
    if ( !icon )
hgs
parents:
diff changeset
   301
        {
hgs
parents:
diff changeset
   302
        icon = supported
hgs
parents:
diff changeset
   303
            ? BitmapForAppL( appUid )
hgs
parents:
diff changeset
   304
            : LoadDefaultBitmapL( EFalse );
hgs
parents:
diff changeset
   305
        }
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    CleanupStack::PushL( icon );    
hgs
parents:
diff changeset
   308
    AknIconUtils::SetSize( icon->Bitmap(), iIconSize );
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
    CGulIcon* finalIcon = NULL;
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
    if ( addIcon )
hgs
parents:
diff changeset
   313
        {
hgs
parents:
diff changeset
   314
        // Create two new bitmaps (app icon and mask) that have document
hgs
parents:
diff changeset
   315
        // icon drawn on top.
hgs
parents:
diff changeset
   316
        CFbsBitmap* newMask = MsgAttachmentUtils::CombineIconsL(
hgs
parents:
diff changeset
   317
            icon->Mask(),
hgs
parents:
diff changeset
   318
            addIcon->Mask(),
hgs
parents:
diff changeset
   319
            addIcon->Mask() );
hgs
parents:
diff changeset
   320
        CleanupStack::PushL( newMask );
hgs
parents:
diff changeset
   321
        CFbsBitmap* newBitmap = MsgAttachmentUtils::CombineIconsL(
hgs
parents:
diff changeset
   322
            icon->Bitmap(),
hgs
parents:
diff changeset
   323
            addIcon->Bitmap(),
hgs
parents:
diff changeset
   324
            addIcon->Mask() );
hgs
parents:
diff changeset
   325
        CleanupStack::PushL( newBitmap );
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
        finalIcon = CGulIcon::NewL( newBitmap, newMask );
hgs
parents:
diff changeset
   328
        CleanupStack::Pop( 2 ); //newBitmap, mask
hgs
parents:
diff changeset
   329
        CleanupStack::PopAndDestroy(); //icon
hgs
parents:
diff changeset
   330
        CleanupStack::PushL( finalIcon );
hgs
parents:
diff changeset
   331
        }
hgs
parents:
diff changeset
   332
    else
hgs
parents:
diff changeset
   333
        {
hgs
parents:
diff changeset
   334
        finalIcon = icon;
hgs
parents:
diff changeset
   335
        }
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
    // fade icon if not fetched.
hgs
parents:
diff changeset
   338
    if ( !aAttaInfo.IsFetched() )
hgs
parents:
diff changeset
   339
        {
hgs
parents:
diff changeset
   340
        // Create copy of the original application icon bitmap & mask
hgs
parents:
diff changeset
   341
        // so that original data is not modified.
hgs
parents:
diff changeset
   342
        CFbsBitmap* newMask = CopyBitmapL( finalIcon->Mask() );
hgs
parents:
diff changeset
   343
        CleanupStack::PushL( newMask );
hgs
parents:
diff changeset
   344
        CFbsBitmap* newBitmap = CopyBitmapL( finalIcon->Bitmap() );
hgs
parents:
diff changeset
   345
        CleanupStack::PushL( newBitmap );
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
        CGulIcon* tempIcon = CGulIcon::NewL( newBitmap, newMask );
hgs
parents:
diff changeset
   348
        
hgs
parents:
diff changeset
   349
        CleanupStack::Pop( 2, newMask );
hgs
parents:
diff changeset
   350
        CleanupStack::PopAndDestroy( addIcon ? finalIcon : icon );
hgs
parents:
diff changeset
   351
        finalIcon = tempIcon;
hgs
parents:
diff changeset
   352
        CleanupStack::PushL( finalIcon );
hgs
parents:
diff changeset
   353
        
hgs
parents:
diff changeset
   354
        FadeBitmapL( finalIcon->Bitmap() );
hgs
parents:
diff changeset
   355
        }
hgs
parents:
diff changeset
   356
    CleanupStack::Pop( finalIcon );
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
    MEBLOGGER_LEAVEFN( "BitmapForFileL" );
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
    return finalIcon;
hgs
parents:
diff changeset
   361
    }
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
// ---------------------------------------------------------
hgs
parents:
diff changeset
   365
// CMsgAttachmentModel::FadeBitmapL
hgs
parents:
diff changeset
   366
// ---------------------------------------------------------
hgs
parents:
diff changeset
   367
//
hgs
parents:
diff changeset
   368
void CMsgAttachmentModel::FadeBitmapL( CFbsBitmap* aBitmap )
hgs
parents:
diff changeset
   369
    {
hgs
parents:
diff changeset
   370
    TRegionFix<1> area( aBitmap->SizeInPixels() );
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
    CFbsBitmapDevice* bmpDevice = CFbsBitmapDevice::NewL( aBitmap );
hgs
parents:
diff changeset
   373
hgs
parents:
diff changeset
   374
    CFbsBitGc* bitGc = NULL;
hgs
parents:
diff changeset
   375
    bmpDevice->CreateContext( bitGc );
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
    if ( bitGc )
hgs
parents:
diff changeset
   378
        {
hgs
parents:
diff changeset
   379
        // TODO: Magic numbers here to stay?
hgs
parents:
diff changeset
   380
        TUint8 blackMap = 128;
hgs
parents:
diff changeset
   381
        TUint8 whiteMap = 255;
hgs
parents:
diff changeset
   382
        bitGc->SetFadingParameters( blackMap, whiteMap );
hgs
parents:
diff changeset
   383
        bitGc->FadeArea( &area );
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
        delete bitGc;
hgs
parents:
diff changeset
   386
        }
hgs
parents:
diff changeset
   387
    delete bmpDevice;
hgs
parents:
diff changeset
   388
    }
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
// ---------------------------------------------------------
hgs
parents:
diff changeset
   391
// CMsgAttachmentModel::CopyBitmapL
hgs
parents:
diff changeset
   392
// ---------------------------------------------------------
hgs
parents:
diff changeset
   393
//
hgs
parents:
diff changeset
   394
CFbsBitmap* CMsgAttachmentModel::CopyBitmapL( const CFbsBitmap* aBitmap )
hgs
parents:
diff changeset
   395
    {
hgs
parents:
diff changeset
   396
    if ( !aBitmap )
hgs
parents:
diff changeset
   397
        {
hgs
parents:
diff changeset
   398
        User::Leave( KErrArgument );
hgs
parents:
diff changeset
   399
        }
hgs
parents:
diff changeset
   400
    
hgs
parents:
diff changeset
   401
    CFbsBitmap* newBitmap = new( ELeave ) CFbsBitmap();
hgs
parents:
diff changeset
   402
    CleanupStack::PushL( newBitmap );
hgs
parents:
diff changeset
   403
    
hgs
parents:
diff changeset
   404
    User::LeaveIfError( newBitmap->Create( aBitmap->SizeInPixels(), aBitmap->DisplayMode() ) );
hgs
parents:
diff changeset
   405
    
hgs
parents:
diff changeset
   406
    CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( newBitmap );
hgs
parents:
diff changeset
   407
    
hgs
parents:
diff changeset
   408
    CleanupStack::Pop( newBitmap );
hgs
parents:
diff changeset
   409
    CleanupStack::PushL( bitmapDevice );
hgs
parents:
diff changeset
   410
    
hgs
parents:
diff changeset
   411
    CBitmapContext* bitmapContext = NULL;
hgs
parents:
diff changeset
   412
    User::LeaveIfError( bitmapDevice->CreateBitmapContext( bitmapContext ) );
hgs
parents:
diff changeset
   413
    CleanupStack::PushL( bitmapContext );
hgs
parents:
diff changeset
   414
    
hgs
parents:
diff changeset
   415
    bitmapContext->BitBlt( TPoint(), aBitmap );
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
    CleanupStack::PopAndDestroy( 2, bitmapDevice );    
hgs
parents:
diff changeset
   418
    return newBitmap;
hgs
parents:
diff changeset
   419
    }
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
// ---------------------------------------------------------
hgs
parents:
diff changeset
   422
// CMsgAttachmentModel::AddAttachmentL
hgs
parents:
diff changeset
   423
//
hgs
parents:
diff changeset
   424
// Adds attachment to the internal array. Notifies attachment model
hgs
parents:
diff changeset
   425
// observer with EMsgAttachmentAdded parameter.
hgs
parents:
diff changeset
   426
// ---------------------------------------------------------
hgs
parents:
diff changeset
   427
//
hgs
parents:
diff changeset
   428
EXPORT_C CMsgAttachmentInfo* CMsgAttachmentModel::AddAttachmentL(
hgs
parents:
diff changeset
   429
    const TDesC& aFullName,
hgs
parents:
diff changeset
   430
    TInt aSize,
hgs
parents:
diff changeset
   431
    TMsvAttachmentId aAttachmentEntryId,
hgs
parents:
diff changeset
   432
    TBool aFetched,
hgs
parents:
diff changeset
   433
    TInt aIndex /*= -1*/ )
hgs
parents:
diff changeset
   434
    {
hgs
parents:
diff changeset
   435
    TDataType dataType;
hgs
parents:
diff changeset
   436
hgs
parents:
diff changeset
   437
    if ( ConeUtils::FileExists( aFullName ) )
hgs
parents:
diff changeset
   438
        {
hgs
parents:
diff changeset
   439
        TUid appUid( KNullUid );
hgs
parents:
diff changeset
   440
        iAppList.AppForDocument( aFullName, appUid, dataType );
hgs
parents:
diff changeset
   441
        }
hgs
parents:
diff changeset
   442
hgs
parents:
diff changeset
   443
    return AddAttachmentL(
hgs
parents:
diff changeset
   444
        aFullName, aSize, aAttachmentEntryId, aFetched, dataType, aIndex );
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
// ---------------------------------------------------------
hgs
parents:
diff changeset
   448
// CMsgAttachmentModel::AddAttachmentL
hgs
parents:
diff changeset
   449
//
hgs
parents:
diff changeset
   450
// Adds attachment to the internal array. Notifies attachment model
hgs
parents:
diff changeset
   451
// observer with EMsgAttachmentAdded parameter.
hgs
parents:
diff changeset
   452
// ---------------------------------------------------------
hgs
parents:
diff changeset
   453
//
hgs
parents:
diff changeset
   454
EXPORT_C CMsgAttachmentInfo* CMsgAttachmentModel::AddAttachmentL(
hgs
parents:
diff changeset
   455
    const TDesC& aFullName,
hgs
parents:
diff changeset
   456
    TInt aSize,
hgs
parents:
diff changeset
   457
    TMsvAttachmentId aAttachmentEntryId,
hgs
parents:
diff changeset
   458
    TBool aFetched,
hgs
parents:
diff changeset
   459
    const TDataType& aDataType,
hgs
parents:
diff changeset
   460
    TInt aIndex )
hgs
parents:
diff changeset
   461
    {
hgs
parents:
diff changeset
   462
    return AddAttachmentL( aFullName, 
hgs
parents:
diff changeset
   463
                           aSize,
hgs
parents:
diff changeset
   464
                           aAttachmentEntryId,
hgs
parents:
diff changeset
   465
                           aFetched,
hgs
parents:
diff changeset
   466
                           aDataType,
hgs
parents:
diff changeset
   467
                           CMsgAttachmentInfo::ENoLimitations,
hgs
parents:
diff changeset
   468
                           aIndex);
hgs
parents:
diff changeset
   469
    }
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
// ---------------------------------------------------------
hgs
parents:
diff changeset
   472
// CMsgAttachmentModel::AddAttachmentL
hgs
parents:
diff changeset
   473
//
hgs
parents:
diff changeset
   474
// Adds attachment to the internal array. Notifies attachment model
hgs
parents:
diff changeset
   475
// observer with EMsgAttachmentAdded parameter.
hgs
parents:
diff changeset
   476
// ---------------------------------------------------------
hgs
parents:
diff changeset
   477
//
hgs
parents:
diff changeset
   478
EXPORT_C CMsgAttachmentInfo* CMsgAttachmentModel::AddAttachmentL(
hgs
parents:
diff changeset
   479
    const TDesC& aFullName,
hgs
parents:
diff changeset
   480
    TInt aSize,
hgs
parents:
diff changeset
   481
    TMsvAttachmentId aAttachmentEntryId,
hgs
parents:
diff changeset
   482
    TBool aFetched,
hgs
parents:
diff changeset
   483
    const TDataType& aDataType,
hgs
parents:
diff changeset
   484
    CMsgAttachmentInfo::TDRMDataType aDRMDataType,
hgs
parents:
diff changeset
   485
    TInt aIndex /*= -1*/ )
hgs
parents:
diff changeset
   486
    {
hgs
parents:
diff changeset
   487
    CMsgAttachmentInfo* info = CreateNewInfoL( aFullName, 
hgs
parents:
diff changeset
   488
                                               aSize, 
hgs
parents:
diff changeset
   489
                                               aFetched, 
hgs
parents:
diff changeset
   490
                                               ETrue, 
hgs
parents:
diff changeset
   491
                                               aAttachmentEntryId, 
hgs
parents:
diff changeset
   492
                                               aDataType, 
hgs
parents:
diff changeset
   493
                                               aDRMDataType );
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
    CleanupStack::PushL( info );
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
    info->SetAttachmentId( aAttachmentEntryId );
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
    if ( aIndex == -1 )
hgs
parents:
diff changeset
   500
        {
hgs
parents:
diff changeset
   501
        iAttachInfoArray->AppendL( info );
hgs
parents:
diff changeset
   502
        }
hgs
parents:
diff changeset
   503
    else
hgs
parents:
diff changeset
   504
        {
hgs
parents:
diff changeset
   505
        iAttachInfoArray->InsertL( aIndex, info );
hgs
parents:
diff changeset
   506
        }
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
    iModified = ETrue;
hgs
parents:
diff changeset
   509
hgs
parents:
diff changeset
   510
    if ( ( iAttachmentModelObserver != NULL ) && ( NumberOfItems() > 0 ) )
hgs
parents:
diff changeset
   511
        {
hgs
parents:
diff changeset
   512
        iAttachmentModelObserver->NotifyChanges(
hgs
parents:
diff changeset
   513
            MMsgAttachmentModelObserver::EMsgAttachmentAdded, info );
hgs
parents:
diff changeset
   514
        }
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
    CleanupStack::Pop(); // info
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
    return info;
hgs
parents:
diff changeset
   519
    }
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
// ---------------------------------------------------------
hgs
parents:
diff changeset
   522
// CMsgAttachmentModel::DeleteAttachment
hgs
parents:
diff changeset
   523
//
hgs
parents:
diff changeset
   524
// Deletes attachment from internal array. Notifies attachment model
hgs
parents:
diff changeset
   525
// observer with EMsgAttachmentRemoved parameter.
hgs
parents:
diff changeset
   526
// ---------------------------------------------------------
hgs
parents:
diff changeset
   527
//
hgs
parents:
diff changeset
   528
EXPORT_C void CMsgAttachmentModel::DeleteAttachment( TInt aIndex )
hgs
parents:
diff changeset
   529
    {
hgs
parents:
diff changeset
   530
    TRAP_IGNORE( DoDeleteAttachmentL( aIndex ) );
hgs
parents:
diff changeset
   531
    }
hgs
parents:
diff changeset
   532
hgs
parents:
diff changeset
   533
// ---------------------------------------------------------
hgs
parents:
diff changeset
   534
// CMsgAttachmentModel::DoDeleteAttachmentL
hgs
parents:
diff changeset
   535
//
hgs
parents:
diff changeset
   536
// Deletes attachment from internal array. Notifies attachment model
hgs
parents:
diff changeset
   537
// observer with EMsgAttachmentRemoved parameter.
hgs
parents:
diff changeset
   538
// ---------------------------------------------------------
hgs
parents:
diff changeset
   539
//
hgs
parents:
diff changeset
   540
void CMsgAttachmentModel::DoDeleteAttachmentL( TInt aIndex )
hgs
parents:
diff changeset
   541
    {
hgs
parents:
diff changeset
   542
    if ( aIndex >= 0 && aIndex < iAttachInfoArray->Count() )
hgs
parents:
diff changeset
   543
        {
hgs
parents:
diff changeset
   544
        CEikonEnv* eikonEnv = CEikonEnv::Static();
hgs
parents:
diff changeset
   545
        
hgs
parents:
diff changeset
   546
        CFileMan* fileMan = CFileMan::NewL( eikonEnv->FsSession() );
hgs
parents:
diff changeset
   547
        CleanupStack::PushL( fileMan );
hgs
parents:
diff changeset
   548
                
hgs
parents:
diff changeset
   549
        CMsgAttachmentInfo* info = iAttachInfoArray->At( aIndex );
hgs
parents:
diff changeset
   550
hgs
parents:
diff changeset
   551
        if ( iAttachmentModelObserver )
hgs
parents:
diff changeset
   552
            {
hgs
parents:
diff changeset
   553
            iAttachmentModelObserver->NotifyChanges(
hgs
parents:
diff changeset
   554
                MMsgAttachmentModelObserver::EMsgAttachmentRemoved, info );
hgs
parents:
diff changeset
   555
            }
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
        // delete the information block.
hgs
parents:
diff changeset
   558
        delete info;
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
        // delete the array entry.
hgs
parents:
diff changeset
   561
        iAttachInfoArray->Delete( aIndex );
hgs
parents:
diff changeset
   562
        // delete files from our temp directory.
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
        TFileName temppath;
hgs
parents:
diff changeset
   565
        MsgAttachmentUtils::GetMsgEditorTempPath( temppath );
hgs
parents:
diff changeset
   566
        fileMan->Delete( temppath );
hgs
parents:
diff changeset
   567
        
hgs
parents:
diff changeset
   568
        CleanupStack::PopAndDestroy( fileMan );
hgs
parents:
diff changeset
   569
            
hgs
parents:
diff changeset
   570
        iModified = ETrue;
hgs
parents:
diff changeset
   571
        }
hgs
parents:
diff changeset
   572
    }
hgs
parents:
diff changeset
   573
hgs
parents:
diff changeset
   574
// ---------------------------------------------------------
hgs
parents:
diff changeset
   575
// CMsgAttachmentModel::IsModified
hgs
parents:
diff changeset
   576
//
hgs
parents:
diff changeset
   577
// Returns true if stored info about attachments is modified.
hgs
parents:
diff changeset
   578
// ---------------------------------------------------------
hgs
parents:
diff changeset
   579
//
hgs
parents:
diff changeset
   580
EXPORT_C TBool CMsgAttachmentModel::IsModified() const
hgs
parents:
diff changeset
   581
    {
hgs
parents:
diff changeset
   582
    return iModified;
hgs
parents:
diff changeset
   583
    }
hgs
parents:
diff changeset
   584
hgs
parents:
diff changeset
   585
// ---------------------------------------------------------
hgs
parents:
diff changeset
   586
// CMsgAttachmentModel::SetModified
hgs
parents:
diff changeset
   587
//
hgs
parents:
diff changeset
   588
// Sets the modified flag.
hgs
parents:
diff changeset
   589
// ---------------------------------------------------------
hgs
parents:
diff changeset
   590
//
hgs
parents:
diff changeset
   591
EXPORT_C void CMsgAttachmentModel::SetModified( TBool aModified )
hgs
parents:
diff changeset
   592
    {
hgs
parents:
diff changeset
   593
    iModified = aModified;
hgs
parents:
diff changeset
   594
    }
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
// ---------------------------------------------------------
hgs
parents:
diff changeset
   597
// CMsgAttachmentModel::IsReadOnly
hgs
parents:
diff changeset
   598
//
hgs
parents:
diff changeset
   599
// Returns ETrue if attachment model was created to be read-only.
hgs
parents:
diff changeset
   600
// ---------------------------------------------------------
hgs
parents:
diff changeset
   601
//
hgs
parents:
diff changeset
   602
EXPORT_C TBool CMsgAttachmentModel::IsReadOnly()
hgs
parents:
diff changeset
   603
    {
hgs
parents:
diff changeset
   604
    return iReadOnly;
hgs
parents:
diff changeset
   605
    }
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
// ---------------------------------------------------------
hgs
parents:
diff changeset
   608
// CMsgAttachmentModel::IsFileAttached
hgs
parents:
diff changeset
   609
//
hgs
parents:
diff changeset
   610
// Returns ETrue if given file is found from the internal array.
hgs
parents:
diff changeset
   611
// ---------------------------------------------------------
hgs
parents:
diff changeset
   612
//
hgs
parents:
diff changeset
   613
EXPORT_C TBool CMsgAttachmentModel::IsFileAttached( const TDesC& aFileName ) const
hgs
parents:
diff changeset
   614
    {
hgs
parents:
diff changeset
   615
    TInt cc = iAttachInfoArray->Count() - 1;
hgs
parents:
diff changeset
   616
hgs
parents:
diff changeset
   617
    // TODO: Make this understandable!
hgs
parents:
diff changeset
   618
    for ( ; ( cc >= 0 ) && ( iAttachInfoArray->At( cc )->FileName().CompareF( aFileName ) != 0 ); --cc )
hgs
parents:
diff changeset
   619
        ;
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
    return cc >= 0;
hgs
parents:
diff changeset
   622
    }
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
// ---------------------------------------------------------
hgs
parents:
diff changeset
   625
// CMsgAttachmentModel::IsIdAttached
hgs
parents:
diff changeset
   626
//
hgs
parents:
diff changeset
   627
// Returns ETrue if given attachment id is found from the internal array.
hgs
parents:
diff changeset
   628
// ---------------------------------------------------------
hgs
parents:
diff changeset
   629
//
hgs
parents:
diff changeset
   630
EXPORT_C TBool CMsgAttachmentModel::IsIdAttached( TMsvAttachmentId aId ) const
hgs
parents:
diff changeset
   631
    {
hgs
parents:
diff changeset
   632
    TInt cc = iAttachInfoArray->Count() - 1;
hgs
parents:
diff changeset
   633
hgs
parents:
diff changeset
   634
    // TODO: Make this understandable!
hgs
parents:
diff changeset
   635
    for (; ( cc >= 0 ) && ( iAttachInfoArray->At( cc )->AttachmentId() != aId ); --cc )
hgs
parents:
diff changeset
   636
        ;
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
    return cc >= 0;
hgs
parents:
diff changeset
   639
    }
hgs
parents:
diff changeset
   640
hgs
parents:
diff changeset
   641
// ---------------------------------------------------------
hgs
parents:
diff changeset
   642
// CMsgAttachmentModel::ViewAttachmentL
hgs
parents:
diff changeset
   643
//
hgs
parents:
diff changeset
   644
// Opens seleceted attachment in corresponding target application.
hgs
parents:
diff changeset
   645
// ---------------------------------------------------------
hgs
parents:
diff changeset
   646
//
hgs
parents:
diff changeset
   647
EXPORT_C void CMsgAttachmentModel::ViewAttachmentL( TInt aIndex )
hgs
parents:
diff changeset
   648
    {
hgs
parents:
diff changeset
   649
    CMsgAttachmentInfo& attInfo = AttachmentInfoAt( aIndex );
hgs
parents:
diff changeset
   650
    TFileName filename = attInfo.FileName();
hgs
parents:
diff changeset
   651
    TThreadId id;
hgs
parents:
diff changeset
   652
    User::LeaveIfError( iAppList.StartDocument( filename, id ) );
hgs
parents:
diff changeset
   653
    }
hgs
parents:
diff changeset
   654
hgs
parents:
diff changeset
   655
// ---------------------------------------------------------
hgs
parents:
diff changeset
   656
// CMsgAttachmentModel::Reset
hgs
parents:
diff changeset
   657
//
hgs
parents:
diff changeset
   658
// Reset the attachment model (empties the internal array).
hgs
parents:
diff changeset
   659
// ---------------------------------------------------------
hgs
parents:
diff changeset
   660
//
hgs
parents:
diff changeset
   661
EXPORT_C void CMsgAttachmentModel::Reset()
hgs
parents:
diff changeset
   662
    {
hgs
parents:
diff changeset
   663
    if ( iAttachInfoArray )
hgs
parents:
diff changeset
   664
        {
hgs
parents:
diff changeset
   665
        iAttachInfoArray->ResetAndDestroy();
hgs
parents:
diff changeset
   666
        }
hgs
parents:
diff changeset
   667
    }
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
// ---------------------------------------------------------
hgs
parents:
diff changeset
   670
// CMsgAttachmentModel::CMsgAttachmentModel
hgs
parents:
diff changeset
   671
//
hgs
parents:
diff changeset
   672
// Constructor.
hgs
parents:
diff changeset
   673
// ---------------------------------------------------------
hgs
parents:
diff changeset
   674
//
hgs
parents:
diff changeset
   675
EXPORT_C CMsgAttachmentModel::CMsgAttachmentModel( TBool aReadOnly )
hgs
parents:
diff changeset
   676
    : iReadOnly( aReadOnly )
hgs
parents:
diff changeset
   677
    {
hgs
parents:
diff changeset
   678
    }
hgs
parents:
diff changeset
   679
hgs
parents:
diff changeset
   680
// ---------------------------------------------------------
hgs
parents:
diff changeset
   681
// CMsgAttachmentModel::ConstructL
hgs
parents:
diff changeset
   682
//
hgs
parents:
diff changeset
   683
// 2nd phase constructor. Creates attachment info array.
hgs
parents:
diff changeset
   684
// ---------------------------------------------------------
hgs
parents:
diff changeset
   685
//
hgs
parents:
diff changeset
   686
EXPORT_C void CMsgAttachmentModel::ConstructL()
hgs
parents:
diff changeset
   687
    {
hgs
parents:
diff changeset
   688
    iAttachInfoArray = new ( ELeave ) CAttInfoArray( KAttachArrayGranularity );
hgs
parents:
diff changeset
   689
    User::LeaveIfError( iAppList.Connect() );
hgs
parents:
diff changeset
   690
    LoadResourcesL();
hgs
parents:
diff changeset
   691
    }
hgs
parents:
diff changeset
   692
hgs
parents:
diff changeset
   693
EXPORT_C void CMsgAttachmentModel::LoadResourcesL()
hgs
parents:
diff changeset
   694
    {
hgs
parents:
diff changeset
   695
    // Resolve icon layout
hgs
parents:
diff changeset
   696
    TRect mainPane;
hgs
parents:
diff changeset
   697
    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPane );
hgs
parents:
diff changeset
   698
    TAknLayoutRect listPaneLayout;
hgs
parents:
diff changeset
   699
    listPaneLayout.LayoutRect(
hgs
parents:
diff changeset
   700
        mainPane,
hgs
parents:
diff changeset
   701
        AknLayout::list_gen_pane( 0 ) );
hgs
parents:
diff changeset
   702
    TAknLayoutRect doubleGraphicLayout;
hgs
parents:
diff changeset
   703
    doubleGraphicLayout.LayoutRect(
hgs
parents:
diff changeset
   704
        listPaneLayout.Rect(),
hgs
parents:
diff changeset
   705
        AknLayout::list_double_large_graphic_pane_list_double2_large_graphic_pane_list_single_big_large_graphic_pane( 0 ) );
hgs
parents:
diff changeset
   706
    TAknLayoutRect iconLayout;
hgs
parents:
diff changeset
   707
    iconLayout.LayoutRect(             
hgs
parents:
diff changeset
   708
        doubleGraphicLayout.Rect(),
hgs
parents:
diff changeset
   709
        AknLayout::List_pane_elements__double_large_graphic__Line_8() );
hgs
parents:
diff changeset
   710
    TAknLayoutRect addIconLayout;
hgs
parents:
diff changeset
   711
    addIconLayout.LayoutRect(             
hgs
parents:
diff changeset
   712
        doubleGraphicLayout.Rect(),
hgs
parents:
diff changeset
   713
        AknLayout::List_pane_elements__double_large_graphic__Line_9( 0 ) );   
hgs
parents:
diff changeset
   714
hgs
parents:
diff changeset
   715
    iIconSize = iconLayout.Rect().Size();
hgs
parents:
diff changeset
   716
    iAddIconSize = addIconLayout.Rect().Size();
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
    MAknsSkinInstance* skins = AknsUtils::SkinInstance();
hgs
parents:
diff changeset
   719
hgs
parents:
diff changeset
   720
    delete iDRMFWDLockIcon;
hgs
parents:
diff changeset
   721
    iDRMFWDLockIcon = NULL;
hgs
parents:
diff changeset
   722
    delete iDRMSDIconRightsValid;
hgs
parents:
diff changeset
   723
    iDRMSDIconRightsValid = NULL;
hgs
parents:
diff changeset
   724
    delete iDRMFWDLockIconNoRights;
hgs
parents:
diff changeset
   725
    iDRMFWDLockIconNoRights = NULL;
hgs
parents:
diff changeset
   726
    delete iDRMSDIconNoRights;
hgs
parents:
diff changeset
   727
    iDRMSDIconNoRights = NULL;
hgs
parents:
diff changeset
   728
hgs
parents:
diff changeset
   729
    TInt count = iAttachInfoArray
hgs
parents:
diff changeset
   730
        ? iAttachInfoArray->Count()
hgs
parents:
diff changeset
   731
        : 0;
hgs
parents:
diff changeset
   732
    while ( count-- )
hgs
parents:
diff changeset
   733
        {
hgs
parents:
diff changeset
   734
        // Update possibly already existing icons
hgs
parents:
diff changeset
   735
        iAttachInfoArray->At( count )->ChangeSizeAndIconL();
hgs
parents:
diff changeset
   736
        }
hgs
parents:
diff changeset
   737
    }
hgs
parents:
diff changeset
   738
hgs
parents:
diff changeset
   739
hgs
parents:
diff changeset
   740
// ---------------------------------------------------------
hgs
parents:
diff changeset
   741
// CMsgAttachmentModel::GetAttachmentFileL
hgs
parents:
diff changeset
   742
// ---------------------------------------------------------
hgs
parents:
diff changeset
   743
//
hgs
parents:
diff changeset
   744
EXPORT_C RFile CMsgAttachmentModel::GetAttachmentFileL( TInt aIndex )
hgs
parents:
diff changeset
   745
    {
hgs
parents:
diff changeset
   746
    CMsgAttachmentInfo* attInfo = iAttachInfoArray->At( aIndex ); 
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
    if ( !attInfo )
hgs
parents:
diff changeset
   749
        {
hgs
parents:
diff changeset
   750
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   751
        }
hgs
parents:
diff changeset
   752
hgs
parents:
diff changeset
   753
    TMsvAttachmentId attachmentId = attInfo->AttachmentId();
hgs
parents:
diff changeset
   754
    RFile file;
hgs
parents:
diff changeset
   755
    if ( attachmentId == KMsvNullIndexEntryId )
hgs
parents:
diff changeset
   756
        {   
hgs
parents:
diff changeset
   757
        RFs& fs = CEikonEnv::Static()->FsSession();
hgs
parents:
diff changeset
   758
        TInt err = file.Open( fs, attInfo->FileName(), EFileRead | EFileShareAny );
hgs
parents:
diff changeset
   759
        if ( err )
hgs
parents:
diff changeset
   760
            {
hgs
parents:
diff changeset
   761
            User::LeaveIfError( file.Open( fs, attInfo->FileName(), EFileRead | EFileShareReadersOnly ) );
hgs
parents:
diff changeset
   762
            }
hgs
parents:
diff changeset
   763
        }
hgs
parents:
diff changeset
   764
    else
hgs
parents:
diff changeset
   765
        {
hgs
parents:
diff changeset
   766
        file = iAttachmentModelObserver->GetAttachmentFileL( attachmentId );
hgs
parents:
diff changeset
   767
        }
hgs
parents:
diff changeset
   768
    return file;
hgs
parents:
diff changeset
   769
    }
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
// ---------------------------------------------------------
hgs
parents:
diff changeset
   772
// CMsgAttachmentModel::LoadDefaultBitmapL
hgs
parents:
diff changeset
   773
//
hgs
parents:
diff changeset
   774
// Loads system default bitmap.
hgs
parents:
diff changeset
   775
// ---------------------------------------------------------
hgs
parents:
diff changeset
   776
//
hgs
parents:
diff changeset
   777
CGulIcon* CMsgAttachmentModel::LoadDefaultBitmapL( TBool /*aSupported*/ )
hgs
parents:
diff changeset
   778
    {
hgs
parents:
diff changeset
   779
    MEBLOGGER_ENTERFN( "LoadDefaultBitmapL" );
hgs
parents:
diff changeset
   780
    if( AknLayoutUtils::LayoutMirrored() )
hgs
parents:
diff changeset
   781
        {
hgs
parents:
diff changeset
   782
        return AknsUtils::CreateGulIconL(
hgs
parents:
diff changeset
   783
            AknsUtils::SkinInstance(),
hgs
parents:
diff changeset
   784
            KAknsIIDQgnPropUnknown,
hgs
parents:
diff changeset
   785
            KMsgEditorMbm_AH,
hgs
parents:
diff changeset
   786
            EMbmMsgeditor_ahQgn_prop_unknown,
hgs
parents:
diff changeset
   787
            EMbmMsgeditor_ahQgn_prop_unknown_mask );
hgs
parents:
diff changeset
   788
        }
hgs
parents:
diff changeset
   789
    else
hgs
parents:
diff changeset
   790
        {
hgs
parents:
diff changeset
   791
        return AknsUtils::CreateGulIconL(
hgs
parents:
diff changeset
   792
            AknsUtils::SkinInstance(),
hgs
parents:
diff changeset
   793
            KAknsIIDQgnPropUnknown,
hgs
parents:
diff changeset
   794
            KMsgEditorMbm,
hgs
parents:
diff changeset
   795
            EMbmMsgeditorQgn_prop_unknown,
hgs
parents:
diff changeset
   796
            EMbmMsgeditorQgn_prop_unknown_mask );        
hgs
parents:
diff changeset
   797
        }
hgs
parents:
diff changeset
   798
    }
hgs
parents:
diff changeset
   799
hgs
parents:
diff changeset
   800
// ---------------------------------------------------------
hgs
parents:
diff changeset
   801
// CMsgAttachmentModel::AppUidForFileL
hgs
parents:
diff changeset
   802
//
hgs
parents:
diff changeset
   803
// Returns app ui of application that handles given file.
hgs
parents:
diff changeset
   804
// ---------------------------------------------------------
hgs
parents:
diff changeset
   805
//
hgs
parents:
diff changeset
   806
TUid CMsgAttachmentModel::AppUidForFileL( const TFileName& aFileName )
hgs
parents:
diff changeset
   807
    {
hgs
parents:
diff changeset
   808
    TUid appUid( KNullUid );
hgs
parents:
diff changeset
   809
    TDataType dataType;
hgs
parents:
diff changeset
   810
hgs
parents:
diff changeset
   811
    User::LeaveIfError( iAppList.AppForDocument( aFileName, appUid, dataType ) );
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
    if ( appUid.iUid == 0 )
hgs
parents:
diff changeset
   814
        {
hgs
parents:
diff changeset
   815
        User::LeaveIfError( iAppList.AppForDataType( dataType, appUid ) );
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
hgs
parents:
diff changeset
   818
    return appUid;
hgs
parents:
diff changeset
   819
    }
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
// ---------------------------------------------------------
hgs
parents:
diff changeset
   822
// CMsgAttachmentModel::AppUidForDataTypeL
hgs
parents:
diff changeset
   823
//
hgs
parents:
diff changeset
   824
// Returns app ui of application that handles given data type.
hgs
parents:
diff changeset
   825
// ---------------------------------------------------------
hgs
parents:
diff changeset
   826
//
hgs
parents:
diff changeset
   827
TUid CMsgAttachmentModel::AppUidForDataTypeL( const TDataType& aDataType )
hgs
parents:
diff changeset
   828
    {
hgs
parents:
diff changeset
   829
    TUid appUid( KNullUid );
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
    User::LeaveIfError( iAppList.AppForDataType( aDataType, appUid ) );
hgs
parents:
diff changeset
   832
hgs
parents:
diff changeset
   833
    return appUid;
hgs
parents:
diff changeset
   834
    }
hgs
parents:
diff changeset
   835
hgs
parents:
diff changeset
   836
// ---------------------------------------------------------
hgs
parents:
diff changeset
   837
// CMsgAttachmentModel::AppUidFromGameFileL
hgs
parents:
diff changeset
   838
//
hgs
parents:
diff changeset
   839
// Returns app uid of application that handles given game data.
hgs
parents:
diff changeset
   840
// ---------------------------------------------------------
hgs
parents:
diff changeset
   841
TUid CMsgAttachmentModel::AppUidFromGameFileL(
hgs
parents:
diff changeset
   842
    TDataType& aDataType, const TDesC& aFileName )
hgs
parents:
diff changeset
   843
    {
hgs
parents:
diff changeset
   844
    TUid appUid( KNullUid );
hgs
parents:
diff changeset
   845
    RFile file;
hgs
parents:
diff changeset
   846
    RFs& fs = CEikonEnv::Static()->FsSession();
hgs
parents:
diff changeset
   847
hgs
parents:
diff changeset
   848
    User::LeaveIfError( file.Open( fs, aFileName, EFileRead ) );
hgs
parents:
diff changeset
   849
    CleanupClosePushL(file);
hgs
parents:
diff changeset
   850
    RFileReadStream reader( file );
hgs
parents:
diff changeset
   851
    CleanupClosePushL(reader);
hgs
parents:
diff changeset
   852
    TInt32 gameId = reader.ReadInt32L();
hgs
parents:
diff changeset
   853
    
hgs
parents:
diff changeset
   854
    CleanupStack::PopAndDestroy(2,&file); //reader , file 
hgs
parents:
diff changeset
   855
hgs
parents:
diff changeset
   856
    if ( gameId > KMaxGameEngineDataID )
hgs
parents:
diff changeset
   857
        {
hgs
parents:
diff changeset
   858
        TBuf8<256> completedType = aDataType.Des8();
hgs
parents:
diff changeset
   859
        completedType.Append(_L("-"));
hgs
parents:
diff changeset
   860
        completedType.AppendNumFixedWidth( gameId, EHex, 8 );
hgs
parents:
diff changeset
   861
        aDataType = TDataType( completedType );
hgs
parents:
diff changeset
   862
        }
hgs
parents:
diff changeset
   863
hgs
parents:
diff changeset
   864
    iAppList.AppForDataType( aDataType, appUid );
hgs
parents:
diff changeset
   865
hgs
parents:
diff changeset
   866
    if ( appUid.iUid == 0 )
hgs
parents:
diff changeset
   867
        {
hgs
parents:
diff changeset
   868
        appUid.iUid = KGameEngineUID;
hgs
parents:
diff changeset
   869
        }
hgs
parents:
diff changeset
   870
hgs
parents:
diff changeset
   871
    return appUid;
hgs
parents:
diff changeset
   872
    }
hgs
parents:
diff changeset
   873
hgs
parents:
diff changeset
   874
// ---------------------------------------------------------
hgs
parents:
diff changeset
   875
// CMsgAttachmentModel::BitmapForAppL
hgs
parents:
diff changeset
   876
//
hgs
parents:
diff changeset
   877
// Returns pointer to bitmap of given application.
hgs
parents:
diff changeset
   878
// ---------------------------------------------------------
hgs
parents:
diff changeset
   879
//
hgs
parents:
diff changeset
   880
CGulIcon* CMsgAttachmentModel::BitmapForAppL( const TUid &aAppUid )
hgs
parents:
diff changeset
   881
    {
hgs
parents:
diff changeset
   882
    MEBLOGGER_ENTERFN("BitmapForAppL");
hgs
parents:
diff changeset
   883
    
hgs
parents:
diff changeset
   884
    CFbsBitmap* tempBitmap = NULL;
hgs
parents:
diff changeset
   885
    CFbsBitmap* tempMask = NULL;
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
    AknsUtils::CreateAppIconLC(
hgs
parents:
diff changeset
   888
        AknsUtils::SkinInstance(),
hgs
parents:
diff changeset
   889
        aAppUid,
hgs
parents:
diff changeset
   890
        EAknsAppIconTypeList,
hgs
parents:
diff changeset
   891
        tempBitmap,
hgs
parents:
diff changeset
   892
        tempMask );
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
    CGulIcon* bitmap = CGulIcon::NewL( tempBitmap, tempMask );
hgs
parents:
diff changeset
   895
    CleanupStack::Pop( 2 ); // tempBitmap, tempMask
hgs
parents:
diff changeset
   896
hgs
parents:
diff changeset
   897
    MEBLOGGER_LEAVEFN( "BitmapForAppL" );
hgs
parents:
diff changeset
   898
hgs
parents:
diff changeset
   899
    return bitmap;
hgs
parents:
diff changeset
   900
    }
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
// ---------------------------------------------------------
hgs
parents:
diff changeset
   903
// CMsgAttachmentModel::CreateNewInfoL
hgs
parents:
diff changeset
   904
//
hgs
parents:
diff changeset
   905
// Creates new attachment info object.
hgs
parents:
diff changeset
   906
// ---------------------------------------------------------
hgs
parents:
diff changeset
   907
//
hgs
parents:
diff changeset
   908
CMsgAttachmentInfo* CMsgAttachmentModel::CreateNewInfoL(
hgs
parents:
diff changeset
   909
    const TDesC& aFileName,
hgs
parents:
diff changeset
   910
    TInt aSize,
hgs
parents:
diff changeset
   911
    TBool aFetched,
hgs
parents:
diff changeset
   912
    TBool aAttachedThisSession,
hgs
parents:
diff changeset
   913
    TMsvAttachmentId aAttachmentId,
hgs
parents:
diff changeset
   914
    const TDataType& aDataType,
hgs
parents:
diff changeset
   915
    CMsgAttachmentInfo::TDRMDataType aDRMDataType )
hgs
parents:
diff changeset
   916
    {
hgs
parents:
diff changeset
   917
    return CMsgAttachmentInfo::NewL(
hgs
parents:
diff changeset
   918
        *this,
hgs
parents:
diff changeset
   919
        aFileName,
hgs
parents:
diff changeset
   920
        aSize,
hgs
parents:
diff changeset
   921
        aFetched,
hgs
parents:
diff changeset
   922
        aAttachedThisSession,
hgs
parents:
diff changeset
   923
        aAttachmentId,
hgs
parents:
diff changeset
   924
        aDataType,
hgs
parents:
diff changeset
   925
        aDRMDataType );
hgs
parents:
diff changeset
   926
    }
hgs
parents:
diff changeset
   927
hgs
parents:
diff changeset
   928
// ========== OTHER EXPORTED FUNCTIONS =====================
hgs
parents:
diff changeset
   929
hgs
parents:
diff changeset
   930
//  End of File