--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/notifier/src/DRMMessageStorage.cpp Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,292 @@
+/*
+* Copyright (c) 2004 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: DRM3 Engine manages all DRM related database operations.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <s32mem.h>
+#include "DRMNotifierSession.h"
+#include "DRMEventAddRemove.h"
+#include "DRMEventModify.h"
+#include "DRMEventTimeChange.h"
+#include "drmnotifierclientserver.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+// MACROS
+
+#ifdef _DRM_TESTING
+_LIT( KDateTimeFormat, "%F%Y%M%D%H%T%S%C" );
+#define _LOGBUFNUM( a, b ) { TBuf8< 64 > __b( a ); __b.AppendNum( b ); file.Write( __b ); }
+#define LOGBUFNUM( a, b ) { TBuf8< 64 > __b( a ); __b.AppendNum( b ); Log( __b ); }
+#define LOG( a ) Log( a )
+
+#else
+#define _LOGBUFNUM( a, b )
+#define LOGBUFNUM( a, b )
+#define LOG( a )
+#endif
+
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDRMMessageStorage* CDRMMessageStorage::NewL()
+ {
+ CDRMMessageStorage* self = new( ELeave ) CDRMMessageStorage();
+
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CDRMMessageStorage::~CDRMMessageStorage()
+ {
+ for ( TInt i = 0; i < iMessages.Count();i++ )
+ {
+ delete iMessages[i]->iData;
+ delete iMessages[i]->iMessageData;
+ }
+ iMessages.ResetAndDestroy();
+ iSessions.Reset();
+
+ LOG( _L8( "Dying..." ) );
+
+#ifdef _DRM_TESTING
+ delete iLog;
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::AddSession
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::AddSession( CDRMNotifierSession* aSession )
+ {
+ iSessions.Append( aSession );
+ };
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::UpdateMessage
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::UpdateMessage( TMessageData* aMessage )
+ {
+ TInt count = 0;
+
+ aMessage->iRefCount = aMessage->iRefCount - 1;
+
+ if(aMessage->iRefCount == 0)
+ {
+ for( count = 0; count < iMessages.Count(); count++ )
+ {
+ if( iMessages[count] == aMessage )
+ {
+ delete iMessages[count]->iMessageData;
+ delete iMessages[count]->iData;
+ iMessages[count]->iMessageData = 0;
+ iMessages[count]->iData = 0;
+ }
+ iMessages.Remove(count);
+ count = iMessages.Count();
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::GetEventObjectLC
+// -----------------------------------------------------------------------------
+//
+MDRMEvent* CDRMMessageStorage::GetEventObjectLC( TDRMEventType aEventType )
+ {
+ MDRMEvent* event = NULL;
+
+ switch( aEventType)
+ {
+ case KEventAddRemove:
+ event = CDRMEventAddRemove::NewLC(ERightsObjectRecieved);
+ break;
+ case KEventModify:
+ event = CDRMEventModify::NewLC();
+ break;
+ case KEventTimeChange:
+ event = CDRMEventTimeChange::NewLC();
+ break;
+ default:
+ User::Leave(KErrArgument);
+ break;
+ }
+ return event;
+ }
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::NotifyL
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::NotifyL(TDRMEventType& aEventType, const RMessage2& aMessage)
+ {
+ TInt queued = EFalse;
+ TMessageData* message = new (ELeave) TMessageData;
+ CleanupStack::PushL(message);
+ TUint8* eventBuf = static_cast<TUint8*>(User::AllocLC(DRMNotifier::KDRMSizeOfMessage));
+ TPtr8 event( eventBuf,0,DRMNotifier::KDRMSizeOfMessage );
+
+ message->iRefCount = 0;
+ message->iEventType = aEventType;
+ message->iData = 0;
+ message->iMessageData = eventBuf;
+
+
+ // Read the buffer:
+ aMessage.ReadL( 0, event);
+
+ RMemReadStream input(eventBuf, DRMNotifier::KDRMSizeOfMessage);
+ MDRMEvent* eventobj = GetEventObjectLC(aEventType);
+ eventobj->InternalizeL(input);
+
+ // We need to extract the uri from the message
+ // for those that it is needed
+ switch( aEventType )
+ {
+ case KEventAddRemove:
+ message->iData = static_cast<CDRMEventAddRemove*>(eventobj)->GetContentIDL();
+ break;
+ case KEventModify:
+ message->iData = static_cast<CDRMEventModify*>(eventobj)->GetContentIDL();
+ break;
+ case KEventTimeChange:
+ break;
+ default:
+ User::Leave(KErrArgument);
+ break;
+ }
+ CleanupStack::PopAndDestroy(); // eventobj
+ CleanupStack::PushL(message->iData);
+
+ for( TInt i = 0; i < iSessions.Count();i++ )
+ {
+ queued = EFalse;
+
+ TRAPD(error, queued = iSessions[i]->SendNotificationL( message ) );
+ if( error && error != KErrNotFound )
+ {
+ User::LeaveIfError(error);
+ }
+ else if( queued )
+ {
+ message->iRefCount++;
+ }
+ }
+
+ if( !message->iRefCount )
+ {
+ CleanupStack::PopAndDestroy(); // message->iData;
+ CleanupStack::PopAndDestroy(); // eventBuf;
+ CleanupStack::PopAndDestroy(); // message
+ }
+ else
+ {
+ iMessages.Append( message );
+ CleanupStack::Pop(); // message->iData;
+ CleanupStack::Pop(); // eventBuf
+ CleanupStack::Pop(); // message
+ }
+ };
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::CancelL
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::CancelL(CDRMNotifierSession* aSession)
+ {
+ TInt count = 0;
+
+ for ( count = 0; count < iSessions.Count(); count++ )
+ {
+ if( iSessions[count] == aSession)
+ {
+ iSessions.Remove(count);
+ return;
+ }
+ }
+ User::Leave(KErrNotFound);
+ }
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::CDRMMessageStorage
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CDRMMessageStorage::CDRMMessageStorage() : iSessions(4), iMessages(4)
+ {
+ // Nothing
+ }
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::ConstructL()
+ {
+ }
+
+
+#ifdef _DRM_TESTING
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::Log
+// Logging operation.
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::Log( const TDesC8& aLog ) const
+ {
+ iLog->Log( aLog );
+ }
+
+// -----------------------------------------------------------------------------
+// CDRMMessageStorage::Log
+// Logging operation.
+// -----------------------------------------------------------------------------
+//
+void CDRMMessageStorage::Log( const TDesC& aLog ) const
+ {
+ iLog->Log( aLog );
+ }
+#endif
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// End of File