contentmgmt/contentaccessfwfordrm/source/f32agent/f32agentcontent.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/contentaccessfwfordrm/source/f32agent/f32agentcontent.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2004-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 <caf/caf.h>
+#include <apmstd.h>
+#include "f32agentcontent.h"
+#include "f32defaultattributes.h"
+#include "f32agentui.h"
+
+using namespace ContentAccess;
+
+CF32AgentContent* CF32AgentContent::NewL(const TDesC& aURI, TContentShareMode aShareMode)
+	{
+	CF32AgentContent* self = new (ELeave) CF32AgentContent;
+	CleanupStack::PushL(self);
+	self->ConstructL(aURI, aShareMode);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CF32AgentContent* CF32AgentContent::NewL(RFile& aFile)
+	{
+	CF32AgentContent* self = new (ELeave) CF32AgentContent;
+	CleanupStack::PushL(self);
+	self->ConstructL(aFile);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CF32AgentContent::CF32AgentContent()
+	{
+	}
+
+CF32AgentContent::~CF32AgentContent()
+	{
+	iFile.Close();
+	if(iURI)
+		{
+		// file session only created when file is opened by name
+		iFs.Close();
+		}
+	delete iURI;
+	}
+  
+void CF32AgentContent::ConstructL(const TDesC& aURI, TContentShareMode aShareMode)
+	{
+	iURI = aURI.AllocL();
+	iShareMode = aShareMode;
+	
+	// Test that the file exists and hold it open so nobody deletes it etc
+	TUint mode = TF32DefaultAttributes::GetFileMode(aShareMode);
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iFile.Open(iFs, *iURI, mode));
+	}
+
+void CF32AgentContent::ConstructL(RFile& aFile)
+	{
+	User::LeaveIfError(iFile.Duplicate(aFile));
+	}
+
+TInt CF32AgentContent::OpenContainer(const TDesC&)
+	{
+	return KErrNotFound;
+	}
+
+TInt CF32AgentContent::CloseContainer()
+	{
+	return KErrNotFound;
+	}
+
+void CF32AgentContent::GetEmbeddedObjectsL(RStreamablePtrArray<CEmbeddedObject>& aArray)
+	{
+	TBuf8 <KMaxDataTypeLength> mimeType;
+	CEmbeddedObject *embeddedObject = NULL;
+	
+	// the only embedded object is the file itself	
+	// Try to get the mime type
+	mimeType.SetLength(0);
+	if(iURI)
+		{
+		TF32DefaultAttributes::GetMimeTypeL(*iURI, mimeType);
+		}
+	else
+		{
+		TF32DefaultAttributes::GetMimeTypeL(iFile, mimeType);
+		}	
+	embeddedObject = CEmbeddedObject::NewL(KDefaultContentObject(), mimeType, EContentObject);
+	CleanupStack::PushL(embeddedObject);
+	aArray.AppendL(embeddedObject);
+	
+	// Now owned by the array so do not destroy
+	CleanupStack::Pop(embeddedObject);
+	}
+
+void CF32AgentContent::GetEmbeddedObjectsL(RStreamablePtrArray<CEmbeddedObject>& aArray, TEmbeddedType aType)
+	{
+	// the only embedded object is the file itself
+	if(aType == EContentObject)
+		{
+		// just get the default object since there is only one content object
+		GetEmbeddedObjectsL(aArray);
+		}
+	}
+
+void CF32AgentContent::SearchL(RStreamablePtrArray<CEmbeddedObject>& aArray, const TDesC8& aMimeType, TBool /* aRecurse */)
+	{
+	TBuf8 <KMaxDataTypeLength> mimeType;
+	
+	CEmbeddedObject *embeddedObject = NULL;
+	
+	// the only embedded object is the file itself	
+	if(iURI)
+		{
+		TF32DefaultAttributes::GetMimeTypeL(*iURI, mimeType);
+		}
+	else
+		{
+		TF32DefaultAttributes::GetMimeTypeL(iFile, mimeType);
+		}
+	
+	// Check the file has the correct mime type
+	if(aMimeType == mimeType)
+		{
+		embeddedObject = CEmbeddedObject::NewL(KDefaultContentObject(), mimeType, EContentObject);
+		CleanupStack::PushL(embeddedObject);		
+		aArray.AppendL(embeddedObject);
+	
+		// Now owned by the array so do not destroy
+		CleanupStack::Pop(embeddedObject);
+		}
+	else
+		{
+		// Mime type was incorrect. Set error to indicate no content object
+		// of the desired type was found in the file.
+		User::Leave(KErrNotFound);
+		}
+	}
+
+TInt CF32AgentContent::Search(RStreamablePtrArray<CEmbeddedObject>& aArray, const TDesC8& aMimeType, TBool aRecurse)
+	{
+	TRAPD( err, SearchL(aArray, aMimeType, aRecurse) );
+	return err;
+	}
+
+TInt CF32AgentContent::GetAttribute(TInt aAttribute, TInt& aValue, const TDesC& aUniqueId)
+	{
+	// check that the unique Id exists
+	if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone)
+		{
+		return KErrNotFound;	
+		}
+	
+	TInt err = KErrNone;
+	if(iURI)
+		{
+		err = TF32DefaultAttributes::GetAttribute(aAttribute, aValue, *iURI);
+		}
+	else
+		{
+		err = TF32DefaultAttributes::GetAttribute(aAttribute, aValue, iFile);
+		}
+	return err;
+	}
+
+TInt CF32AgentContent::GetAttributeSet(RAttributeSet& aAttributeSet, const TDesC& aUniqueId)
+	{
+	// check that the unique Id exists
+	if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone)
+		{
+		return KErrNotFound;	
+		}
+		
+	TInt err = KErrNone;
+	if(iURI)
+		{
+		err = TF32DefaultAttributes::GetAttributeSet(aAttributeSet, *iURI);
+		}
+	else
+		{
+		err = TF32DefaultAttributes::GetAttributeSet(aAttributeSet, iFile);
+		}
+	return err;
+	}
+
+TInt CF32AgentContent::GetStringAttribute(TInt aAttribute, TDes& aValue, const TDesC& aUniqueId)
+	{
+	// check that the unique Id exists
+	if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone)
+		{
+		return KErrNotFound;	
+		}
+		
+	TInt err = KErrNone;
+	if(iURI)
+		{
+		err = TF32DefaultAttributes::GetStringAttribute(aAttribute, aValue, *iURI);
+		}
+	else
+		{
+		err = TF32DefaultAttributes::GetStringAttribute(aAttribute, aValue, iFile);
+		}
+	return err;
+	}
+
+TInt CF32AgentContent::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, const TDesC& aUniqueId)
+	{
+	// check that the unique Id exists
+	if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone)
+		{
+		return KErrNotFound;	
+		}
+	
+	TInt err = KErrNone;
+	if(iURI)
+		{
+		err = TF32DefaultAttributes::GetStringAttributeSet(aStringAttributeSet, *iURI);
+		}
+	else
+		{
+		err = TF32DefaultAttributes::GetStringAttributeSet(aStringAttributeSet, iFile);
+		}
+	return err;
+	}
+
+TInt CF32AgentContent::AgentSpecificCommand(TInt , const TDesC8& , TDes8& )
+	{
+	return KErrCANotSupported;
+	}
+
+void CF32AgentContent::AgentSpecificCommand(TInt , const TDesC8& , TDes8& , TRequestStatus& aStatus)
+	{
+	TRequestStatus* ptr = &aStatus;
+	User::RequestComplete(ptr, KErrCANotSupported);
+	}
+
+void CF32AgentContent::NotifyStatusChange(TEventMask , TRequestStatus& aStatus, const TDesC& )
+	{
+	TRequestStatus* ptr = &aStatus;
+	User::RequestComplete(ptr, KErrCANotSupported);
+	}
+
+TInt CF32AgentContent::CancelNotifyStatusChange(TRequestStatus& , const TDesC& )
+	{
+	return KErrCANotSupported;
+	}
+
+void CF32AgentContent::RequestRights(TRequestStatus& aStatus, const TDesC& )
+	{
+	TRequestStatus* ptr = &aStatus;
+	User::RequestComplete(ptr, KErrCANotSupported);
+	}
+
+TInt CF32AgentContent::CancelRequestRights(TRequestStatus& , const TDesC& )
+	{
+	return KErrCANotSupported;
+	}
+
+void CF32AgentContent::DisplayInfoL(TDisplayInfo aInfo, const TDesC& aUniqueId)
+	{
+	// Check that the client hasn't specified some incorrect UniqueId
+	User::LeaveIfError(TF32DefaultAttributes::CheckUniqueId(aUniqueId));
+
+
+	if(iURI)
+		{
+		// Open the file handle in order to pass it to the Agent UI
+		RFs fs;
+		RFile file;
+		
+		// default share mode of EFileShareReadersOnly
+		TUint mode = EFileShareReadersOnly | EFileStream | EFileRead;
+
+		if(iShareMode == EContentShareReadWrite)
+			{
+			mode = EFileShareAny | EFileStream | EFileRead;
+			}
+		else if(iShareMode == EContentShareExclusive)
+			{
+			mode = EFileShareExclusive | EFileStream | EFileRead;
+			}
+
+		
+		User::LeaveIfError(fs.Connect());
+		CleanupClosePushL(fs);
+		User::LeaveIfError(file.Open(fs, *iURI, mode));
+		CleanupClosePushL(file);
+		AgentUiL().DisplayInfoL(aInfo, file);	
+		CleanupStack::PopAndDestroy(2, &fs); // file, fs
+		}
+	else
+		{
+		// just pass existing file handle
+		AgentUiL().DisplayInfoL(aInfo, iFile);
+		}
+	}
+
+TInt CF32AgentContent::SetProperty(TAgentProperty aProperty, TInt aValue)
+	{
+	if(aProperty==EAgentPropertyAgentUI)
+		// should only pass type EAgentPropertyAgentUI 
+		{
+		
+		CF32AgentUi* ui = NULL;
+	
+		// get a pointer to the UI
+		TRAPD(err, ui = &AgentUiL());
+		if(err)
+			{
+			return err;
+			}
+		return ui->SetProperty(aProperty, aValue);
+		}
+	else
+		{
+		return KErrCANotSupported;
+		}
+	}
+
+
+CF32AgentUi& CF32AgentContent::AgentUiL()
+	{
+	if(!iAgentUi)
+		{
+		// load agent UI from f32AgentUi.dll
+		iAgentUi = TF32AgentUiFactory::CreateF32AgentUiL();
+		}
+	return *iAgentUi;
+	}