--- /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