--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/contentaccessfwfordrm/source/caf/data.cpp Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,382 @@
+/*
+* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+
+#include <apmstd.h>
+
+#include "data.h"
+#include "agentinterface.h"
+#include "agentinfo.h"
+#include "agentfactory.h"
+#include "attributeset.h"
+#include "virtualpath.h"
+#include "resolver.h"
+#include "agentinfo.h"
+
+using namespace ContentAccess;
+
+EXPORT_C CData* CData::NewL(const TVirtualPathPtr& aVirtualPath, TIntent aIntent, TContentShareMode aShareMode)
+ {
+ CData *self = CData::NewLC(aVirtualPath, aIntent, aShareMode);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+EXPORT_C CData* CData::NewLC(const TVirtualPathPtr& aVirtualPath, TIntent aIntent, TContentShareMode aShareMode)
+ {
+ CData *self = new (ELeave) CData;
+ CleanupStack::PushL(self);
+ self->ConstructL(aVirtualPath, aIntent, aShareMode);
+ return self;
+ }
+
+EXPORT_C CData* CData::NewL(RFile& aFile, const TDesC& aUniqueId, TIntent aIntent)
+ {
+ CData *self = CData::NewLC(aFile, aUniqueId, aIntent);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+EXPORT_C CData* CData::NewLC(RFile& aFile, const TDesC& aUniqueId, TIntent aIntent)
+ {
+ CData *self = new (ELeave) CData;
+ CleanupStack::PushL(self);
+ self->ConstructL(aFile, aUniqueId, aIntent);
+ return self;
+ }
+
+
+EXPORT_C CData* CData::NewL(const TVirtualPathPtr& aVirtualPath, TContentShareMode aShareMode)
+ {
+ CData *self = CData::NewLC(aVirtualPath, aShareMode);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+EXPORT_C CData* CData::NewLC(const TVirtualPathPtr& aVirtualPath, TContentShareMode aShareMode)
+ {
+ CData *self = new (ELeave) CData;
+ CleanupStack::PushL(self);
+ self->ConstructL(aVirtualPath, aShareMode);
+ return self;
+ }
+
+EXPORT_C CData* CData::NewL(RFile& aFile, const TDesC& aUniqueId)
+ {
+ CData *self = CData::NewLC(aFile, aUniqueId);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+EXPORT_C CData* CData::NewLC(RFile& aFile, const TDesC& aUniqueId)
+ {
+ CData *self = new (ELeave) CData;
+ CleanupStack::PushL(self);
+ self->ConstructL(aFile, aUniqueId);
+ return self;
+ }
+
+
+CData* CData::NewLC(TUid aUid,
+ const TVirtualPathPtr& aVirtualPath,
+ TIntent aIntent,
+ TContentShareMode aShareMode)
+ {
+ CData* self = new(ELeave) CData();
+ CleanupStack::PushL(self);
+ self->ConstructL(aUid, aVirtualPath, aIntent, aShareMode);
+ return self;
+ }
+
+CData* CData::NewLC(TUid aUid, RFile& aFile, const TDesC& aUniqueId, TIntent aIntent)
+ {
+ CData* self = new (ELeave) CData();
+ CleanupStack::PushL(self);
+ self->ConstructL(aUid, aFile, aUniqueId, aIntent);
+ return self;
+ }
+
+CData::CData()
+ {
+ }
+
+CData::~CData()
+ {
+ // Destroy the agent implementation
+ delete iAgentData;
+
+ // close ECOM session, may result in the unloading of the DLL
+ delete iAgentFactory;
+ REComSession::FinalClose();
+ }
+
+
+void CData::ConstructL(const TVirtualPathPtr& aVirtualPath, TIntent aIntent, TContentShareMode aShareMode)
+ {
+ // Create the agent resolver which will contains a reference to
+ // the agent responsible for this piece of content
+ CAgentResolver* resolver = CAgentResolver::NewLC(EFalse);
+
+ // Create a temporary buffer used to store the translated version of the URI
+ HBufC* actualUri = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = actualUri->Des();
+
+ // Find the agent who handles the file and translate the URI if it is pointing to a private directory
+ CAgentInfo& agentInfo = resolver->ResolveFileL(aVirtualPath.URI(), uri, aShareMode);
+
+ // Figure out the Uid of the agent
+ TUid agentUid = agentInfo.Agent().ImplementationUid();
+
+ // call internal CData::NewL()
+ CData::ConstructL(agentUid, TVirtualPathPtr(*actualUri, aVirtualPath.UniqueId()), aIntent, aShareMode);
+
+ CleanupStack::PopAndDestroy(2, resolver); // actualUri, resolver
+ }
+
+void CData::ConstructL(const TVirtualPathPtr& aVirtualPath, TContentShareMode aShareMode)
+ {
+ // Create the agent resolver which will contains a reference to
+ // the agent responsible for this piece of content
+ CAgentResolver* resolver = CAgentResolver::NewLC(EFalse);
+
+ // Create a temporary buffer used to store the translated version of the URI
+ HBufC* actualUri = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = actualUri->Des();
+
+ // Find the agent who handles the file and translate the URI if it is pointing to a private directory
+ CAgentInfo& agentInfo = resolver->ResolveFileL(aVirtualPath.URI(), uri, aShareMode);
+
+ // Figure out the Uid of the agent
+ TUid agentUid = agentInfo.Agent().ImplementationUid();
+
+ // call internal CData::NewL()
+ CData::ConstructL(agentUid, TVirtualPathPtr(*actualUri, aVirtualPath.UniqueId()), aShareMode);
+
+ CleanupStack::PopAndDestroy(2, resolver); // actualUri, resolver
+ }
+
+void CData::ConstructL(RFile& aFile, const TDesC& aUniqueId, TIntent aIntent)
+ {
+ // Find the agent who handles the file
+ CAgentResolver* resolver = CAgentResolver::NewLC(EFalse);
+ CAgentInfo& agentInfo = resolver->ResolveFileL(aFile);
+
+ // Figure out the Uid of the agent
+ TUid agentUid = agentInfo.Agent().ImplementationUid();
+
+ // call other constructL now that we have the Uid
+ CData::ConstructL(agentUid, aFile, aUniqueId, aIntent);
+
+ // Cleanup resolver after creating CData to unnecessary
+ // unloading and loading of agent plug-ins
+ CleanupStack::PopAndDestroy(resolver);
+ }
+
+void CData::ConstructL(RFile& aFile, const TDesC& aUniqueId)
+ {
+ // Find the agent who handles the file
+ CAgentResolver* resolver = CAgentResolver::NewLC(EFalse);
+ CAgentInfo& agentInfo = resolver->ResolveFileL(aFile);
+
+ // Figure out the Uid of the agent
+ TUid agentUid = agentInfo.Agent().ImplementationUid();
+
+ // call other constructL now that we have the Uid
+ CData::ConstructL(agentUid, aFile, aUniqueId);
+
+ // Cleanup resolver after creating CData to unnecessary
+ // unloading and loading of agent plug-ins
+ CleanupStack::PopAndDestroy(resolver);
+ }
+
+void CData::ConstructL(TUid aUid,
+ const TVirtualPathPtr& aVirtualPath,
+ TIntent aIntent,
+ TContentShareMode aShareMode)
+ {
+ CData::ConstructL(aUid, aVirtualPath, aShareMode);
+
+ // Ensure that client's intent is possible
+ User::LeaveIfError(iAgentData->EvaluateIntent(aIntent));
+ }
+
+void CData::ConstructL(TUid aUid,
+ const TVirtualPathPtr& aVirtualPath,
+ TContentShareMode aShareMode)
+ {
+ iAgentUid = aUid;
+
+ // create our own agent factory (de-facto session handle for ECOM)
+ iAgentFactory = CAgentFactory::NewL(iAgentUid);
+
+ // Create an instance of the Agent's CAgentData
+ iAgentData = iAgentFactory->CreateDataConsumerL(aVirtualPath, aShareMode);
+
+ }
+
+void CData::ConstructL(TUid aUid, RFile& aFile, const TDesC& aUniqueId, TIntent aIntent)
+ {
+ CData::ConstructL(aUid, aFile, aUniqueId);
+
+ // Ensure that client's intent is possible
+ User::LeaveIfError(iAgentData->EvaluateIntent(aIntent));
+ }
+
+void CData::ConstructL(TUid aUid, RFile& aFile, const TDesC& aUniqueId)
+ {
+ iAgentUid = aUid;
+
+ // create our own agent factory (de-facto session handle for ECOM)
+ iAgentFactory = CAgentFactory::NewL(iAgentUid);
+
+ // Create an instance of the agent's CAgentData
+ // The agent must make a duplicate of the file handle
+ iAgentData = iAgentFactory->CreateDataConsumerL(aFile, aUniqueId);
+
+ }
+
+
+EXPORT_C void CData::DataSizeL(TInt& aSize)
+ {
+ // ask the agent for the data size of the current content object
+ iAgentData->DataSizeL(aSize);
+ }
+
+EXPORT_C TInt CData::EvaluateIntent(TIntent aIntent)
+ {
+ // ask the agent to re-evaluate the intent on the current content object
+ return iAgentData->EvaluateIntent(aIntent);
+ }
+
+EXPORT_C TInt CData::ExecuteIntent(TIntent aIntent)
+ {
+ // ask the agent to re-evaluate the intent on the current content object
+ return iAgentData->ExecuteIntent(aIntent);
+ }
+
+EXPORT_C TInt CData::Read(TDes8& aDes) const
+ {
+ // ask the agent to read plaintext from the content object
+ return iAgentData->Read(aDes);
+ }
+
+EXPORT_C TInt CData::Read(TDes8& aDes, TInt aLength) const
+ {
+ // ask the agent to read plaintext from the content object
+ return iAgentData->Read(aDes, aLength);
+ }
+
+EXPORT_C void CData::Read(TDes8& aDes,
+ TRequestStatus& aStatus) const
+ {
+ // ask the agent to read plaintext from the content object
+ iAgentData->Read(aDes, aStatus);
+ }
+
+EXPORT_C void CData::Read(TDes8& aDes,
+ TInt aLength,
+ TRequestStatus& aStatus) const
+ {
+ // ask the agent to read plaintext from the content object
+ iAgentData->Read(aDes, aLength, aStatus);
+ }
+
+EXPORT_C void CData::ReadCancel(TRequestStatus &aStatus) const
+ {
+ iAgentData->ReadCancel(aStatus);
+ }
+EXPORT_C TInt CData::Read(TInt aPos, TDes8& aDes,
+ TInt aLength, TRequestStatus& aStatus) const
+ {
+ // The above API method signature allows error codes to be returned
+ // via two different routes (return code & aStatus). Should the async request
+ // dispatch fail then an error code is returned immediately via the
+ // aStatus parameter rather than via the return code of the function.
+
+ // NOTE: it is not generally not recommended for functions to be able to return
+ // error codes in two different ways as this places a bigger error-checking
+ // burden on clients.
+
+
+ // ask the agent to read plaintext from the content object
+ if(aPos<0)
+ return KErrArgument;
+ return iAgentData->Read(aPos, aDes, aLength, aStatus);
+ }
+
+
+EXPORT_C TInt CData::Seek(TSeek aMode,TInt& aPos) const
+ {
+ // ask the agent to seek witin the plaintext
+ return iAgentData->Seek(aMode, aPos);
+ }
+
+EXPORT_C TInt CData::SetProperty(TAgentProperty aProperty, TInt aValue)
+ {
+ // Set a property within the agent
+ return iAgentData->SetProperty(aProperty, aValue);
+ }
+
+EXPORT_C TInt CData::GetAttribute(TInt aAttribute, TInt& aValue) const
+ {
+ // Get an attribute related to this content object
+ return iAgentData->GetAttribute(aAttribute, aValue);
+ }
+
+EXPORT_C TInt CData::GetAttributeSet(RAttributeSet& aAttributeSet) const
+ {
+ // Get a set of attributes related to this content object
+ return iAgentData->GetAttributeSet(aAttributeSet);
+ }
+
+EXPORT_C TInt CData::GetStringAttribute(TInt aAttribute, TDes& aValue) const
+ {
+ // Get a string attribute related to this content object
+ return iAgentData->GetStringAttribute(aAttribute, aValue);
+ }
+
+EXPORT_C TInt CData::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet) const
+ {
+ // Get a set of string attributes related to this content object
+ return iAgentData->GetStringAttributeSet(aStringAttributeSet);
+ }
+
+#ifndef REMOVE_CAF1
+EXPORT_C void CData::SetQosL(TQosAttribute aQosAttr, TInt aValue)
+ {
+ if(aQosAttr == EQosBufferSize)
+ {
+ User::LeaveIfError(iAgentData->SetProperty(EAgentPropertyBufferSize, aValue));
+ }
+ }
+
+EXPORT_C TBool CData::GetMimeTypeL(TDes8& aMimeType) const
+ {
+ TBuf16 <KMaxDataTypeLength> mimeType;
+ TInt err = KErrNone;
+ if(iAgentUid != KF32AgentImplUid)
+ {
+ err = iAgentData->GetStringAttribute(EMimeType, mimeType);
+ if(err == KErrNone && mimeType.Length() != 0)
+ {
+ aMimeType.Copy(mimeType);
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+#endif // REMOVE_CAF1