phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactRingingToneAssigner.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactRingingToneAssigner.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,344 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 contact ringing tone assigner.
+*
+*/
+
+
+#include "CPbk2ContactRingingToneAssigner.h"
+
+// Phonebook 2
+#include "MPbk2ContactAssignerObserver.h"
+#include <CPbk2DrmManager.h>
+#include <Pbk2ServerApp.rsg>
+
+// Virtual Phonebook
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactFieldTextData.h>
+
+// System includes
+#include <centralrepository.h>
+#include <ProfileEngineDomainCRKeys.h> // KProEngRingingToneMaxSize
+#include <f32file.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::CPbk2ContactRingingToneAssigner
+// --------------------------------------------------------------------------
+//
+CPbk2ContactRingingToneAssigner::CPbk2ContactRingingToneAssigner
+        ( MPbk2ContactAssignerObserver& aObserver ):
+            CActive( EPriorityIdle ), iObserver( aObserver ),
+            iIndex( KErrNotSupported )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::~CPbk2ContactRingingToneAssigner
+// --------------------------------------------------------------------------
+//
+CPbk2ContactRingingToneAssigner::~CPbk2ContactRingingToneAssigner()
+    {
+    Cancel();
+    delete iDrmManager;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2ContactRingingToneAssigner* CPbk2ContactRingingToneAssigner::NewL
+        ( MPbk2ContactAssignerObserver& aObserver )
+    {
+    CPbk2ContactRingingToneAssigner* self =
+        new ( ELeave ) CPbk2ContactRingingToneAssigner( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::ConstructL()
+    {
+    iDrmManager = CPbk2DrmManager::NewL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::AssignDataL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::AssignDataL
+        ( MVPbkStoreContact& aStoreContact,
+          MVPbkStoreContactField* aContactField,
+          const MVPbkFieldType* aFieldType, const HBufC* aDataBuffer )
+    {
+    TBool isProtected( ETrue );
+    TInt error = PassesDrmCheckL( aDataBuffer, isProtected );
+    
+    if ( !isProtected && error == KErrNone && PassesSizeCheckL( aDataBuffer ) )
+        {
+        if ( !aContactField )
+            {
+            MVPbkStoreContactField* field =
+                aStoreContact.CreateFieldLC( *aFieldType );
+            InsertDataL( *field, *aDataBuffer );
+            CleanupStack::Pop(); // field
+            iIndex = aStoreContact.AddFieldL( field ); // takes ownership
+            }
+        else
+            {
+            InsertDataL( *aContactField, *aDataBuffer );
+            }
+
+        iState = EStopping;
+        // Notify observer asynchronously
+        IssueRequest();
+        }
+    else
+        {
+        // Notify observer asynchronously
+        iState = EDrmProtected;
+        iError = error;
+        IssueRequest();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::AssignAttributeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::AssignAttributeL
+        ( MVPbkStoreContact& /*aStoreContact*/,
+          MVPbkStoreContactField* /*aContactField*/,
+          TPbk2AttributeAssignData /*aAttributeAssignData*/ )
+    {
+    // Not supported
+    User::Leave( KErrNotSupported );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::RunL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::RunL()
+    {
+    switch ( iState )
+        {
+        case EStopping:
+            {
+            if ( iError == KErrNone )
+                {
+                // Just notify the observer
+                iObserver.AssignComplete( *this, iIndex );
+                }
+            else
+                {
+                iObserver.AssignFailed( *this, iError );
+                }
+            break;
+            }
+        case EDrmProtected:
+            {
+            iObserver.AssignFailed( *this, iError );
+            break;
+            }            
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        }        
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::DoCancel()
+    {
+    // Nothing to do
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactRingingToneAssigner::RunError( TInt /*aError*/ )
+    {
+    // No leaving code in RunL
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::InsertDataL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::InsertDataL
+        ( MVPbkStoreContactField& aField, const HBufC& aDataBuffer )
+    {
+    MVPbkContactFieldTextData::Cast( aField.FieldData() ).
+        SetTextL( aDataBuffer );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::IssueRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::IssueRequest()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::PassesDrmCheckL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactRingingToneAssigner::PassesDrmCheckL( 
+        const HBufC* aDataBuffer,
+        TBool& aIsProtected )
+    {
+    aIsProtected = ETrue;
+    TInt error( KErrNone );
+
+    if ( aDataBuffer )
+        {
+        error = iDrmManager->IsRingingToneForbidden( *aDataBuffer, aIsProtected );
+        }
+
+    return error;
+    }    
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::PassesSizeCheckL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2ContactRingingToneAssigner::PassesSizeCheckL
+        ( const HBufC* aDataBuffer )
+    {
+    TBool dataInvalid = EFalse;
+
+    if ( aDataBuffer )
+        {
+        TInt sizeLimit = KErrNone;
+        MaxToneFileSizeL( sizeLimit );
+        TInt rtSizeLimitError = CheckFileSizeLimit
+            ( *aDataBuffer, sizeLimit );
+        if ( rtSizeLimitError )
+            {
+            dataInvalid = ETrue;
+            }
+        }
+
+    return !dataInvalid;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::MaxToneFileSizeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::MaxToneFileSizeL
+        ( 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;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::CheckFileSizeLimitL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactRingingToneAssigner::CheckFileSizeLimit
+        ( const TDesC& aFileName, TInt aSizeLimit )
+    {
+    TInt error = KErrNone;
+
+    if ( aSizeLimit )
+        {
+        if ( CheckToneFileSize( aFileName, aSizeLimit) != KErrNone )
+            {
+            TRAP_IGNORE(
+                ShowSizeErrorNoteL( aSizeLimit ) );
+            error = KErrTooBig;
+            }
+        }
+
+    return error;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::CheckToneFileSizeL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactRingingToneAssigner::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;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactRingingToneAssigner::ShowSizeErrorNoteL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactRingingToneAssigner::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