phonebookui/Phonebook/PbkAiwProviders/src/CPbkAiwCmdAssignProvider.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/PbkAiwProviders/src/CPbkAiwCmdAssignProvider.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,419 @@
+/*
+* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*     Implements assign ringing tone provider.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkAiwCmdAssignProvider.h"
+
+#include <AiwMenu.h>
+#include <AiwCommon.h>
+#include <AiwCommon.hrh>
+#include <barsread.h>
+#include <PbkAiwProvidersRes.rsg>
+#include <Phonebook.rsg>
+#include <CPbkContactEngine.h>
+#include <AknNoteWrappers.h>
+#include <CPbkMultipleEntryFetchDlg.h>
+#include "CPbkAssignRingingToneCmd.h"
+#include "CPbkAssignImageCmd.h"
+#include "PbkDataCaging.hrh"
+#include "PbkAiwProviders.hrh"
+#include "PbkProviderUtils.h"
+#include <CPbkDrmManager.h>
+
+#include <stringloader.h>
+#include <centralrepository.h>
+#include <ProfileEngineDomainCRKeys.h> //KProEngRingingToneMaxSize
+#include <pbkdebug.h>
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_LIT(KViewResFileName, "PbkView.rsc");
+
+const TInt Kkilo = 1024;
+
+}
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkAiwCmdAssignProvider* CPbkAiwCmdAssignProvider::NewL()
+    {
+    CPbkAiwCmdAssignProvider* self =
+        new(ELeave) CPbkAiwCmdAssignProvider;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CPbkAiwCmdAssignProvider::CPbkAiwCmdAssignProvider()
+        : iViewResourceFile(*CCoeEnv::Static())
+    {
+    }
+
+
+void CPbkAiwCmdAssignProvider::ConstructL()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkAiwCmdAssignProvider::ConstructL start"));
+
+    BaseConstructL();
+
+    _LIT(KSeparator, "\\");
+
+    {
+    TFileName fileName;
+    fileName.Copy(KPbkRomFileDrive);
+    fileName.Append(KDC_RESOURCE_FILES_DIR);
+    fileName.Append(KSeparator);
+    fileName.Append(KViewResFileName);
+    iViewResourceFile.OpenL(fileName);
+    } // TFileName goes out of scope
+
+    iDrmManager = CPbkDrmManager::NewL();
+    GetMaxToneFileSizeL( iToneFileSizeLimitKB );
+
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkAiwCmdAssignProvider::ConstructL end"));
+    }
+
+
+CPbkAiwCmdAssignProvider::~CPbkAiwCmdAssignProvider()
+    {
+    delete iDrmManager;
+    iViewResourceFile.Close();
+    }
+
+void CPbkAiwCmdAssignProvider::HandleServiceCmdL
+        (const TInt& aCmdId, const CAiwGenericParamList& aInParamList,
+         CAiwGenericParamList& /*aOutParamList*/, TUint /*aCmdOptions*/,
+         const MAiwNotifyCallback* aCallback)
+    {
+    if ((aCmdId == EPbkAiwCmdAssignThumbnail) ||
+        (aCmdId == EPbkAiwCmdAssignRingingTone) ||
+        (aCmdId == EPbkAiwCmdAssignCallImage))
+        {
+        // Retrieve filename and file MIME type from AIW param list
+        TPtrC fileName = PbkProviderUtils::GetAiwParamAsDescriptor
+            (aInParamList, EGenericParamFile);
+
+        TPtrC mimeTypeString = PbkProviderUtils::GetAiwParamAsDescriptor
+            (aInParamList, EGenericParamMIMEType);
+
+        // Leave, if there were not given all the required parameters
+        if ((fileName == KNullDesC) || (mimeTypeString == KNullDesC))
+            {
+            User::Leave(KErrArgument);
+            }
+
+        VerifyMimeTypeL(aCmdId, mimeTypeString);
+
+        TInt rtSizeLimitError = KErrNone;
+
+        // Ringing tone size limit check returns KErrNone or KErrTooBig
+        if (aCmdId == EPbkAiwCmdAssignRingingTone)
+            {
+            rtSizeLimitError = CheckFileSizeLimit( fileName );
+            }
+
+        if ( rtSizeLimitError == KErrNone )
+            {
+            // Perform the operation
+            CmdAssignL(aCmdId, fileName, aInParamList, aCallback);
+            }
+        }
+    }
+
+
+void CPbkAiwCmdAssignProvider::InitializeMenuPaneL
+        (CAiwMenuPane& aMenuPane, TInt aIndex,
+         TInt /*aCascadeId*/, const CAiwGenericParamList& aInParamList)
+    {
+    // Get MIME type string from parameters
+    TPtrC mimeTypeString = PbkProviderUtils::GetAiwParamAsDescriptor
+        (aInParamList, EGenericParamMIMEType);
+
+    TPtrC fileNameString = PbkProviderUtils::GetAiwParamAsDescriptor
+        (aInParamList, EGenericParamFile);
+
+    if ((mimeTypeString.Length() > 0) && (fileNameString.Length() > 0))
+        {
+        // Map the MIME type
+        TInt mimeType = PbkProviderUtils::MapMimeTypeL(mimeTypeString);
+
+        // Create the appropriate menu based on received MIME type
+        if (mimeType != EPbkMimeTypeNotSupported)
+            {
+            TInt menuResId;
+            if (mimeType == EPbkMimeTypeImage)
+                {
+                menuResId = R_AIW_ASSIGN_IMAGE_MENU;
+                }
+            else
+                {
+                menuResId = R_AIW_ASSIGN_TONE_MENU;
+                }
+            TResourceReader reader;
+            CCoeEnv::Static()->CreateResourceReaderLC(reader, menuResId);
+            aMenuPane.AddMenuItemsL(reader, KAiwCmdAssign, aIndex);
+            CleanupStack::PopAndDestroy(); // reader
+            }
+        }
+    }
+
+
+void CPbkAiwCmdAssignProvider::HandleMenuCmdL
+        (TInt aMenuCmdId, const CAiwGenericParamList& aInParamList,
+         CAiwGenericParamList& aOutParamList, TUint aCmdOptions,
+         const MAiwNotifyCallback* aCallback)
+    {
+    // Route to HandleServiceCmdL
+    HandleServiceCmdL(aMenuCmdId, aInParamList,
+        aOutParamList, aCmdOptions, aCallback);
+    }
+
+
+void CPbkAiwCmdAssignProvider::CmdAssignL
+        (TInt aMenuCmdId, const TDesC& aFileName,
+        const CAiwGenericParamList& aInParamList,
+        const MAiwNotifyCallback* aCallback)
+    {
+    if ( aMenuCmdId == EPbkAiwCmdAssignRingingTone &&
+         iDrmManager->IsRingingToneProtectedL( aFileName ) )
+        {
+        return;
+        }
+    else if ( aMenuCmdId == EPbkAiwCmdAssignThumbnail &&
+         iDrmManager->IsThumbnailProtectedL( aFileName ) )
+        {
+        return;
+        }
+
+    SaveStatusPaneL();
+
+    CContactViewBase& allContactsView = iEngine->AllContactsView();
+
+    CPbkMultipleEntryFetchDlg::TParams params;
+    params.iContactView = &allContactsView;
+
+    // Cope with the design problems of AIW framework
+    MAiwNotifyCallback* nonConstCallback =
+        const_cast<MAiwNotifyCallback*> (aCallback);
+
+    CPbkMultipleEntryFetchDlg* fetchDlg = CPbkMultipleEntryFetchDlg::NewL
+        (params, *iEngine);
+    const TInt res = fetchDlg->ExecuteLD();
+    if (res)
+        {
+        CleanupStack::PushL(params);
+
+        switch (aMenuCmdId)
+            {
+            case EPbkAiwCmdAssignThumbnail:
+                {
+                CPbkAssignImageCmd* cmd =
+                    CPbkAssignImageCmd::NewL(
+                        aFileName,
+                        params.iMarkedEntries,
+                        EPbkFieldIdThumbnailImage,
+                        *iEngine,
+                        aInParamList,
+                        nonConstCallback);
+                AddAndExecuteCommandL(cmd);
+                CleanupStack::Pop(); // params, ownership was taken above
+                break;
+                }
+
+            case EPbkAiwCmdAssignRingingTone:
+                {
+                CPbkAssignRingingToneCmd* cmd =
+                    CPbkAssignRingingToneCmd::NewL(
+                        aFileName,
+                        params.iMarkedEntries,
+                        *iEngine,
+                        aInParamList,
+                        nonConstCallback);
+                AddAndExecuteCommandL(cmd);
+                CleanupStack::Pop(); // params, ownership was taken above
+                break;
+                }
+
+            default:
+                {
+                // Unsupported MIME type somehow slipped through,
+                // ignore it
+                CleanupStack::PopAndDestroy(); // params
+                break;
+                }
+            }
+        }
+    else
+        {
+        if (aCallback)
+            {
+            // Cope with the design errors of AIW framework, it declares
+            // the event param list is optional, but still takes it as
+            //a reference
+            CAiwGenericParamList* eventParamList = NULL;
+            nonConstCallback->HandleNotifyL(
+                KAiwCmdAssign,
+                KAiwEventCanceled,
+                *eventParamList,
+                aInParamList);
+            }
+        }
+
+    RestoreStatusPaneL();
+    }
+
+void CPbkAiwCmdAssignProvider::VerifyMimeTypeL
+        (TInt aMenuCmdId, const TDesC& aMimeTypeString)
+    {
+    // Map the MIME type
+    TInt mimeType = PbkProviderUtils::MapMimeTypeL(aMimeTypeString);
+
+    // Verify MIME type
+    if (mimeType == EPbkMimeTypeImage)
+        {
+        if (aMenuCmdId == EPbkAiwCmdAssignRingingTone)
+            {
+            User::Leave(KErrArgument);
+            }
+        }
+    else if (mimeType == EPbkMimeTypeAudio)
+        {
+        if (aMenuCmdId != EPbkAiwCmdAssignRingingTone)
+            {
+            User::Leave(KErrArgument);
+            }
+        }
+    else if (mimeType == EPbkMimeTypeRingingTone)
+        {
+        if (aMenuCmdId != EPbkAiwCmdAssignRingingTone)
+            {
+            User::Leave(KErrArgument);
+            }
+        }
+
+#ifdef RD_VIDEO_AS_RINGING_TONE
+
+    else if (mimeType == EPbkMimeTypeVideo)
+        {
+        if (aMenuCmdId != EPbkAiwCmdAssignRingingTone)
+            {
+            User::Leave(KErrArgument);
+            }
+        }
+#endif      //   RD_VIDEO_AS_RINGING_TONE
+
+    else
+        {
+        User::Leave(KErrArgument);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPbkAiwCmdAssignProvider::CheckFileSizeLimit
+// -----------------------------------------------------------------------------
+//
+TInt CPbkAiwCmdAssignProvider::CheckFileSizeLimit( const TDesC& aFileName )
+    {
+    TInt error = KErrNone;
+
+    if ( iToneFileSizeLimitKB  )
+        {
+        if ( CheckToneFileSize( aFileName, iToneFileSizeLimitKB) != KErrNone )
+            {
+            TRAP_IGNORE(
+                ShowSizeErrorNoteL( iToneFileSizeLimitKB ));
+            error = KErrTooBig;
+            }
+        }
+
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbkAiwCmdAssignProvider::GetMaxToneFileSizeL
+// -----------------------------------------------------------------------------
+//
+void CPbkAiwCmdAssignProvider::GetMaxToneFileSizeL( TInt& aMaxSizeKB ) const
+    {
+    CRepository* cenrep = CRepository::NewL( KCRUidProfileEngine );
+    CleanupStack::PushL( cenrep );
+    TInt error = cenrep->Get( KProEngRingingToneMaxSize, aMaxSizeKB );
+    CleanupStack::PopAndDestroy( cenrep );
+    if ( error != KErrNone )
+        {
+        aMaxSizeKB = 0;
+        }
+    if ( aMaxSizeKB < 0 )
+        {
+         aMaxSizeKB = 0;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPbkAiwCmdAssignProvider::CheckToneFileSize
+// -----------------------------------------------------------------------------
+//
+TInt CPbkAiwCmdAssignProvider::CheckToneFileSize( const TDesC& aFile, TInt aSizeLimitKB )
+    {
+    // Get file size
+    TInt size = 0;
+    TInt error = KErrNone;
+    RFs fs;
+    error = fs.Connect();
+    if ( !error )
+        {
+        TEntry entry;
+        error = fs.Entry( aFile, entry );
+        if ( !error )
+            {
+            size = entry.iSize;
+            }
+        fs.Close();
+        }
+
+    // Note: if file size can't be determined, the check fails.
+    aSizeLimitKB *= Kkilo;
+    if ( aSizeLimitKB  &&  size > aSizeLimitKB )
+        {
+        error = KErrTooBig;
+        }
+
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbkAiwCmdAssignProvider::ShowSizeErrorNoteL
+// -----------------------------------------------------------------------------
+//
+void CPbkAiwCmdAssignProvider::ShowSizeErrorNoteL( TInt aSizeLimitKB ) const
+    {
+    HBufC* errorText = StringLoader::LoadLC( R_PROFILE_TEXT_TONE_MAXSIZE_ERROR, aSizeLimitKB );
+    CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
+    note->ExecuteLD( *errorText );
+
+    CleanupStack::PopAndDestroy( errorText );
+    }
+
+// End of File
+