--- a/contentmgmt/contentaccessfwfordrm/source/caf/manager.cpp Tue Jul 21 01:04:32 2009 +0100
+++ b/contentmgmt/contentaccessfwfordrm/source/caf/manager.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -1,644 +1,705 @@
-/*
-* 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 "manager.h"
-#include "agentinterface.h"
-#include "agent.h"
-#include "agentinfo.h"
-#include "agentfactory.h"
-#include "attributeset.h"
-#include "caftypes.h"
-#include "caferr.h"
-#include "virtualpath.h"
-#include "dirstreamable.h"
-#include "rightsmanager.h"
-#include "cafpanic.h"
-#include "resolver.h"
-
-using namespace ContentAccess;
-
-EXPORT_C CManager* CManager::NewL()
- {
- CManager* self = CManager::NewLC();
- CleanupStack::Pop(self);
- return self;
- }
-
-EXPORT_C CManager* CManager::NewLC()
- {
- CManager* self = new (ELeave) CManager;
- CleanupStack::PushL(self);
- self->ConstructL();
- return self;
- }
-
-CManager::CManager()
- {
- }
-
-CManager::~CManager()
- {
- delete iResolver;
- }
-
-void CManager::ConstructL()
- {
- iResolver = CAgentResolver::NewL(EFalse);
- }
-
-EXPORT_C TInt CManager::DeleteFile(const TDesC &aFileName) const
- {
- TRAPD(err, DoDeleteFileL(aFileName));
- return err;
- }
-
-void CManager::DoDeleteFileL(const TDesC &aFileName) const
- {
- TFileName actualFileName;
-
- // initalise a pointer to the relevant CAgentManager object
- // iResolver retains ownership of the pointer
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aFileName, actualFileName, EContentShareReadOnly);
-
- User::LeaveIfError(agentInfo.AgentManagerL().DeleteFile(actualFileName));
- }
-
-EXPORT_C TInt CManager::CopyFile(RFile& aSourceFile, const TDesC &aDestination) const
- {
- TRAPD(err, DoCopyFileL(aSourceFile, aDestination));
- return err;
- }
-
-void CManager::DoCopyFileL(RFile& aSourceFile, const TDesC &aDestination) const
- {
- TFileName actualDestination;
- TBool thePrivateDir = EFalse;
- TUid agentUid = KNullUid;
-
- // Find out which agent owns the directory where the destination file lives
- TUid destinationAgentUid = iResolver->ResolveDirectory(aDestination, actualDestination, thePrivateDir);
-
- if(destinationAgentUid != iResolver->DefaultAgentUid())
- {
- // Destination file is in an agent private directory
- // Use destination agent to copy
- agentUid = destinationAgentUid;
- }
- else
- {
- // Use RFile version of ResolveFileL to find the Agent Uid
- agentUid = iResolver->ResolveFileL(aSourceFile).Agent().ImplementationUid();
- }
-
- // If creating the appropriate CAgentManager succeeded ask the agent to copy the file
- User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().CopyFile(aSourceFile, actualDestination));
- }
-
-EXPORT_C TInt CManager::CopyFile(const TDesC &aSource, const TDesC &aDestination) const
- {
- TRAPD(err, DoCopyFileL(aSource, aDestination));
- return err;
- }
-
-void CManager::DoCopyFileL(const TDesC &aSource, const TDesC &aDestination) const
- {
- TFileName actualSource;
- TFileName actualDestination;
- TBool thePrivateDir = EFalse;
- TUid agentUid = KNullUid;
-
- // Find out which agent owns the directory where the source file lives
- TUid sourceAgentUid = iResolver->ResolveDirectory(aSource, actualSource, thePrivateDir);
-
- // Find out which agent owns the directory where the destination file lives
- TUid destinationAgentUid = iResolver->ResolveDirectory(aDestination, actualDestination, thePrivateDir);
-
- if(sourceAgentUid != iResolver->DefaultAgentUid())
- {
- // Source file is in an agent private directory
- // Use source agent to copy
- agentUid = sourceAgentUid;
- }
- else if(destinationAgentUid != iResolver->DefaultAgentUid())
- {
- // Destination file is in an agent private directory
- // Use destination agent to copy
- agentUid = destinationAgentUid;
- }
- else
- {
- // Source and destination are in publicly accessable directories
- agentUid = iResolver->ResolveFileL(aSource, actualSource, EContentShareReadOnly).Agent().ImplementationUid();
- }
-
- // If creating the appropriate CAgentManager succeeded ask the agent to copy the file
- User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().CopyFile(actualSource, actualDestination));
- }
-
-EXPORT_C TInt CManager::RenameFile(const TDesC& aSource, const TDesC& aDestination) const
- {
- TRAPD(err, DoRenameFileL(aSource, aDestination));
- return err;
- }
-
-void CManager::DoRenameFileL(const TDesC& aSource, const TDesC& aDestination) const
- {
- TFileName actualSource;
- TFileName actualDestination;
- TBool thePrivateDir = EFalse;
- TUid agentUid = KNullUid;
-
- // Find out which agent owns the directory where the source file lives
- TUid sourceAgentUid = iResolver->ResolveDirectory(aSource, actualSource, thePrivateDir);
-
- // Find out which agent owns the directory where the destination file lives
- TUid destinationAgentUid = iResolver->ResolveDirectory(aDestination, actualDestination, thePrivateDir);
-
- if(sourceAgentUid != iResolver->DefaultAgentUid())
- {
- // Source file is in an agent private directory
- // Use source agent to copy
- agentUid = sourceAgentUid;
- }
- else if(destinationAgentUid != iResolver->DefaultAgentUid())
- {
- // Destination file is in an agent private directory
- // Use destination agent to copy
- agentUid = destinationAgentUid;
- }
- else
- {
- // Source and destination are in publicly accessable directories
- agentUid = iResolver->ResolveFileL(aSource, actualSource, EContentShareReadOnly).Agent().ImplementationUid();
- }
-
- // Ask the agent to move or rename the file
- User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().RenameFile(actualSource, actualDestination));
- }
-
-EXPORT_C TInt CManager::MkDir(const TDesC &aPath) const
- {
- TRAPD(err, DoMkDirL(aPath));
-
- return err;
- }
-
-void CManager::DoMkDirL(const TDesC &aPath) const
- {
- TBool isThePrivateDir = EFalse;
- TFileName actualPath;
-
- // Figure out which agent handles the directory
- TUid uid = iResolver->ResolveDirectory(aPath, actualPath, isThePrivateDir);
-
- User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().MkDir(actualPath));
- }
-
-EXPORT_C TInt CManager::MkDirAll (const TDesC &aPath) const
- {
- TRAPD(err, DoMkDirAllL(aPath));
- return err;
- }
-
-void CManager::DoMkDirAllL(const TDesC &aPath) const
- {
- TBool isThePrivateDir = EFalse;
- TFileName actualPath;
-
- // Figure out which agent handles the directory
- TUid uid = iResolver->ResolveDirectory(aPath, actualPath, isThePrivateDir);
-
- User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().MkDirAll(actualPath));
- }
-
-EXPORT_C TInt CManager::RmDir(const TDesC &aPath) const
- {
- TRAPD(err, DoRmDirL(aPath));
- return err;
- }
-
-void CManager::DoRmDirL(const TDesC &aPath) const
- {
- TBool isThePrivateDir = EFalse;
- TFileName actualPath;
-
- // Figure out which agent handles the directory
- TUid uid = iResolver->ResolveDirectory(aPath, actualPath, isThePrivateDir);
-
- if(isThePrivateDir)
- {
- User::Leave(KErrAccessDenied);
- }
- else
- {
- User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().RmDir(actualPath));
- }
- }
-
-EXPORT_C TInt CManager::RenameDir(const TDesC& aOldName, const TDesC& aNewName) const
- {
- TRAPD(err, DoRenameDirL(aOldName, aNewName));
- return err;
- }
-
-void CManager::DoRenameDirL(const TDesC &aOldName, const TDesC& aNewName) const
- {
- TPath actualSource;
- TPath actualDestination;
- TBool thePrivateDir = EFalse;
- TUid agentUid = iResolver->DefaultAgentUid();
-
- // Find out which agent owns the directory where the source file lives
- TUid sourceAgentUid = iResolver->ResolveDirectory(aOldName, actualSource, thePrivateDir);
-
- // Find out which agent owns the directory where the destination file lives
- TUid destinationAgentUid = iResolver->ResolveDirectory(aNewName, actualDestination, thePrivateDir);
-
- if(sourceAgentUid != iResolver->DefaultAgentUid())
- {
- // Source file is in an agent private directory
- // Use source agent to copy
- agentUid = sourceAgentUid;
- }
- else if(destinationAgentUid != iResolver->DefaultAgentUid())
- {
- // Destination file is in an agent private directory
- // Use destination agent to copy
- agentUid = destinationAgentUid;
- }
-
- // Ask the agent to move or rename the file
- User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().RenameDir(actualSource, actualDestination));
- }
-
-
-EXPORT_C TInt CManager::GetDir(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList) const
- {
- TRAPD(err, DoGetDirL(aName, aEntryAttMask, aEntrySortKey, aEntryList));
- return err;
- }
-
-void CManager::DoGetDirL(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList) const
- {
- TBool isThePrivateDir = EFalse;
- TFileName actualPath;
-
- // Figure out which agent handles the directory
- TUid uid = iResolver->ResolveDirectory(aName, actualPath, isThePrivateDir);
-
- if(isThePrivateDir)
- {
- // If we are doing GetDir of C:\\private\\ just create an empty CDirStreamable
- aEntryList = CDirStreamable::NewL();
- }
- else
- {
- User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().GetDir(actualPath, aEntryAttMask, aEntrySortKey, aEntryList));
- }
- }
-
-EXPORT_C TInt CManager::GetDir(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList, CDir *&aDirList) const
- {
- TRAPD(err, DoGetDirL(aName, aEntryAttMask, aEntrySortKey, aEntryList, aDirList));
- return err;
- }
-
-void CManager::DoGetDirL(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList, CDir *&aDirList) const
- {
- TBool isThePrivateDir = EFalse;
- TFileName actualPath;
- CDir* emptyDirList;
-
- // Figure out which agent handles the directory
- TUid uid = iResolver->ResolveDirectory(aName, actualPath, isThePrivateDir);
-
- if(isThePrivateDir)
- {
- // If we are doing GetDir of C:\\private\\ just create an empty entryList
- emptyDirList = CDirStreamable::NewL();
- CleanupStack::PushL(emptyDirList);
-
- GetListOfAgentPrivateDirectoriesL(aDirList);
-
- CleanupStack::Pop(emptyDirList);
- aEntryList = emptyDirList;
- }
- else
- {
- User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().GetDir(actualPath, aEntryAttMask, aEntrySortKey, aEntryList, aDirList));
- }
- }
-
-EXPORT_C TInt CManager::GetDir(const TDesC &aName, const TUidType &aEntryUid, TUint aEntrySortKey, CDir *&aFileList) const
- {
- TRAPD(err, DoGetDirL(aName, aEntryUid, aEntrySortKey, aFileList));
- return err;
- }
-
-void CManager::DoGetDirL(const TDesC &aName, const TUidType &aEntryUid, TUint aEntrySortKey, CDir *&aFileList) const
- {
- TBool isThePrivateDir = EFalse;
- TFileName actualPath;
-
- // Figure out which agent handles the directory
- TUid uid = iResolver->ResolveDirectory(aName, actualPath, isThePrivateDir);
-
- if(isThePrivateDir)
- {
- // We've been asked to look at C:\\private\\ just return an empty CDirStreamable
- aFileList = CDirStreamable::NewL();
- }
- else
- {
- User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().GetDir(actualPath, aEntryUid, aEntrySortKey, aFileList));
- }
- }
-
-EXPORT_C TInt CManager::GetAttribute(TInt aAttribute, TInt& aValue, const TVirtualPathPtr& aVirtualPath) const
- {
- TRAPD(err, DoGetAttributeL(aAttribute, aValue, aVirtualPath));
- return err;
- }
-
-void CManager::DoGetAttributeL(TInt aAttribute, TInt& aValue, const TVirtualPathPtr& aVirtualPath) const
- {
- HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(),uri, EContentShareReadOnly);
- User::LeaveIfError(agentInfo.AgentManagerL().GetAttribute(aAttribute, aValue, TVirtualPathPtr(uri, aVirtualPath.UniqueId())));
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-EXPORT_C TInt CManager::GetStringAttribute(TInt aAttribute, TDes& aValue, const TVirtualPathPtr& aVirtualPath) const
- {
- TRAPD(err, DoGetStringAttributeL(aAttribute, aValue, aVirtualPath));
- return err;
- }
-
-void CManager::DoGetStringAttributeL(TInt aAttribute, TDes& aValue, const TVirtualPathPtr& aVirtualPath) const
- {
- HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(), uri, EContentShareReadOnly);
-
- // find out the attribute
- User::LeaveIfError(agentInfo.AgentManagerL().GetStringAttribute(aAttribute, aValue, TVirtualPathPtr(uri,aVirtualPath.UniqueId())));
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-EXPORT_C TInt CManager::GetAttributeSet(RAttributeSet& aAttributeSet, const TVirtualPathPtr& aVirtualPath) const
- {
- TRAPD(err, DoGetAttributeSetL(aAttributeSet, aVirtualPath));
- return err;
- }
-
-void CManager::DoGetAttributeSetL(RAttributeSet& aAttributeSet, const TVirtualPathPtr& aVirtualPath) const
- {
- HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(), uri, EContentShareReadOnly);
-
- User::LeaveIfError(agentInfo.AgentManagerL().GetAttributeSet(aAttributeSet, TVirtualPathPtr(uri, aVirtualPath.UniqueId())));
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-EXPORT_C TInt CManager::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, const TVirtualPathPtr& aVirtualPath) const
- {
- TRAPD(err, DoGetStringAttributeSetL(aStringAttributeSet, aVirtualPath));
- return err;
- }
-
-
-void CManager::DoGetStringAttributeSetL(RStringAttributeSet& aStringAttributeSet, const TVirtualPathPtr& aVirtualPath) const
- {
- HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(),uri, EContentShareReadOnly);
-
- // find out the array of attributes
- User::LeaveIfError(agentInfo.AgentManagerL().GetStringAttributeSet(aStringAttributeSet, TVirtualPathPtr(uri, aVirtualPath.UniqueId())));
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-EXPORT_C void CManager::NotifyStatusChange(const TDesC &aURI, TEventMask aMask, TRequestStatus &aStatus)
- {
- TRAPD(err, DoNotifyStatusChangeL(aURI, aMask, aStatus));
- if(err != KErrNone)
- {
- // Must have failed before asking the agent for status
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, err);
- }
-
- }
-
-void CManager::DoNotifyStatusChangeL(const TDesC &aURI, TEventMask aMask, TRequestStatus &aStatus)
- {
- HBufC* uriBuffer = HBufC::NewLC(aURI.Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aURI, uri, EContentShareReadOnly);
-
- // Ask the agent to notifiy the client when the status of the given file changes
- agentInfo.AgentManagerL().NotifyStatusChange(uri, aMask, aStatus);
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-EXPORT_C TInt CManager::CancelNotifyStatusChange (const TDesC &aURI, TRequestStatus &aStatus)
- {
- TRAPD(err, DoCancelNotifyStatusChangeL(aURI, aStatus));
- return err;
- }
-
-void CManager::DoCancelNotifyStatusChangeL(const TDesC &aURI, TRequestStatus &aStatus)
- {
- HBufC* uriBuffer = HBufC::NewLC(aURI.Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aURI, uri, EContentShareReadOnly);
-
- // cancel the notification request
- User::LeaveIfError(agentInfo.AgentManagerL().CancelNotifyStatusChange(uri, aStatus));
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-EXPORT_C TInt CManager::SetProperty(TAgentProperty aProperty, TInt aValue)
- {
- TRAPD(err, DoSetPropertyL(aProperty, aValue));
- return err;
- }
-
-void CManager::DoSetPropertyL(TAgentProperty aProperty, TInt aValue)
- {
- TInt err = KErrNone;
- TInt rVal = KErrNone;
- TInt i = 0;
- TInt count = iResolver->AgentInfoCount();
-
- CAgentInfo &defaultAgentInfo = iResolver->AgentInfoL(iResolver->DefaultAgentUid());
- err = defaultAgentInfo.AgentManagerL().SetProperty(aProperty, aValue);
- if(err == KErrNoMemory)
- {
- User::Leave(KErrNoMemory);
- }
-
- // Ignore F32 agent return code unless it's KErrNoMemory
- err= KErrNone;
-
- // Set the property in all the other agents
- for( i = 0; i < count; i++)
- {
- CAgentInfo& agentInfo = iResolver->AgentInfo(i);
- err = agentInfo.AgentManagerL().SetProperty(aProperty, aValue);
- if(err == KErrNoMemory)
- {
- User::Leave(KErrNoMemory);
- }
-
- // If an error occurred and no previous error has occured
- if(err != KErrNone && rVal == KErrNone)
- {
- rVal = err;
- }
- }
-
- // leave if an error occurred in any agent
- User::LeaveIfError(rVal);
- }
-
-EXPORT_C void CManager::DisplayInfoL(TDisplayInfo aInfo, const TVirtualPathPtr& aVirtualPath)
- {
- HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
- TPtr uri = uriBuffer->Des();
-
- // Find the agent who handles the file
- CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(), uri, EContentShareReadOnly);
-
- // find out the attribute
- agentInfo.AgentManagerL().DisplayInfoL(aInfo, TVirtualPathPtr(uri, aVirtualPath.UniqueId()));
- CleanupStack::PopAndDestroy(uriBuffer);
- }
-
-
-EXPORT_C void CManager::ListAgentsL (RArray <TAgent>& aAgents)
- {
- TInt i = 0;
- TBuf <KMaxAgentNameLength> agentName;
- TInt count = iResolver->AgentInfoCount();
-
- // build the array of pointers from CAgentResolver
- for(i = 0; i < count; i++)
- {
- TAgent agent = iResolver->AgentInfo(i).Agent();
- User::LeaveIfError(aAgents.Append(agent));
- }
- }
-
-EXPORT_C TInt CManager::AgentSpecificCommand (TAgent &aAgent, TInt aCommand, const TDesC8 &aInputBuffer, TDes8 &aOutputBuffer)
- {
- CAgentManager* manager = NULL;
- TInt err = KErrNone;
- TRAP(err, manager = &iResolver->AgentInfoL(aAgent.ImplementationUid()).AgentManagerL());
- if(err == KErrNone)
- {
- err = manager->AgentSpecificCommand (aCommand, aInputBuffer, aOutputBuffer);
- }
- return err;
- }
-
-EXPORT_C void CManager::AgentSpecificCommand (TAgent &aAgent, TInt aCommand, const TDesC8 &aInputBuffer, TDes8 &aOutputBuffer, TRequestStatus &aStatus)
- {
- CAgentManager* manager = NULL;
-
- TRAPD(err, manager = &iResolver->AgentInfoL(aAgent.ImplementationUid()).AgentManagerL());
- if(err == KErrNone)
- {
- manager->AgentSpecificCommand (aCommand, aInputBuffer, aOutputBuffer, aStatus);
- }
- else
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, err);
- }
- }
-
-EXPORT_C void CManager::DisplayManagementInfoL(TAgent& aAgent)
- {
- CAgentInfo& agentInfo = iResolver->AgentInfoL(aAgent.ImplementationUid());
-
- // Ask agent to display management info
- agentInfo.AgentManagerL().DisplayManagementInfoL();
- }
-
-EXPORT_C CRightsManager* CManager::CreateRightsManagerL(TAgent& aAgent) const
- {
- // Create a rights manager
- return CRightsManager::NewL(aAgent.ImplementationUid());
- }
-
-void CManager::GetListOfAgentPrivateDirectoriesL(CDir *&aDir) const
- {
- CDirStreamable *ptr = NULL;
- // fill in the agent directories under the \\private\\ directory
- TInt i = 0;
- TInt count = iResolver->AgentInfoCount();
-
- TBuf <KMaxAgentNameLength> agentName;
- TPath privateDirectory;
-
- // Create CDirStreamable object
- ptr = CDirStreamable::NewL();
- CleanupStack::PushL(ptr);
-
- // set aDir to point to the CDirStreamable we just created
- for(i = 0; i < count; i++)
- {
- // only fill in the agents that have a private directory that is not blank
- if(iResolver->AgentInfo(i).PrivateDirectoryName().Length() != 0)
- {
- TEntry aEntry;
- aEntry.iName = iResolver->AgentInfo(i).Agent().Name();
- aEntry.iAtt = KEntryAttDir;
- aEntry.iType = TUidType();
- aEntry.iSize = 0;
- ptr->AddL(aEntry);
- }
- }
- CleanupStack::Pop(ptr);
- aDir = ptr;
- }
-
-#ifndef REMOVE_CAF1
-EXPORT_C void CManager::DeleteFileL(const TDesC &aFileName)
- {
- CManager *m = CManager::NewLC();
- User::LeaveIfError(m->DeleteFile(aFileName));
- CleanupStack::PopAndDestroy(m);
- }
-#endif // REMOVE_CAF1
+/*
+* 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 <caf/manager.h>
+#include <caf/agentinterface.h>
+#include <caf/agent.h>
+#include "agentinfo.h"
+#include <caf/agentfactory.h>
+#include <caf/attributeset.h>
+#include <caf/caftypes.h>
+#include <caf/caferr.h>
+#include <caf/virtualpath.h>
+#include <caf/dirstreamable.h>
+#include <caf/rightsmanager.h>
+#include <caf/cafpanic.h>
+#include "resolver.h"
+
+using namespace ContentAccess;
+
+EXPORT_C CManager* CManager::NewL()
+ {
+ CManager* self = CManager::NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+EXPORT_C CManager* CManager::NewLC()
+ {
+ CManager* self = new (ELeave) CManager;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CManager::CManager()
+ {
+ }
+
+CManager::~CManager()
+ {
+ delete iResolver;
+ }
+
+void CManager::ConstructL()
+ {
+ iResolver = CAgentResolver::NewL(EFalse);
+ }
+
+EXPORT_C TInt CManager::DeleteFile(const TDesC &aFileName) const
+ {
+ TRAPD(err, DoDeleteFileL(aFileName));
+ return err;
+ }
+
+void CManager::DoDeleteFileL(const TDesC &aFileName) const
+ {
+ TFileName actualFileName;
+
+ // initalise a pointer to the relevant CAgentManager object
+ // iResolver retains ownership of the pointer
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aFileName, actualFileName, EContentShareReadOnly);
+
+ User::LeaveIfError(agentInfo.AgentManagerL().DeleteFile(actualFileName));
+ }
+
+EXPORT_C TInt CManager::CopyFile(RFile& aSourceFile, const TDesC &aDestination) const
+ {
+ TRAPD(err, DoCopyFileL(aSourceFile, aDestination));
+ return err;
+ }
+
+void CManager::DoCopyFileL(RFile& aSourceFile, const TDesC &aDestination) const
+ {
+ TFileName actualDestination;
+ TBool thePrivateDir = EFalse;
+ TUid agentUid = KNullUid;
+
+ // Find out which agent owns the directory where the destination file lives
+ TUid destinationAgentUid = iResolver->ResolveDirectory(aDestination, actualDestination, thePrivateDir);
+
+ if(destinationAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Destination file is in an agent private directory
+ // Use destination agent to copy
+ agentUid = destinationAgentUid;
+ }
+ else
+ {
+ // Use RFile version of ResolveFileL to find the Agent Uid
+ agentUid = iResolver->ResolveFileL(aSourceFile).Agent().ImplementationUid();
+ }
+
+ // If creating the appropriate CAgentManager succeeded ask the agent to copy the file
+ User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().CopyFile(aSourceFile, actualDestination));
+ }
+
+EXPORT_C TInt CManager::CopyFile(const TDesC &aSource, const TDesC &aDestination) const
+ {
+ TRAPD(err, DoCopyFileL(aSource, aDestination));
+ return err;
+ }
+
+void CManager::DoCopyFileL(const TDesC &aSource, const TDesC &aDestination) const
+ {
+ TFileName actualSource;
+ TFileName actualDestination;
+ TBool thePrivateDir = EFalse;
+ TUid agentUid = KNullUid;
+
+ // Find out which agent owns the directory where the source file lives
+ TUid sourceAgentUid = iResolver->ResolveDirectory(aSource, actualSource, thePrivateDir);
+
+ // Find out which agent owns the directory where the destination file lives
+ TUid destinationAgentUid = iResolver->ResolveDirectory(aDestination, actualDestination, thePrivateDir);
+
+ if(sourceAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Source file is in an agent private directory
+ // Use source agent to copy
+ agentUid = sourceAgentUid;
+ }
+ else if(destinationAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Destination file is in an agent private directory
+ // Use destination agent to copy
+ agentUid = destinationAgentUid;
+ }
+ else
+ {
+ // Source and destination are in publicly accessable directories
+ agentUid = iResolver->ResolveFileL(aSource, actualSource, EContentShareReadOnly).Agent().ImplementationUid();
+ }
+
+ // If creating the appropriate CAgentManager succeeded ask the agent to copy the file
+ User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().CopyFile(actualSource, actualDestination));
+ }
+
+EXPORT_C TInt CManager::RenameFile(const TDesC& aSource, const TDesC& aDestination) const
+ {
+ TRAPD(err, DoRenameFileL(aSource, aDestination));
+ return err;
+ }
+
+void CManager::DoRenameFileL(const TDesC& aSource, const TDesC& aDestination) const
+ {
+ TFileName actualSource;
+ TFileName actualDestination;
+ TBool thePrivateDir = EFalse;
+ TUid agentUid = KNullUid;
+
+ // Find out which agent owns the directory where the source file lives
+ TUid sourceAgentUid = iResolver->ResolveDirectory(aSource, actualSource, thePrivateDir);
+
+ // Find out which agent owns the directory where the destination file lives
+ TUid destinationAgentUid = iResolver->ResolveDirectory(aDestination, actualDestination, thePrivateDir);
+
+ if(sourceAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Source file is in an agent private directory
+ // Use source agent to copy
+ agentUid = sourceAgentUid;
+ }
+ else if(destinationAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Destination file is in an agent private directory
+ // Use destination agent to copy
+ agentUid = destinationAgentUid;
+ }
+ else
+ {
+ // Source and destination are in publicly accessable directories
+ agentUid = iResolver->ResolveFileL(aSource, actualSource, EContentShareReadOnly).Agent().ImplementationUid();
+ }
+
+ // Ask the agent to move or rename the file
+ User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().RenameFile(actualSource, actualDestination));
+ }
+
+EXPORT_C TInt CManager::MkDir(const TDesC &aPath) const
+ {
+ TRAPD(err, DoMkDirL(aPath));
+
+ return err;
+ }
+
+void CManager::DoMkDirL(const TDesC &aPath) const
+ {
+ TBool isThePrivateDir = EFalse;
+ TFileName actualPath;
+
+ // Figure out which agent handles the directory
+ TUid uid = iResolver->ResolveDirectory(aPath, actualPath, isThePrivateDir);
+
+ User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().MkDir(actualPath));
+ }
+
+EXPORT_C TInt CManager::MkDirAll (const TDesC &aPath) const
+ {
+ TRAPD(err, DoMkDirAllL(aPath));
+ return err;
+ }
+
+void CManager::DoMkDirAllL(const TDesC &aPath) const
+ {
+ TBool isThePrivateDir = EFalse;
+ TFileName actualPath;
+
+ // Figure out which agent handles the directory
+ TUid uid = iResolver->ResolveDirectory(aPath, actualPath, isThePrivateDir);
+
+ User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().MkDirAll(actualPath));
+ }
+
+EXPORT_C TInt CManager::RmDir(const TDesC &aPath) const
+ {
+ TRAPD(err, DoRmDirL(aPath));
+ return err;
+ }
+
+void CManager::DoRmDirL(const TDesC &aPath) const
+ {
+ TBool isThePrivateDir = EFalse;
+ TFileName actualPath;
+
+ // Figure out which agent handles the directory
+ TUid uid = iResolver->ResolveDirectory(aPath, actualPath, isThePrivateDir);
+
+ if(isThePrivateDir)
+ {
+ User::Leave(KErrAccessDenied);
+ }
+ else
+ {
+ User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().RmDir(actualPath));
+ }
+ }
+
+EXPORT_C TInt CManager::RenameDir(const TDesC& aOldName, const TDesC& aNewName) const
+ {
+ TRAPD(err, DoRenameDirL(aOldName, aNewName));
+ return err;
+ }
+
+void CManager::DoRenameDirL(const TDesC &aOldName, const TDesC& aNewName) const
+ {
+ TPath actualSource;
+ TPath actualDestination;
+ TBool thePrivateDir = EFalse;
+ TUid agentUid = iResolver->DefaultAgentUid();
+
+ // Find out which agent owns the directory where the source file lives
+ TUid sourceAgentUid = iResolver->ResolveDirectory(aOldName, actualSource, thePrivateDir);
+
+ // Find out which agent owns the directory where the destination file lives
+ TUid destinationAgentUid = iResolver->ResolveDirectory(aNewName, actualDestination, thePrivateDir);
+
+ if(sourceAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Source file is in an agent private directory
+ // Use source agent to copy
+ agentUid = sourceAgentUid;
+ }
+ else if(destinationAgentUid != iResolver->DefaultAgentUid())
+ {
+ // Destination file is in an agent private directory
+ // Use destination agent to copy
+ agentUid = destinationAgentUid;
+ }
+
+ // Ask the agent to move or rename the file
+ User::LeaveIfError(iResolver->AgentInfoL(agentUid).AgentManagerL().RenameDir(actualSource, actualDestination));
+ }
+
+
+EXPORT_C TInt CManager::GetDir(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList) const
+ {
+ TRAPD(err, DoGetDirL(aName, aEntryAttMask, aEntrySortKey, aEntryList));
+ return err;
+ }
+
+void CManager::DoGetDirL(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList) const
+ {
+ TBool isThePrivateDir = EFalse;
+ TFileName actualPath;
+
+ // Figure out which agent handles the directory
+ TUid uid = iResolver->ResolveDirectory(aName, actualPath, isThePrivateDir);
+
+ if(isThePrivateDir)
+ {
+ // If we are doing GetDir of C:\\private\\ just create an empty CDirStreamable
+ aEntryList = CDirStreamable::NewL();
+ }
+ else
+ {
+ User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().GetDir(actualPath, aEntryAttMask, aEntrySortKey, aEntryList));
+ }
+ }
+
+EXPORT_C TInt CManager::GetDir(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList, CDir *&aDirList) const
+ {
+ TRAPD(err, DoGetDirL(aName, aEntryAttMask, aEntrySortKey, aEntryList, aDirList));
+ return err;
+ }
+
+void CManager::DoGetDirL(const TDesC &aName, TUint aEntryAttMask, TUint aEntrySortKey, CDir *&aEntryList, CDir *&aDirList) const
+ {
+ TBool isThePrivateDir = EFalse;
+ TFileName actualPath;
+ CDir* emptyDirList;
+
+ // Figure out which agent handles the directory
+ TUid uid = iResolver->ResolveDirectory(aName, actualPath, isThePrivateDir);
+
+ if(isThePrivateDir)
+ {
+ // If we are doing GetDir of C:\\private\\ just create an empty entryList
+ emptyDirList = CDirStreamable::NewL();
+ CleanupStack::PushL(emptyDirList);
+
+ GetListOfAgentPrivateDirectoriesL(aDirList);
+
+ CleanupStack::Pop(emptyDirList);
+ aEntryList = emptyDirList;
+ }
+ else
+ {
+ User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().GetDir(actualPath, aEntryAttMask, aEntrySortKey, aEntryList, aDirList));
+ }
+ }
+
+EXPORT_C TInt CManager::GetDir(const TDesC &aName, const TUidType &aEntryUid, TUint aEntrySortKey, CDir *&aFileList) const
+ {
+ TRAPD(err, DoGetDirL(aName, aEntryUid, aEntrySortKey, aFileList));
+ return err;
+ }
+
+void CManager::DoGetDirL(const TDesC &aName, const TUidType &aEntryUid, TUint aEntrySortKey, CDir *&aFileList) const
+ {
+ TBool isThePrivateDir = EFalse;
+ TFileName actualPath;
+
+ // Figure out which agent handles the directory
+ TUid uid = iResolver->ResolveDirectory(aName, actualPath, isThePrivateDir);
+
+ if(isThePrivateDir)
+ {
+ // We've been asked to look at C:\\private\\ just return an empty CDirStreamable
+ aFileList = CDirStreamable::NewL();
+ }
+ else
+ {
+ User::LeaveIfError(iResolver->AgentInfoL(uid).AgentManagerL().GetDir(actualPath, aEntryUid, aEntrySortKey, aFileList));
+ }
+ }
+
+EXPORT_C TInt CManager::GetAttribute(TInt aAttribute, TInt& aValue, const TVirtualPathPtr& aVirtualPath) const
+ {
+ TRAPD(err, DoGetAttributeL(aAttribute, aValue, aVirtualPath));
+ return err;
+ }
+
+void CManager::DoGetAttributeL(TInt aAttribute, TInt& aValue, const TVirtualPathPtr& aVirtualPath) const
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(),uri, EContentShareReadOnly);
+ User::LeaveIfError(agentInfo.AgentManagerL().GetAttribute(aAttribute, aValue, TVirtualPathPtr(uri, aVirtualPath.UniqueId())));
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C TInt CManager::GetAttribute(TInt aAttribute, TInt& aValue, RFile& aFile, const TDesC& aUniqueId)
+ {
+ TRAPD(err, DoGetAttributeL(aAttribute, aValue, aFile, aUniqueId));
+ return err;
+ }
+
+void CManager::DoGetAttributeL(TInt aAttribute, TInt& aValue, RFile& aFile, const TDesC& aUniqueId) const
+ {
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aFile);
+ User::LeaveIfError(agentInfo.AgentManagerL().GetAttribute(aAttribute, aValue, aFile, aUniqueId));
+ }
+
+
+EXPORT_C TInt CManager::GetStringAttribute(TInt aAttribute, TDes& aValue, const TVirtualPathPtr& aVirtualPath) const
+ {
+ TRAPD(err, DoGetStringAttributeL(aAttribute, aValue, aVirtualPath));
+ return err;
+ }
+
+void CManager::DoGetStringAttributeL(TInt aAttribute, TDes& aValue, const TVirtualPathPtr& aVirtualPath) const
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(), uri, EContentShareReadOnly);
+
+ // find out the attribute
+ User::LeaveIfError(agentInfo.AgentManagerL().GetStringAttribute(aAttribute, aValue, TVirtualPathPtr(uri,aVirtualPath.UniqueId())));
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C TInt CManager::GetStringAttribute (TInt aAttribute, TDes& aValue, RFile& aFile, const TDesC& aUniqueId)
+ {
+ TRAPD(err, DoGetStringAttributeL(aAttribute, aValue, aFile, aUniqueId));
+ return err;
+ }
+
+void CManager::DoGetStringAttributeL(TInt aAttribute, TDes& aValue, RFile& aFile, const TDesC& aUniqueId) const
+ {
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aFile);
+ // find out the attribute
+ User::LeaveIfError(agentInfo.AgentManagerL().GetStringAttribute(aAttribute, aValue, aFile, aUniqueId));
+ }
+
+EXPORT_C TInt CManager::GetAttributeSet(RAttributeSet& aAttributeSet, const TVirtualPathPtr& aVirtualPath) const
+ {
+ TRAPD(err, DoGetAttributeSetL(aAttributeSet, aVirtualPath));
+ return err;
+ }
+
+void CManager::DoGetAttributeSetL(RAttributeSet& aAttributeSet, const TVirtualPathPtr& aVirtualPath) const
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(), uri, EContentShareReadOnly);
+
+ User::LeaveIfError(agentInfo.AgentManagerL().GetAttributeSet(aAttributeSet, TVirtualPathPtr(uri, aVirtualPath.UniqueId())));
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C TInt CManager::GetAttributeSet (RAttributeSet& aAttributeSet, RFile& aFile, const TDesC& aUniqueId)
+ {
+ TRAPD(err, DoGetAttributeSetL(aAttributeSet, aFile, aUniqueId));
+ return err;
+ }
+
+void CManager::DoGetAttributeSetL(RAttributeSet& aAttributeSet, RFile& aFile, const TDesC& aUniqueId) const
+ {
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aFile);
+ User::LeaveIfError(agentInfo.AgentManagerL().GetAttributeSet(aAttributeSet, aFile, aUniqueId));
+ }
+
+EXPORT_C TInt CManager::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, const TVirtualPathPtr& aVirtualPath) const
+ {
+ TRAPD(err, DoGetStringAttributeSetL(aStringAttributeSet, aVirtualPath));
+ return err;
+ }
+
+void CManager::DoGetStringAttributeSetL(RStringAttributeSet& aStringAttributeSet, const TVirtualPathPtr& aVirtualPath) const
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(),uri, EContentShareReadOnly);
+
+ // find out the array of attributes
+ User::LeaveIfError(agentInfo.AgentManagerL().GetStringAttributeSet(aStringAttributeSet, TVirtualPathPtr(uri, aVirtualPath.UniqueId())));
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C TInt CManager::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, RFile& aFile, const TDesC& aUniqueId)
+ {
+ TRAPD(err, DoGetStringAttributeSetL(aStringAttributeSet, aFile, aUniqueId));
+ return err;
+ }
+
+void CManager::DoGetStringAttributeSetL(RStringAttributeSet& aStringAttributeSet, RFile& aFile, const TDesC& aUniqueId) const
+ {
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aFile);
+ // find out the array of attributes
+ User::LeaveIfError(agentInfo.AgentManagerL().GetStringAttributeSet(aStringAttributeSet, aFile, aUniqueId));
+ }
+
+EXPORT_C void CManager::NotifyStatusChange(const TDesC &aURI, TEventMask aMask, TRequestStatus &aStatus)
+ {
+ TRAPD(err, DoNotifyStatusChangeL(aURI, aMask, aStatus));
+ if(err != KErrNone)
+ {
+ // Must have failed before asking the agent for status
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, err);
+ }
+ }
+
+void CManager::DoNotifyStatusChangeL(const TDesC &aURI, TEventMask aMask, TRequestStatus &aStatus)
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aURI.Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aURI, uri, EContentShareReadOnly);
+
+ // Ask the agent to notifiy the client when the status of the given file changes
+ agentInfo.AgentManagerL().NotifyStatusChange(uri, aMask, aStatus);
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C TInt CManager::CancelNotifyStatusChange (const TDesC &aURI, TRequestStatus &aStatus)
+ {
+ TRAPD(err, DoCancelNotifyStatusChangeL(aURI, aStatus));
+ return err;
+ }
+
+void CManager::DoCancelNotifyStatusChangeL(const TDesC &aURI, TRequestStatus &aStatus)
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aURI.Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aURI, uri, EContentShareReadOnly);
+
+ // cancel the notification request
+ User::LeaveIfError(agentInfo.AgentManagerL().CancelNotifyStatusChange(uri, aStatus));
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C TInt CManager::SetProperty(TAgentProperty aProperty, TInt aValue)
+ {
+ TRAPD(err, DoSetPropertyL(aProperty, aValue));
+ return err;
+ }
+
+void CManager::DoSetPropertyL(TAgentProperty aProperty, TInt aValue)
+ {
+ TInt err = KErrNone;
+ TInt rVal = KErrNone;
+ TInt i = 0;
+ TInt count = iResolver->AgentInfoCount();
+
+ CAgentInfo &defaultAgentInfo = iResolver->AgentInfoL(iResolver->DefaultAgentUid());
+ err = defaultAgentInfo.AgentManagerL().SetProperty(aProperty, aValue);
+ if(err == KErrNoMemory)
+ {
+ User::Leave(KErrNoMemory);
+ }
+
+ // Ignore F32 agent return code unless it's KErrNoMemory
+ err= KErrNone;
+
+ // Set the property in all the other agents
+ for( i = 0; i < count; i++)
+ {
+ CAgentInfo& agentInfo = iResolver->AgentInfo(i);
+ err = agentInfo.AgentManagerL().SetProperty(aProperty, aValue);
+ if(err == KErrNoMemory)
+ {
+ User::Leave(KErrNoMemory);
+ }
+
+ // If an error occurred and no previous error has occured
+ if(err != KErrNone && rVal == KErrNone)
+ {
+ rVal = err;
+ }
+ }
+
+ // leave if an error occurred in any agent
+ User::LeaveIfError(rVal);
+ }
+
+EXPORT_C void CManager::DisplayInfoL(TDisplayInfo aInfo, const TVirtualPathPtr& aVirtualPath)
+ {
+ HBufC* uriBuffer = HBufC::NewLC(aVirtualPath.URI().Length() + KMaxSIDLength);
+ TPtr uri = uriBuffer->Des();
+
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aVirtualPath.URI(), uri, EContentShareReadOnly);
+
+ // find out the attribute
+ agentInfo.AgentManagerL().DisplayInfoL(aInfo, TVirtualPathPtr(uri, aVirtualPath.UniqueId()));
+ CleanupStack::PopAndDestroy(uriBuffer);
+ }
+
+EXPORT_C void CManager::DisplayInfoL(TDisplayInfo aInfo, RFile& aFile, const TDesC& aUniqueId)
+ {
+ // Find the agent who handles the file
+ CAgentInfo& agentInfo = iResolver->ResolveFileL(aFile);
+ // find out the attribute
+ agentInfo.AgentManagerL().DisplayInfoL(aInfo, aFile, aUniqueId);
+ }
+
+EXPORT_C void CManager::ListAgentsL (RArray <TAgent>& aAgents)
+ {
+ TInt i = 0;
+ TBuf <KMaxAgentNameLength> agentName;
+ TInt count = iResolver->AgentInfoCount();
+
+ // build the array of pointers from CAgentResolver
+ for(i = 0; i < count; i++)
+ {
+ TAgent agent = iResolver->AgentInfo(i).Agent();
+ User::LeaveIfError(aAgents.Append(agent));
+ }
+ }
+
+EXPORT_C TInt CManager::AgentSpecificCommand (TAgent &aAgent, TInt aCommand, const TDesC8 &aInputBuffer, TDes8 &aOutputBuffer)
+ {
+ CAgentManager* manager = NULL;
+ TInt err = KErrNone;
+ TRAP(err, manager = &iResolver->AgentInfoL(aAgent.ImplementationUid()).AgentManagerL());
+ if(err == KErrNone)
+ {
+ err = manager->AgentSpecificCommand (aCommand, aInputBuffer, aOutputBuffer);
+ }
+ return err;
+ }
+
+EXPORT_C void CManager::AgentSpecificCommand (TAgent &aAgent, TInt aCommand, const TDesC8 &aInputBuffer, TDes8 &aOutputBuffer, TRequestStatus &aStatus)
+ {
+ CAgentManager* manager = NULL;
+
+ TRAPD(err, manager = &iResolver->AgentInfoL(aAgent.ImplementationUid()).AgentManagerL());
+ if(err == KErrNone)
+ {
+ manager->AgentSpecificCommand (aCommand, aInputBuffer, aOutputBuffer, aStatus);
+ }
+ else
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, err);
+ }
+ }
+
+EXPORT_C void CManager::DisplayManagementInfoL(TAgent& aAgent)
+ {
+ CAgentInfo& agentInfo = iResolver->AgentInfoL(aAgent.ImplementationUid());
+
+ // Ask agent to display management info
+ agentInfo.AgentManagerL().DisplayManagementInfoL();
+ }
+
+EXPORT_C CRightsManager* CManager::CreateRightsManagerL(TAgent& aAgent) const
+ {
+ // Create a rights manager
+ return CRightsManager::NewL(aAgent.ImplementationUid());
+ }
+
+void CManager::GetListOfAgentPrivateDirectoriesL(CDir *&aDir) const
+ {
+ CDirStreamable *ptr = NULL;
+ // fill in the agent directories under the \\private\\ directory
+ TInt i = 0;
+ TInt count = iResolver->AgentInfoCount();
+
+ TBuf <KMaxAgentNameLength> agentName;
+ TPath privateDirectory;
+
+ // Create CDirStreamable object
+ ptr = CDirStreamable::NewL();
+ CleanupStack::PushL(ptr);
+
+ // set aDir to point to the CDirStreamable we just created
+ for(i = 0; i < count; i++)
+ {
+ // only fill in the agents that have a private directory that is not blank
+ if(iResolver->AgentInfo(i).PrivateDirectoryName().Length() != 0)
+ {
+ TEntry aEntry;
+ aEntry.iName = iResolver->AgentInfo(i).Agent().Name();
+ aEntry.iAtt = KEntryAttDir;
+ aEntry.iType = TUidType();
+ aEntry.iSize = 0;
+ ptr->AddL(aEntry);
+ }
+ }
+ CleanupStack::Pop(ptr);
+ aDir = ptr;
+ }
+
+#ifndef REMOVE_CAF1
+EXPORT_C void CManager::DeleteFileL(const TDesC &aFileName)
+ {
+ CManager *m = CManager::NewLC();
+ User::LeaveIfError(m->DeleteFile(aFileName));
+ CleanupStack::PopAndDestroy(m);
+ }
+#endif // REMOVE_CAF1
+