sl@0: /* sl@0: * Copyright (c) 2003-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 sl@0: #include "resolver.h" sl@0: #include sl@0: #include "agentinfo.h" sl@0: #include sl@0: sl@0: #ifndef REMOVE_CAF1 sl@0: #include sl@0: #include sl@0: #endif // REMOVE_CAF1 sl@0: sl@0: using namespace ContentAccess; sl@0: sl@0: EXPORT_C CSupplier* CSupplier::NewLC() sl@0: { sl@0: CSupplier* self = new (ELeave) CSupplier(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CSupplier* CSupplier::NewL() sl@0: { sl@0: CSupplier* self = NewLC(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CSupplier::CSupplier() sl@0: { sl@0: } sl@0: sl@0: CSupplier::~CSupplier() sl@0: { sl@0: delete iAgentResolver; sl@0: delete iOutputDirectory; sl@0: } sl@0: sl@0: void CSupplier::ConstructL() sl@0: { sl@0: iAgentResolver = CAgentResolver::NewL(EFalse); sl@0: iOutputDirectory=HBufC::NewL(0); sl@0: } sl@0: sl@0: EXPORT_C TBool CSupplier::IsImportSupported(const TDesC8& aMimeType) sl@0: { sl@0: TBuf8 mimeLowerCase; sl@0: if(aMimeType.Length() > KMaxDataTypeLength) sl@0: { sl@0: return EFalse; sl@0: } sl@0: sl@0: // Convert supplied mime type to lower case sl@0: mimeLowerCase.Copy(aMimeType); sl@0: mimeLowerCase.LowerCase(); sl@0: sl@0: // Search for the mime type in the agents sl@0: for(TInt i = 0; i < iAgentResolver->SupplierMimeTypes().Count(); i++) sl@0: { sl@0: if(mimeLowerCase.Compare(iAgentResolver->SupplierMimeTypes()[i]) == 0) sl@0: { sl@0: return ETrue; sl@0: } sl@0: } sl@0: return EFalse; sl@0: } sl@0: sl@0: EXPORT_C void CSupplier::PrepareHTTPRequestHeaders(RStringPool& aStringPool, RHTTPHeaders& aRequestHeaders) const sl@0: { sl@0: // Ignore errors from any particular agent because we can't sl@0: // let one agent ruin things for everyone else. sl@0: TInt i = 0; sl@0: TInt err = KErrNone; sl@0: CAgentManager* manager = NULL; sl@0: for(i = 0; i < iAgentResolver->AgentInfoCount(); i++) sl@0: { sl@0: TRAP(err, manager = &iAgentResolver->AgentInfo(i).AgentManagerL()); sl@0: if(err == KErrNone) sl@0: { sl@0: manager->PrepareHTTPRequestHeaders(aStringPool, aRequestHeaders); sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: EXPORT_C void CSupplier::SetOutputDirectoryL(const TDesC &aOutputDirectory) sl@0: { sl@0: HBufC *newOutputDirectory; sl@0: sl@0: // Make sure the path has a backslash at the end sl@0: TInt pos = aOutputDirectory.LocateReverse(TChar(KPathDelimiter)); sl@0: if(pos + 1 != aOutputDirectory.Length()) sl@0: { sl@0: // Append a trailing backslash sl@0: newOutputDirectory=HBufC::NewL(aOutputDirectory.Length()+1); sl@0: newOutputDirectory->Des().Append(aOutputDirectory); sl@0: newOutputDirectory->Des().Append(TChar(KPathDelimiter)); sl@0: } sl@0: else sl@0: { sl@0: newOutputDirectory=aOutputDirectory.AllocL(); sl@0: } sl@0: sl@0: // replace the existing output path sl@0: delete iOutputDirectory; sl@0: iOutputDirectory = newOutputDirectory; sl@0: } sl@0: sl@0: EXPORT_C CImportFile* CSupplier::ImportFileL(const TDesC8& aMimeType, const CMetaDataArray& aImportMetaData, const TDesC& aSuggestedFileName) sl@0: { sl@0: CAgentInfo& agentInfo = iAgentResolver->ResolveSupplierMimeL(aMimeType); sl@0: sl@0: TUid agentUid = agentInfo.Agent().ImplementationUid(); sl@0: sl@0: // Create import object, agent creates output files sl@0: CImportFile* import = CImportFile::NewL (agentUid, aMimeType, aImportMetaData, *iOutputDirectory, aSuggestedFileName); sl@0: return import; sl@0: } sl@0: sl@0: EXPORT_C CImportFile* CSupplier::ImportFileL(const TDesC8& aMimeType, const CMetaDataArray& aImportMetaData) sl@0: { sl@0: // Create import object, client provides output files sl@0: CAgentInfo& agentInfo = iAgentResolver->ResolveSupplierMimeL(aMimeType); sl@0: sl@0: TUid agentUid = agentInfo.Agent().ImplementationUid(); sl@0: sl@0: // Create import object, agent creates output files sl@0: CImportFile* import = CImportFile::NewL (agentUid, aMimeType, aImportMetaData); sl@0: return import; sl@0: } sl@0: sl@0: #ifndef REMOVE_CAF1 sl@0: EXPORT_C CImportFile * CSupplier::ImportFileL (CCafMimeHeader &aMimeHeader, const TDesC &aSuggestedFileName) sl@0: { sl@0: TBuf8 mimeType; sl@0: sl@0: // string constants used to fill in CMetaDataArray sl@0: _LIT8(KContentType, "Content-Type"); sl@0: _LIT8(KContentLength, "Content-Length"); sl@0: _LIT8(KContentId, "Content-Id"); sl@0: _LIT8(KContentTransferEncoding, "Content-Tranfer-Encoding"); sl@0: _LIT8(KBoundary, "Content-Boundary"); sl@0: sl@0: // create new CMetaDataArray to hold the information previously supplied in CCafMimeHeader sl@0: CMetaDataArray *array = CMetaDataArray::NewLC(); sl@0: sl@0: // Copy "standard mime data" to the CMetaDataArray sl@0: if(aMimeHeader.StandardMimeData(EContentType).Length() != 0) sl@0: { sl@0: array->AddL(KContentType(),aMimeHeader.StandardMimeData(EContentType)); sl@0: mimeType.Append(aMimeHeader.StandardMimeData(EContentType)); sl@0: } sl@0: if(aMimeHeader.StandardMimeData(EContentLength).Length() != 0) sl@0: { sl@0: array->AddL(KContentLength(),aMimeHeader.StandardMimeData(EContentLength)); sl@0: } sl@0: if(aMimeHeader.StandardMimeData(EContentLength).Length() != 0) sl@0: { sl@0: array->AddL(KContentLength(),aMimeHeader.StandardMimeData(EContentLength)); sl@0: } sl@0: if(aMimeHeader.StandardMimeData(EContentId).Length() != 0) sl@0: { sl@0: array->AddL(KContentId(),aMimeHeader.StandardMimeData(EContentId)); sl@0: } sl@0: if(aMimeHeader.StandardMimeData(EContentTransferEncoding).Length() != 0) sl@0: { sl@0: array->AddL(KContentTransferEncoding(),aMimeHeader.StandardMimeData(EContentTransferEncoding)); sl@0: } sl@0: if(aMimeHeader.StandardMimeData(EBoundary).Length() != 0) sl@0: { sl@0: array->AddL(KBoundary(),aMimeHeader.StandardMimeData(EBoundary)); sl@0: } sl@0: sl@0: // Add "non-standard" mime fields to CMetaDataArray sl@0: TInt count = aMimeHeader.NonStandardMimeCount(); sl@0: for( TInt i = 0; i < count; i++) sl@0: { sl@0: array->AddL(aMimeHeader.NonStandardMimeField(i), aMimeHeader.NonStandardMimeData(i)); sl@0: } sl@0: sl@0: // Create new CImportFile object sl@0: CImportFile *importFile = ImportFileL(mimeType, *array, aSuggestedFileName); sl@0: CleanupStack::PopAndDestroy(array); sl@0: return importFile; sl@0: } sl@0: sl@0: #endif // REMOVE_CAF1 sl@0: sl@0: