diff -r 000000000000 -r 95b198f216e5 omadrm/drmengine/agentv2/src/Oma2AgentManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadrm/drmengine/agentv2/src/Oma2AgentManager.cpp Thu Dec 17 08:52:27 2009 +0200 @@ -0,0 +1,997 @@ +/* +* Copyright (c) 2005 - 2009 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: Implementation of the Manager Interface +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include + +#include "oma2agentmanager.h" +#include "oma2agentattributes.h" +#include "oma1dcf.h" +#include "oma2dcf.h" +#include "drmrightsclient.h" + +#include "drmutilityinternalcrkeys.h" // Cenrep extension for OmaBased + +using namespace ContentAccess; + + +const TInt KMinimumOma1DcfLength = 16; + +const TInt KCenRepDataLength( 50 ); + +// ============================= LOCAL FUNCTIONS =============================== + +LOCAL_C void DecryptL( + const TDesC8& aContent, + TDes8& aOutput) + { + COma1Dcf* dcf = NULL; + TBuf8 iv; + TPtr8 input(NULL, 0); + RDRMRightsClient client; + TPtr8 ptr(NULL, 0); + + dcf = COma1Dcf::NewL(aContent.Mid(1)); + CleanupStack::PushL(dcf); + User::LeaveIfError(client.Connect()); + CleanupClosePushL(client); + User::LeaveIfError(client.Consume(aContent[0], *dcf->iContentID)); + User::LeaveIfError(client.InitializeKey(*dcf->iContentID)); + + iv.Copy(aContent.Mid(dcf->iOffset + 1, KDCFKeySize)); + aOutput.Copy(&aContent[dcf->iOffset + KDCFKeySize + 1], dcf->iDataLength - + KDCFKeySize); + ptr.Set(&aOutput[0], aOutput.Length(), aOutput.Length()); + User::LeaveIfError(client.Decrypt(iv, ptr, ETrue)); + + dcf->iPlainTextLength = aOutput.Length(); + dcf->iPadding = dcf->iDataLength - dcf->iPlainTextLength; + client.Consume(EStop, *dcf->iContentID); + CleanupStack::PopAndDestroy(2); // client, dcf + } + +LOCAL_C TInt SetName( const TDesC8& aContentUri, + const TDesC& aContentName ) + { + RDRMRightsClient client; + TInt r = KErrNone; + r = client.Connect(); + if( !r ) + { + r = client.SetName( aContentUri, aContentName ); + } + client.Close(); + return r; + } + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// COma2AgentManager::COma2AgentManager +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +COma2AgentManager::COma2AgentManager(void): + iNotifier(NULL), + iWatchedId(NULL) + { + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::ConstructL() + { + User::LeaveIfError(iFs.Connect()); + User::LeaveIfError(iFs.ShareAuto()); + iFileManager = CFileMan::NewL(iFs); + + TInt err( KErrNone ); + + TRAP(err, FetchOmaBasedInfoL() ); + if( err) + { + if( iOmaBasedMimeType ) + { + delete iOmaBasedMimeType; + } + iOmaBasedMimeType = NULL; + } + + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::FetchOmaBasedInfoL +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::FetchOmaBasedInfoL() + { + TInt err = KErrNone; + CRepository* repository( NULL ); + RBuf bOmaBasedMimeType; + + CleanupClosePushL(bOmaBasedMimeType); + bOmaBasedMimeType.CreateL( KCenRepDataLength ); + + TRAP( err, repository = CRepository::NewL( KCRUidOmaBased ) ); + if ( !err ) + { + CleanupStack::PushL( repository ); + + err = repository->Get( KOmaBasedMimeType, bOmaBasedMimeType ); + if( !err ) + { + iOmaBasedMimeType = CnvUtfConverter::ConvertFromUnicodeToUtf8L( bOmaBasedMimeType ); + } + CleanupStack::PopAndDestroy( repository ); + } + + CleanupStack::PopAndDestroy(); + + User::LeaveIfError( err ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +COma2AgentManager* COma2AgentManager::NewL() + { + COma2AgentManager* self = NewLC(); + CleanupStack::Pop(self); + return self; + } + +COma2AgentManager* COma2AgentManager::NewLC() + { + COma2AgentManager* self=new(ELeave) COma2AgentManager(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +COma2AgentManager::~COma2AgentManager() + { + delete iFileManager; + iFs.Close(); + if (iNotifier != NULL) + { + if( iWatchedId ) + { + TRAP_IGNORE(iNotifier->UnRegisterEventObserverL(*this, KEventAddRemove, *iWatchedId)); + TRAP_IGNORE(iNotifier->UnRegisterEventObserverL(*this, KEventModify, *iWatchedId)); + } + delete iNotifier; + } + delete iWatchedId; + + delete iOmaBasedMimeType; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::DeleteFile +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::DeleteFile(const TDesC& aFileName) + { + return iFs.Delete(aFileName); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::CopyFile +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::CopyFile( + const TDesC& aSource, + const TDesC& aDestination) + { + TInt driveNumber = 0; + TChar drive( aDestination[0] ); + RFile file; + TInt size = 0; + TInt result = KErrNone; + + TInt err = KErrNone; + TBool retval = KErrNone; + + + // Check the destination drive letter + result = iFs.CharToDrive(drive,driveNumber); + + if( result ) + { + return result; + } + + // open the file to read the size + result = file.Open(iFs, aSource, EFileShareReadersOrWriters|EFileRead); + + if( result ) + { + return result; + } + + // read the size + result = file.Size( size ); + + // close the file + file.Close(); + + if( result ) + { + return result; + } + + // check that the drive has enough space for the copy operation + + TRAP( err, retval = SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, + size, + driveNumber ) ) + if( retval ) + { + return KErrDiskFull; + } + + + return iFileManager->Copy( aSource, aDestination); + } + + +// ----------------------------------------------------------------------------- +// CWmDrmAgentManager::CopyFile +// +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::CopyFile(RFile& aSource, + const TDesC& aDestination) + { + TInt driveNumber = 0; + TChar drive( aDestination[0] ); + TInt size = 0; + TInt result = KErrNone; + RFile output; + TFileName fileName; + + TInt err = KErrNone; + TBool retval = KErrNone; + + + // Same file, do not even try to copy + // And since they are the same don't return an error + aSource.FullName( fileName ); + + if( !aDestination.CompareF( fileName ) ) + { + return KErrNone; + } + + // Check the destination drive letter + result = iFs.CharToDrive(drive,driveNumber); + + if( result ) + { + return result; + } + + // read the size + result = aSource.Size( size ); + + if( result ) + { + return result; + } + + // check that the drive has enough space for the copy operation + + TRAP( err, retval = SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, + size, + driveNumber ) ) + if( retval ) + + { + return KErrDiskFull; + } + + // Perform the copy: + + // Rewind just in case: + size = 0; + result = aSource.Seek(ESeekStart, size); + + if( !result ) + { + result = iFileManager->Copy(aSource, aDestination); + } + + return result; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::RenameFile +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::RenameFile( + const TDesC& aSource, + const TDesC& aDestination) + { + TInt driveNumber = 0; + TChar drive( aDestination[0] ); + RFile file; + TInt size = 0; + + TInt err = KErrNone; + TBool retval = KErrNone; + + + TInt result( iFileManager->Rename(aSource, aDestination) ); + // If the files are on a different drive, Rename will fail + // Therefore we simulate the Move by doing a Copy, followed by Delete + if ( result != KErrNone ) + { + // Check the destination drive letter + result = iFs.CharToDrive(drive,driveNumber); + + if( result ) + { + return result; + } + + // open the file to read the size + result = file.Open(iFs, aSource, EFileShareReadersOrWriters|EFileRead); + + if( result ) + { + return result; + } + + // read the size + result = file.Size( size ); + + // close the file + file.Close(); + + if( result ) + { + return result; + } + + // check that the drive has enough space for the copy operation + + TRAP( err, retval = SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, + size, + driveNumber ) ) + if( retval ) + + { + return KErrDiskFull; + } + + + result = iFileManager->Copy(aSource,aDestination); + if (result == KErrNone) + { + // If the copy was successful try and delete the original + result = iFileManager->Delete(aSource); + if (result != KErrNone) + { + // Delete failed so try to cleanup the destination file + // as we're going to exit with an error + // We can safely ignore any error from this as the previous error + // is more important to propagate, since this is just cleanup + iFileManager->Delete(aDestination); + } + } + } + return result; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::MkDir +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::MkDir( + const TDesC& aPath) + { + return iFs.MkDir( aPath ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::MkDirAll +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::MkDirAll( + const TDesC& aPath) + { + return iFs.MkDirAll( aPath ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::RmDir +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::RmDir( + const TDesC& aPath) + { + return iFileManager->RmDir( aPath ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetDir +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetDir( + const TDesC& aName, + TUint aEntryAttMask, + TUint aEntrySortKey, + CDir*& aEntryList) const + { + return iFs.GetDir( aName, aEntryAttMask, aEntrySortKey, aEntryList ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetDir +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetDir( + const TDesC& aName, + TUint aEntryAttMask, + TUint aEntrySortKey, + CDir*& aEntryList, + CDir*& aDirList) const + { + return iFs.GetDir( aName, aEntryAttMask, aEntrySortKey, aEntryList, aDirList ); + } + + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetDir +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetDir( + const TDesC& aName, + const TUidType& aEntryUid, + TUint aEntrySortKey, + CDir*& aFileList) const + { + return iFs.GetDir( aName, aEntryUid, aEntrySortKey, aFileList ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetAttribute +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetAttribute( + TInt aAttribute, + TInt& aValue, + const TVirtualPathPtr& aVirtualPath) + { + TInt r = KErrNone; + CDcfCommon* dcfFile = NULL; + + TRAP(r, dcfFile = CDcfCommon::NewL(aVirtualPath.URI())); + if( r ) + { + return r; + } + aValue = TOma2AgentAttributes::GetAttribute(*dcfFile, aAttribute, aVirtualPath); + delete dcfFile; + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetAttributeSet +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetAttributeSet( + RAttributeSet& aAttributeSet, + const TVirtualPathPtr& aVirtualPath) + { + TInt r = KErrNone; + CDcfCommon *dcfFile = NULL; + + TRAP(r, dcfFile = CDcfCommon::NewL(aVirtualPath.URI())); + if( r ) + { + return r; + } + r = TOma2AgentAttributes::GetAttributeSet(*dcfFile, aAttributeSet, aVirtualPath); + delete dcfFile; + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetStringAttributeSet +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetStringAttributeSet( + RStringAttributeSet& aAttributeSet, + const TVirtualPathPtr& aVirtualPath) + { + TInt r = KErrNone; + CDcfCommon *dcfFile = NULL; + + TRAP(r, dcfFile = CDcfCommon::NewL(aVirtualPath.URI())); + if( r ) + { + return r; + } + r = TOma2AgentAttributes::GetStringAttributeSet( + *dcfFile, aAttributeSet, aVirtualPath); + delete dcfFile; + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::GetStringAttribute +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::GetStringAttribute( + TInt aAttribute, + TDes& aValue, + const TVirtualPathPtr& aVirtualPath) + { + TInt r = KErrNone; + CDcfCommon *dcfFile = NULL; + + TRAP(r, dcfFile = CDcfCommon::NewL(aVirtualPath.URI())); + if( r ) + { + return r; + } + r = TOma2AgentAttributes::GetStringAttribute( + *dcfFile, aAttribute, aValue, aVirtualPath); + delete dcfFile; + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::NotifyStatusChange +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::NotifyStatusChange( + const TDesC& aUri, + TEventMask aEventMask, + TRequestStatus& aStatus) + { + CDcfCommon* dcf = NULL; + TInt r = 0; + + if( iWatchedId != NULL ) + { + if( iNotifier ) + { + TRAP_IGNORE(iNotifier->UnRegisterEventObserverL(*this, KEventAddRemove, *iWatchedId)); + TRAP_IGNORE(iNotifier->UnRegisterEventObserverL(*this, KEventModify, *iWatchedId)); + } + delete iWatchedId; + } + iWatchedEvents = TEventMask(0); + + if (iNotifier == NULL) + { + TRAP(r, iNotifier = CDRMNotifier::NewL()); + } + TRAP(r, dcf = CDcfCommon::NewL(aUri)); + if (iNotifier != NULL && dcf != NULL) + { + iStatus = &aStatus; + iWatchedEvents = aEventMask; + TRAP_IGNORE( iWatchedId = dcf->iContentID->AllocL() ); + TRAP(r, iNotifier->RegisterEventObserverL(*this, KEventAddRemove, *iWatchedId)); + TRAP(r, iNotifier->RegisterEventObserverL(*this, KEventModify, *iWatchedId)); + *iStatus = KRequestPending; + delete dcf; + } + if (r != KErrNone) + { + User::RequestComplete(iStatus, r); + } + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::CancelNotifyStatusChange +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::CancelNotifyStatusChange( + const TDesC& /*aUri*/, + TRequestStatus& aStatus) + { + iStatus = &aStatus; + if (iWatchedId != NULL) + { + if( iNotifier ) + { + TRAP_IGNORE(iNotifier->UnRegisterEventObserverL(*this, KEventAddRemove, *iWatchedId)); + TRAP_IGNORE(iNotifier->UnRegisterEventObserverL(*this, KEventModify, *iWatchedId)); + } + delete iWatchedId; + iWatchedId = NULL; + } + iWatchedEvents = TEventMask(0); + User::RequestComplete(iStatus, KErrCancel); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::SetProperty +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::SetProperty( + TAgentProperty /*aProperty*/, + TInt /*aValue*/) + { + return KErrCANotSupported; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::DisplayInfoL +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::DisplayInfoL( + TDisplayInfo /*aInfo*/, + const TVirtualPathPtr& /*aVirtualPath*/) + { + User::Leave(KErrCANotSupported); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::IsRecognizedL +// ----------------------------------------------------------------------------- +// +TBool COma2AgentManager::IsRecognizedL( + const TDesC& aUri, + TContentShareMode /*aShareMode*/) const + { + TBuf8<40> buffer; // Size increased to 40 + TBool r = EFalse; + + User::LeaveIfError(iFs.ReadFileSection(aUri, 0, buffer, buffer.MaxLength())); + if (COma1Dcf::IsValidDcf(buffer) || COma2Dcf::IsValidDcf(buffer)) + { + r = ETrue; + } + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::IsRecognizedL +// ----------------------------------------------------------------------------- +// +TBool COma2AgentManager::IsRecognizedL( + RFile& aFile) const + { + TBuf8<40> buffer; // Size increased to 40 + TBool r = EFalse; + TInt pos = 0; + + User::LeaveIfError(aFile.Seek(ESeekStart, pos)); + User::LeaveIfError(aFile.Read(buffer, buffer.MaxLength())); + if (COma1Dcf::IsValidDcf(buffer) || COma2Dcf::IsValidDcf(buffer)) + { + r = ETrue; + } + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::RecognizeFileL +// Only check from the file in case the buffer is not large enough to give +// a definitive answer. +// ----------------------------------------------------------------------------- +// +TBool COma2AgentManager::RecognizeFileL( + const TDesC& aFileName, + const TDesC8& aBuffer, + TDes8& aFileMimeType, + TDes8& aContentMimeType) const + { + TBool r = EFalse; + TInt err = KErrNone; + CDcfCommon* dcf = NULL; + +#ifdef __DRM_OMA2 + if ( !aFileName.Right(4).CompareF( KOma2DcfExtension ) || + !aFileName.Right(4).CompareF( KOma2DcfExtensionAudio ) || + !aFileName.Right(4).CompareF( KOma2DcfExtensionVideo ) || + COma2Dcf::IsValidDcf(aBuffer) ) + { + aFileMimeType.Copy(KOma2DcfContentType); + aContentMimeType.Copy(KCafMimeType); + r = ETrue; // file was recognized as OMA2 DCF + } + else + { +#endif + // Check if the given buffer if a valid buffer, or if it's too short: + if (COma1Dcf::IsValidDcf(aBuffer) || + aBuffer.Length() < KMinimumOma1DcfLength ) + { + + // Check if we can get all the information we need from the buffer. + TRAP(err, dcf = COma1Dcf::NewL(aBuffer)); + + // if we can't and we have a filename check from the file + if (dcf == NULL && aFileName != KNullDesC) + { + dcf = CDcfCommon::NewL(aFileName); + } + + // If the dcf object creation worked get the information needed and + // mark the file as recognized. Check for specific mimetypes + if (dcf != NULL) + { + CleanupStack::PushL(dcf); + if ((dcf->iMimeType->Des()).CompareF(*iOmaBasedMimeType)) + { + aFileMimeType.Copy(KOma1DcfContentType); + aContentMimeType.Copy(*dcf->iMimeType); + r = ETrue; // file was recognized as OMA1 DCF + } + CleanupStack::PopAndDestroy(); + } + + } +#ifdef __DRM_OMA2 + } +#endif + return r; + } + + +// ----------------------------------------------------------------------------- +// COma2AgentManager::AgentSpecificCommand +// ----------------------------------------------------------------------------- +// +TInt COma2AgentManager::AgentSpecificCommand( + TInt aCommand, + const TDesC8& aInputBuffer, + TDes8& aOutputBuffer) + { + TInt r = KErrCANotSupported; + RDRMRightsClient client; + TInt value = 0; + TInt size = 0; + TTimeIntervalSeconds interval; + TPtrC8 contentUri; + TPtrC16 contentName; + + switch( aCommand ) + { + case EOmaDrmMethods: + { + aOutputBuffer.Copy(_L8("FL CD SD")); +#ifdef __DRM_OMA2 + aOutputBuffer.Append(_L8(" OMADRM2")); +#endif + } + break; + case ESetPendingRightsETA: + { + Mem::Copy( &value, aInputBuffer.Ptr(), sizeof(TInt) ); + interval = value; + contentUri.Set( aInputBuffer.Ptr() + sizeof(TInt), + aInputBuffer.Size()-sizeof(TInt) ); + + r = client.Connect(); + if( !r ) + { + r = client.SetEstimatedArrival( contentUri, + interval ); + } + // close the handle: + client.Close(); + } + break; + case EBufferContainsOma1Dcf: + if (COma1Dcf::IsValidDcf(aInputBuffer)) + { + r = KErrNone; + } + else + { + r = KErrNotFound; + } + break; + case EDecryptOma1DcfBuffer: + r = KErrNone; + TRAP(r, DecryptL(aInputBuffer, aOutputBuffer)); + break; + case ESetContentName: + Mem::Copy( &value, aInputBuffer.Ptr(), sizeof(TInt)); + contentName.Set( + reinterpret_cast( + const_cast(aInputBuffer.Ptr() + sizeof(TInt))), + value ); + + size = aInputBuffer.Size(); + size -= value*2; + size -= sizeof(TInt); + + contentUri.Set( aInputBuffer.Ptr() + sizeof(TInt) + value*2, + size ); + + r = SetName( contentUri, contentName ); + break; + default: + break; + } + + return r; + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::AgentSpecificCommand +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::AgentSpecificCommand( + TInt aCommand, + const TDesC8& aInputBuffer, + TDes8& aOutputBuffer, + TRequestStatus& aStatus) + { + TRequestStatus *ptr = &aStatus; + User::RequestComplete(ptr, AgentSpecificCommand(aCommand, aInputBuffer, + aOutputBuffer)); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::PrepareHTTPRequestHeaders +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::PrepareHTTPRequestHeaders( + RStringPool& aStringPool, + RHTTPHeaders& aRequestHeaders) const + { + TRAP_IGNORE( PrepareHTTPRequestHeadersL(aStringPool, aRequestHeaders) ); + } + +// ----------------------------------------------------------------------------- +// COma2AgentManager::PrepareHTTPRequestHeadersL +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::PrepareHTTPRequestHeadersL( + RStringPool& aStringPool, + RHTTPHeaders& aRequestHeaders) const + { + TBuf8 mimeType; + RStringF string; + THTTPHdrVal header; + + mimeType.Copy(KOma1DrmMessageContentType); + string = aStringPool.OpenFStringL(mimeType); + CleanupClosePushL(string); + header.SetStrF(string); + aRequestHeaders.SetFieldL(aStringPool.StringF(HTTP::EAccept, + RHTTPSession::GetTable()), header); + CleanupStack::PopAndDestroy(); + + mimeType.Copy(KOma1DcfContentType); + string = aStringPool.OpenFStringL(mimeType); + CleanupClosePushL(string); + header.SetStrF(string); + aRequestHeaders.SetFieldL(aStringPool.StringF(HTTP::EAccept, + RHTTPSession::GetTable()), header); + CleanupStack::PopAndDestroy(); + + mimeType.Copy(KOma2DcfContentType); + string = aStringPool.OpenFStringL(mimeType); + CleanupClosePushL(string); + header.SetStrF(string); + aRequestHeaders.SetFieldL(aStringPool.StringF(HTTP::EAccept, + RHTTPSession::GetTable()), header); + CleanupStack::PopAndDestroy(); + + mimeType.Copy(KOma2RoContentType); + string = aStringPool.OpenFStringL(mimeType); + CleanupClosePushL(string); + header.SetStrF(string); + aRequestHeaders.SetFieldL(aStringPool.StringF(HTTP::EAccept, + RHTTPSession::GetTable()), header); + CleanupStack::PopAndDestroy(); + + mimeType.Copy(KOma2TriggerContentType); + string = aStringPool.OpenFStringL(mimeType); + CleanupClosePushL(string); + header.SetStrF(string); + aRequestHeaders.SetFieldL(aStringPool.StringF(HTTP::EAccept, + RHTTPSession::GetTable()), header); + CleanupStack::PopAndDestroy(); + } + + + + +// ----------------------------------------------------------------------------- +// COma2AgentContent::HandleEventL +// Handle notifier events here. Not much logic, consider all events as rights +// changes. +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::HandleEventL( + MDRMEvent* /*aEvent*/) + { + RDRMRightsClient client; + TInt r; + TUint32 reason = 0; + + if (client.Connect() == KErrNone && iWatchedId != NULL) + { + r = client.CheckRights(EUnknown, *iWatchedId, reason); + if (r == KErrNone && (iWatchedEvents & ERightsAvailable) || + r != KErrNone && (iWatchedEvents & ERightsExpired)) + { + iNotifier->UnRegisterEventObserverL(*this, KEventAddRemove, *iWatchedId); + iNotifier->UnRegisterEventObserverL(*this, KEventModify, *iWatchedId); + delete iWatchedId; + iWatchedId = NULL; + iWatchedEvents = TEventMask(0); + User::RequestComplete(iStatus, KErrNone); + } + client.Close(); + } + } + + +// ----------------------------------------------------------------------------- +// COma2AgentManager::DisplayManagementInfoL +// ----------------------------------------------------------------------------- +// +void COma2AgentManager::DisplayManagementInfoL() + { + TUid KRightsManagerUid = TUid::Uid(0x101F85C7); + RWsSession wsSession; + RApaLsSession appArcSession; + TThreadId id; + + User::LeaveIfError(wsSession.Connect()); + CleanupClosePushL(wsSession); + TApaTaskList tasklist(wsSession); + TApaTask task = tasklist.FindApp(KRightsManagerUid); + if (task.Exists()) + { + task.SendMessage(TUid::Uid(KUidApaMessageSwitchOpenFileValue), + KNullDesC8); + } + else + { + User::LeaveIfError(appArcSession.Connect()); + appArcSession.StartDocument(_L("0"), KRightsManagerUid, id); + appArcSession.Close(); + } + CleanupStack::PopAndDestroy(); + } + +// End of File