diff -r 000000000000 -r 5752a19fdefe imaging/imagingfws/src/ImageResolverAPI.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imaging/imagingfws/src/ImageResolverAPI.cpp Wed Aug 25 12:29:52 2010 +0300 @@ -0,0 +1,586 @@ +// Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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 +#include "ImageResolverAPI.h" +#include "../inc_pub/icl/ICL_PropertyUIDS.h" + +const TInt KMaxDescriptorLength = 128; // The biggest descriptor that will be + // built when internalizing the object + +/* + * + * Default constructor + * + */ +CCustomMatchData::CCustomMatchData() + { + } + +/* + * + * Default destructor + * + */ +CCustomMatchData::~CCustomMatchData() + { + delete iMatchString; + delete iFileSuffix; + iMatchReqUidsArray.Close(); + iOptionsUidsArray.Close(); + } + +/* + * + * Standard, safe constructor that leaves nothing on the cleanup stack + * + * @return "CCustomMatchData*" + * A pointer to the newly constructed match data object + * + */ +CCustomMatchData* CCustomMatchData::NewL() + { + CCustomMatchData* self = CCustomMatchData::NewLC(); + CleanupStack::Pop(self); + return self; + } +/* + * + * Standard, safe constructor that leaves nothing on the cleanup stack + * + * @param "const TDesC8& aPackage" + * A reference to a descriptor created using PackL() + * used to initialize the object. + * @return "CCustomMatchData*" + * A pointer to the newly constructed match data object + * + */ +CCustomMatchData* CCustomMatchData::NewL(const TDesC8& aPackage) + { + CCustomMatchData* self = CCustomMatchData::NewLC(aPackage); + CleanupStack::Pop(self); + return self; + } + +/* + * + * Standard, safe constructor that leaves the pointer to the newly constructed + * match data object on the cleanup stack + * + * @return "CCustomMatchData*" + * A pointer to the newly constructed match data object + * + */ +CCustomMatchData* CCustomMatchData::NewLC() + { + CCustomMatchData* self = new(ELeave) CCustomMatchData; + CleanupStack::PushL(self); + return self; + } + +/* + * + * Standard, safe constructor that leaves the pointer to the newly constructed + * match data object on the cleanup stack + * + * @param "const TDesC8& aPackage" + * A reference to a descriptor created using PackL() + * used to initialize the object. + * @return "CCustomMatchData*" + * A pointer to the newly constructed match data object + * + */ +CCustomMatchData* CCustomMatchData::NewLC(const TDesC8& aPackage) + { + CCustomMatchData* self = new(ELeave) CCustomMatchData; + CleanupStack::PushL(self); + self->ConstructL(aPackage); + return self; + } + +void CCustomMatchData::ConstructL(const TDesC8& aPackage) + { + UnPackL(aPackage); + } + +/* + * + * Externalize the object to a stream. + * All the member variables will be written to the stream, and if no MatchString + * is provided a null descriptor is used. The stream must be able to accomodate + * the streaming operation or it will leave with KErrOverFlow. + * + * @param "RWriteStream& aStream" + * A reference to the stream to which the member variables will + * be written. + * + */ +void CCustomMatchData::ExternalizeL(RWriteStream& aStream) const + { + aStream.WriteInt32L(iMatchType); + aStream.WriteInt32L(iBaseType.iUid); + aStream.WriteInt32L(iSubType.iUid); + aStream.WriteInt32L(iImplementationType.iUid); + aStream.WriteInt32L(iMatchReqUidsArray.Count()); + + for (TInt index = 0; index < iMatchReqUidsArray.Count(); index++) + { + aStream.WriteInt32L((iMatchReqUidsArray[index]).iUid); + } + + // if Match String is not used send empty descriptor + if (iMatchString) + aStream << *iMatchString; + else + aStream << KNullDesC8; + + // if File Suffix is not used send empty descriptor + if (iFileSuffix) + aStream << *iFileSuffix; + else + aStream << KNullDesC8; + + aStream.WriteInt32L(iExtensionOptions); + + aStream.WriteInt32L(iOptionsUidsArray.Count()); + + for (TInt index = 0; index < iOptionsUidsArray.Count(); index++) + { + aStream.WriteInt32L((iOptionsUidsArray[index]).iUid); + } + + aStream.WriteInt32L(iOptions); + } +/* + * + * Internalize the object from a stream. + * All the member variables will be read from the streamed. + * If there is not enougth data in the stream or it will + * leave with KErrEof. + * + * @param "RReadStream& aStream" + * A reference to the stream from which data will be read to + * setup the member variables. + * + */ +void CCustomMatchData::InternalizeL(RReadStream& aStream) + { + iMatchType = STATIC_CAST(TResolverMatchType, aStream.ReadInt32L()); + iBaseType.iUid = aStream.ReadInt32L(); + iSubType.iUid = aStream.ReadInt32L(); + iImplementationType.iUid = aStream.ReadInt32L(); + + TInt matchReqUidsCount = aStream.ReadInt32L(); + if (matchReqUidsCount > 0) + { + iMatchReqUidsArray.Reset(); + for (TInt index = 0; index < matchReqUidsCount; index++) + { + User::LeaveIfError(iMatchReqUidsArray.Append(TUid::Uid(aStream.ReadInt32L()))); + } + } + + delete iMatchString; iMatchString = NULL; + iMatchString = HBufC8::NewL(aStream, KMaxDescriptorLength); //KErrOverflow + + delete iFileSuffix; iFileSuffix = NULL; + iFileSuffix = HBufC::NewL(aStream, KMaxDescriptorLength); //KErrOverflow + + iExtensionOptions = aStream.ReadInt32L(); + + TInt optionsUidsCount = aStream.ReadInt32L(); + if (optionsUidsCount > 0) + { + iOptionsUidsArray.Reset(); + for (TInt index = 0; index < optionsUidsCount; index++) + { + User::LeaveIfError(iOptionsUidsArray.Append(TUid::Uid(aStream.ReadInt32L()))); + } + } + + iOptions = aStream.ReadInt32L(); + } + +/* + * + * Set a string to match against. + * + * @param "const TDesC8& aMIMEType" + * A reference to a descriptor to match against. + * + */ +void CCustomMatchData::SetMatchStringL(const TDesC8& aMIMEType) + { + delete iMatchString; iMatchString = NULL; + iMatchString = aMIMEType.AllocL(); + } + +/* + * + * Sets the match type, base type and sub type to match against + * + * @param "const TResolverMatchType& aMatchType" + * The type of match requested. + * @param "const TUid& aBaseType" + * The base type to match against + * @param "const TUid& aSubType" + * The sub type to match against + * + */ +void CCustomMatchData::SetTypes(const TResolverMatchType& aMatchType, const TUid& aBaseType, const TUid& aSubType) + { + iMatchType = aMatchType; + iBaseType = aBaseType; + iSubType = aSubType; + } + +/* + * + * Sets the match type to match against + * + * @param "const TResolverMatchType& aMatchType" + * The type of match requested. + * + */ +void CCustomMatchData::SetMatchType(const TResolverMatchType& aMatchType) + { + iMatchType = aMatchType; + } + +/* + * + * Sets the base type to match against + * + * @param "const TUid& aBaseType" + * The base type to match against + * + */ +void CCustomMatchData::SetBaseType(const TUid& aBaseType) + { + iBaseType = aBaseType; + } + +/* + * + * Sets the sub type to match against + * + * @param "const TUid& aSubType" + * The sub type to match against + * + */ +void CCustomMatchData::SetSubType(const TUid& aSubType) + { + iSubType = aSubType; + } + +/* + * + * Sets the implementation type to match against + * + * @param "const TUid& aImplementationType" + * The implementation uid of a specific codec to match against + * + */ +void CCustomMatchData::SetImplementationType(const TUid& aImplementationType) + { + iImplementationType = aImplementationType; + } +/* + * + * Set a file extension to match against. + * + * @param "const TDesC8& aFileSuffix" + * A reference to a file suffix to match against. + * + */ +void CCustomMatchData::SetFileSuffixL(const TDesC& aFileSuffix) + { + delete iFileSuffix; iFileSuffix = NULL; + iFileSuffix = aFileSuffix.AllocL(); + } + +/* + * + * Retrieves the match type, base type and sub type to match against + * + * @param "TResolverMatchType& aMatchType" + * The type of match requested. + * @param "TUid& aBaseType" + * The base type to match against + * @param "TUid& aSubType" + * The sub type to match against + * + */ +void CCustomMatchData::GetTypes(TResolverMatchType& aMatchType, TUid& aBaseType, TUid& aSubType) const + { + aMatchType = iMatchType; + aBaseType = iBaseType; + aSubType = iSubType; + } +/* + * + * Retrieves the match type to match against + * + * @return "TResolverMatchType" + * The type of match requested. + * + */ +TResolverMatchType CCustomMatchData::MatchType() const + { + return iMatchType; + } + +/* + * + * Retrieves the base type to match against + * + * @return "TUid" + * The base type to match against + * + */ +TUid CCustomMatchData::BaseType() const + { + return iBaseType; + } + +/* + * + * Retrieves the sub type to match against + * + * @return "TUid" + * The sub type to match against + * + */ +TUid CCustomMatchData::SubType() const + { + return iSubType; + } +/* + * + * Retrieves the implementation type to match against + * + * @return "TUid" + * The implementation of a specific codec to match against + * + */ + +TUid CCustomMatchData::ImplementationType() const + { + return iImplementationType; + } + +/* + * + * Retrieves the string to match against. If no string is set + * a null descriptor is returned. + * + * @return "TPtrC8" + * The string to match against + * + */ +const TPtrC8 CCustomMatchData::MatchString() const + { + TPtrC8 result; + + if(iMatchString) + result.Set(*iMatchString); + else + result.Set(KNullDesC8); + + return result; + } + +/* + * + * Retrieves the file extension to match against. If no suffix is set + * a null descriptor is returned. + * + * @return "TPtrC8" + * The file suffix to match against + * + */ +const TPtrC CCustomMatchData::FileSuffix() const + { + TPtrC result; + + if(iFileSuffix) + result.Set(*iFileSuffix); + else + result.Set(KNullDesC); + + return result; + } + +/* Used to package up the object into a descriptor so + * that it can be placed in the DataType descriptor of a + * TEComResolverParams before being passed across the client + * server boundary within ECom and handed to the custom resolver. + * + * @return "const HBufC8*" + * A pointer to a desctriptor with the object packed in it. + * The object does not take responsibility for the pointer + * and the external code must ensure that the pointer is deleted. + * The pointer is left on the cleanupstack. + * + */ +HBufC8* CCustomMatchData::NewPackLC() const + { + //Calculate the size necessary size for the descriptor to pack the object + TInt size = 0; + if(iMatchString) + size = iMatchString->Size(); + if(iFileSuffix) + size += iFileSuffix->Size(); + + size += iMatchReqUidsArray.Count() * sizeof(TUid); + size += iOptionsUidsArray.Count() * sizeof(TUid); + + size += 9 * sizeof(TInt32); // The size necessary for + // iMatchType + // iBaseType + // iSubType + // iInterfaceUid + // iMatchReqUidsArray.Count() + // and the size of the descriptor (Max TInt32) + // iExtensionOptions + // iOptionsUidsArray.Count() + // iOptions + HBufC8* package = HBufC8::NewLC(size); + TPtr8 packageDes = package->Des(); + + RDesWriteStream stream(packageDes); + ExternalizeL(stream); + stream.Close(); + + return package; + } + +/* Used to unpack a descriptor packed using PackL() and set the + * member variables to the data contained in the descriptor. The descriptor + * is passed to the custom resolver by ECom and can be retrieved from the DataType + * of TEComResolverParams. + * + * @param "const TDes8& aPackage" + * A reference to a desctriptor created using PackL() to which + * the member variables will be set. + * + */ +void CCustomMatchData::UnPackL(const TDesC8& aPackage) + { + RDesReadStream stream(aPackage); + InternalizeL(stream); + stream.Close(); + } + +/* Sets the array of required uids by copying all the elements of the array in parameter, + * so the custom match data doesn't take ownership of the array specified. + * + * @param "const RUidDataArray& aMatchReqUidsArray" + * The new required uids array. + * + */ +void CCustomMatchData::SetMatchReqUidsL(const RUidDataArray& aMatchReqUidsArray) + { + iMatchReqUidsArray.Reset(); + for(TInt index = 0 ; index < aMatchReqUidsArray.Count() ; index++) + { + User::LeaveIfError(iMatchReqUidsArray.Append(aMatchReqUidsArray[index])); + } + } + +/* Gets the array of required uids by copying all the elements of the member data array + * in the array in parameter. + * + * @param "RUidDataArray& aMatchReqUidsArray" + * The new required uids array to copy data to. + * + */ +void CCustomMatchData::GetMatchReqUidsL(RUidDataArray& aMatchReqUidsArray) + { + aMatchReqUidsArray.Reset(); + for(TInt index = 0 ; index < iMatchReqUidsArray.Count() ; index++) + { + User::LeaveIfError(aMatchReqUidsArray.Append(iMatchReqUidsArray[index])); + } + } + +/* Gets the array of required options uids by copying all the elements of the member data array + * in the array in parameter. + * + * @param "RUidDataArray& aOptionsUidsArray" + * The new required options uids array to copy data to. + * + */ +void CCustomMatchData::GetOptionsUidsL(RUidDataArray& aOptionsUidsArray) + { + aOptionsUidsArray.Reset(); + for(TInt index = 0 ; index < iOptionsUidsArray.Count() ; index++) + { + User::LeaveIfError(aOptionsUidsArray.Append(iOptionsUidsArray[index])); + } + } + +/* + * Request that plugins support all extension interfaces interoperably. + * + * @param TInt aExtensionBits + * Set of extensions (@see CImageDecoder::TOptions or @see CImageEncoder::TOptions) + */ +void CCustomMatchData::SetExtensionOptions(TUint aExtensionBits) + { + iExtensionOptions = (aExtensionBits & KIclExtensionOptionsMask); + } + +/* + * Request that plugins support specific options. + * + * @param TInt aOptions + * Set of CImageDecoder options (@see CImageDecoder::TOptions) + */ +void CCustomMatchData::SetOptions(CImageDecoder::TOptions aOptions) + { + if ((aOptions & CImageDecoder::EOptionAutoRotate) != 0) + { + iOptionsUidsArray.Append(KUidJPGAutoRotateSupport); + } + if((aOptions & CImageDecoder::EOptionOptimisedPartialImageDecoding) != 0) + { + iOptionsUidsArray.Append(KUidJPGOptimisedPartialDecodingSupport); + } + iOptions = aOptions; + } + +/* +* Get list of all options required +* +* @return TUint +* Set of options to match (@see CImagDecoder::TOptions) +*/ +TUint CCustomMatchData::Options() + { + return iOptions; + } + +/* + * Get list of all extension interfaces required. + * + * @return TInt + * Set of extensions to match (@see CImageDecoder::TOptions or @see CImageEncoder::TOptions) + * + */ +TUint CCustomMatchData::ExtensionOptions() + { + return iExtensionOptions; + }