sl@0: /* sl@0: * Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include "f32agentcontent.h" sl@0: #include "f32defaultattributes.h" sl@0: #include sl@0: sl@0: using namespace ContentAccess; sl@0: sl@0: CF32AgentContent* CF32AgentContent::NewL(const TDesC& aURI, TContentShareMode aShareMode) sl@0: { sl@0: CF32AgentContent* self = new (ELeave) CF32AgentContent; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aURI, aShareMode); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CF32AgentContent* CF32AgentContent::NewL(RFile& aFile) sl@0: { sl@0: CF32AgentContent* self = new (ELeave) CF32AgentContent; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aFile); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: CF32AgentContent* CF32AgentContent::NewL(const TDesC8& aHeaderData) sl@0: { sl@0: CF32AgentContent* self = new (ELeave) CF32AgentContent; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aHeaderData); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: #endif //SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: CF32AgentContent::CF32AgentContent() sl@0: { sl@0: } sl@0: sl@0: CF32AgentContent::~CF32AgentContent() sl@0: { sl@0: iFile.Close(); sl@0: if(iURI) sl@0: { sl@0: // file session only created when file is opened by name sl@0: iFs.Close(); sl@0: } sl@0: delete iURI; sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: delete iHeaderData; sl@0: #endif //SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: } sl@0: sl@0: void CF32AgentContent::ConstructL(const TDesC& aURI, TContentShareMode aShareMode) sl@0: { sl@0: iURI = aURI.AllocL(); sl@0: iShareMode = aShareMode; sl@0: sl@0: // Test that the file exists and hold it open so nobody deletes it etc sl@0: TUint mode = TF32DefaultAttributes::GetFileMode(aShareMode); sl@0: User::LeaveIfError(iFs.Connect()); sl@0: User::LeaveIfError(iFile.Open(iFs, *iURI, mode)); sl@0: } sl@0: sl@0: void CF32AgentContent::ConstructL(RFile& aFile) sl@0: { sl@0: User::LeaveIfError(iFile.Duplicate(aFile)); sl@0: } sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: void CF32AgentContent::ConstructL(const TDesC8& aHeaderData) sl@0: { sl@0: if(aHeaderData.Length() > 0) sl@0: iHeaderData = aHeaderData.AllocL(); sl@0: else sl@0: User::Leave(KErrMissingWmdrmHeaderData); sl@0: } sl@0: #endif //SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: TInt CF32AgentContent::OpenContainer(const TDesC&) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt CF32AgentContent::CloseContainer() sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: void CF32AgentContent::GetEmbeddedObjectsL(RStreamablePtrArray& aArray) sl@0: { sl@0: TBuf8 mimeType; sl@0: CEmbeddedObject *embeddedObject = NULL; sl@0: sl@0: // the only embedded object is the file itself sl@0: // Try to get the mime type sl@0: mimeType.SetLength(0); sl@0: if(iURI) sl@0: { sl@0: TF32DefaultAttributes::GetMimeTypeL(*iURI, mimeType); sl@0: } sl@0: else sl@0: { sl@0: TF32DefaultAttributes::GetMimeTypeL(iFile, mimeType); sl@0: } sl@0: embeddedObject = CEmbeddedObject::NewL(KDefaultContentObject(), mimeType, EContentObject); sl@0: CleanupStack::PushL(embeddedObject); sl@0: aArray.AppendL(embeddedObject); sl@0: sl@0: // Now owned by the array so do not destroy sl@0: CleanupStack::Pop(embeddedObject); sl@0: } sl@0: sl@0: void CF32AgentContent::GetEmbeddedObjectsL(RStreamablePtrArray& aArray, TEmbeddedType aType) sl@0: { sl@0: // the only embedded object is the file itself sl@0: if(aType == EContentObject) sl@0: { sl@0: // just get the default object since there is only one content object sl@0: GetEmbeddedObjectsL(aArray); sl@0: } sl@0: } sl@0: sl@0: void CF32AgentContent::SearchL(RStreamablePtrArray& aArray, const TDesC8& aMimeType, TBool /* aRecurse */) sl@0: { sl@0: TBuf8 mimeType; sl@0: sl@0: CEmbeddedObject *embeddedObject = NULL; sl@0: sl@0: // the only embedded object is the file itself sl@0: if(iURI) sl@0: { sl@0: TF32DefaultAttributes::GetMimeTypeL(*iURI, mimeType); sl@0: } sl@0: else sl@0: { sl@0: TF32DefaultAttributes::GetMimeTypeL(iFile, mimeType); sl@0: } sl@0: sl@0: // Check the file has the correct mime type sl@0: if(aMimeType == mimeType) sl@0: { sl@0: embeddedObject = CEmbeddedObject::NewL(KDefaultContentObject(), mimeType, EContentObject); sl@0: CleanupStack::PushL(embeddedObject); sl@0: aArray.AppendL(embeddedObject); sl@0: sl@0: // Now owned by the array so do not destroy sl@0: CleanupStack::Pop(embeddedObject); sl@0: } sl@0: else sl@0: { sl@0: // Mime type was incorrect. Set error to indicate no content object sl@0: // of the desired type was found in the file. sl@0: User::Leave(KErrNotFound); sl@0: } sl@0: } sl@0: sl@0: TInt CF32AgentContent::Search(RStreamablePtrArray& aArray, const TDesC8& aMimeType, TBool aRecurse) sl@0: { sl@0: TRAPD( err, SearchL(aArray, aMimeType, aRecurse) ); sl@0: return err; sl@0: } sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: TInt CF32AgentContent::GetAttribute(TInt aAttribute, TInt& aValue, const TDesC& aUniqueId) sl@0: { sl@0: sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetAttribute(aAttribute, aValue, *iURI); sl@0: } sl@0: else if(iHeaderData) sl@0: { sl@0: err = TF32DefaultAttributes::GetAttribute(*iHeaderData, aAttribute, aValue); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetAttribute(aAttribute, aValue, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: #else sl@0: TInt CF32AgentContent::GetAttribute(TInt aAttribute, TInt& aValue, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetAttribute(aAttribute, aValue, *iURI); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetAttribute(aAttribute, aValue, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: #endif //SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: TInt CF32AgentContent::GetAttributeSet(RAttributeSet& aAttributeSet, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetAttributeSet(aAttributeSet, *iURI); sl@0: } sl@0: else if(iHeaderData) sl@0: { sl@0: err = TF32DefaultAttributes::GetAttributeSet(*iHeaderData, aAttributeSet); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetAttributeSet(aAttributeSet, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: #else sl@0: sl@0: TInt CF32AgentContent::GetAttributeSet(RAttributeSet& aAttributeSet, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetAttributeSet(aAttributeSet, *iURI); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetAttributeSet(aAttributeSet, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: #endif //SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: TInt CF32AgentContent::GetStringAttribute(TInt aAttribute, TDes& aValue, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttribute(aAttribute, aValue, *iURI); sl@0: } sl@0: else if(iHeaderData) sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttribute(*iHeaderData, aAttribute, aValue); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttribute(aAttribute, aValue, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: #else sl@0: TInt CF32AgentContent::GetStringAttribute(TInt aAttribute, TDes& aValue, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttribute(aAttribute, aValue, *iURI); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttribute(aAttribute, aValue, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: TInt CF32AgentContent::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttributeSet(aStringAttributeSet, *iURI); sl@0: } sl@0: else if(iHeaderData) sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttributeSet(*iHeaderData, aStringAttributeSet); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttributeSet(aStringAttributeSet, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: #else sl@0: sl@0: TInt CF32AgentContent::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, const TDesC& aUniqueId) sl@0: { sl@0: // check that the unique Id exists sl@0: if(TF32DefaultAttributes::CheckUniqueId(aUniqueId) != KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: sl@0: TInt err = KErrNone; sl@0: if(iURI) sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttributeSet(aStringAttributeSet, *iURI); sl@0: } sl@0: else sl@0: { sl@0: err = TF32DefaultAttributes::GetStringAttributeSet(aStringAttributeSet, iFile); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: #endif //SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT sl@0: sl@0: TInt CF32AgentContent::AgentSpecificCommand(TInt , const TDesC8& , TDes8& ) sl@0: { sl@0: return KErrCANotSupported; sl@0: } sl@0: sl@0: void CF32AgentContent::AgentSpecificCommand(TInt , const TDesC8& , TDes8& , TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* ptr = &aStatus; sl@0: User::RequestComplete(ptr, KErrCANotSupported); sl@0: } sl@0: sl@0: void CF32AgentContent::NotifyStatusChange(TEventMask , TRequestStatus& aStatus, const TDesC& ) sl@0: { sl@0: TRequestStatus* ptr = &aStatus; sl@0: User::RequestComplete(ptr, KErrCANotSupported); sl@0: } sl@0: sl@0: TInt CF32AgentContent::CancelNotifyStatusChange(TRequestStatus& , const TDesC& ) sl@0: { sl@0: return KErrCANotSupported; sl@0: } sl@0: sl@0: void CF32AgentContent::RequestRights(TRequestStatus& aStatus, const TDesC& ) sl@0: { sl@0: TRequestStatus* ptr = &aStatus; sl@0: User::RequestComplete(ptr, KErrCANotSupported); sl@0: } sl@0: sl@0: TInt CF32AgentContent::CancelRequestRights(TRequestStatus& , const TDesC& ) sl@0: { sl@0: return KErrCANotSupported; sl@0: } sl@0: sl@0: void CF32AgentContent::DisplayInfoL(TDisplayInfo aInfo, const TDesC& aUniqueId) sl@0: { sl@0: // Check that the client hasn't specified some incorrect UniqueId sl@0: User::LeaveIfError(TF32DefaultAttributes::CheckUniqueId(aUniqueId)); sl@0: sl@0: sl@0: if(iURI) sl@0: { sl@0: // Open the file handle in order to pass it to the Agent UI sl@0: RFs fs; sl@0: #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API sl@0: RFile64 file; sl@0: #else sl@0: RFile file; sl@0: #endif //SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API sl@0: sl@0: // default share mode of EFileShareReadersOnly sl@0: TUint mode = EFileShareReadersOnly | EFileStream | EFileRead; sl@0: sl@0: if(iShareMode == EContentShareReadWrite) sl@0: { sl@0: mode = EFileShareAny | EFileStream | EFileRead; sl@0: } sl@0: else if(iShareMode == EContentShareExclusive) sl@0: { sl@0: mode = EFileShareExclusive | EFileStream | EFileRead; sl@0: } sl@0: sl@0: sl@0: User::LeaveIfError(fs.Connect()); sl@0: CleanupClosePushL(fs); sl@0: User::LeaveIfError(file.Open(fs, *iURI, mode)); sl@0: CleanupClosePushL(file); sl@0: AgentUiL().DisplayInfoL(aInfo, file); sl@0: CleanupStack::PopAndDestroy(2, &fs); // file, fs sl@0: } sl@0: else sl@0: { sl@0: // just pass existing file handle sl@0: AgentUiL().DisplayInfoL(aInfo, iFile); sl@0: } sl@0: } sl@0: sl@0: TInt CF32AgentContent::SetProperty(TAgentProperty aProperty, TInt aValue) sl@0: { sl@0: if(aProperty==EAgentPropertyAgentUI) sl@0: // should only pass type EAgentPropertyAgentUI sl@0: { sl@0: sl@0: CF32AgentUi* ui = NULL; sl@0: sl@0: // get a pointer to the UI sl@0: TRAPD(err, ui = &AgentUiL()); sl@0: if(err) sl@0: { sl@0: return err; sl@0: } sl@0: return ui->SetProperty(aProperty, aValue); sl@0: } sl@0: else sl@0: { sl@0: return KErrCANotSupported; sl@0: } sl@0: } sl@0: sl@0: sl@0: CF32AgentUi& CF32AgentContent::AgentUiL() sl@0: { sl@0: if(!iAgentUi) sl@0: { sl@0: // load agent UI from f32AgentUi.dll sl@0: iAgentUi = TF32AgentUiFactory::CreateF32AgentUiL(); sl@0: } sl@0: return *iAgentUi; sl@0: }