diff -r 000000000000 -r 8e480a14352b messagingfw/biomsgfw/BIFUSRC/BIF.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/biomsgfw/BIFUSRC/BIF.CPP Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,622 @@ +// Copyright (c) 1997-2009 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: +// BIF.CPP +// +#include "BIF.H" + +#include // CFileStore +#include +#include + +#include "cbifentry.h" +#include "BIFUPAN.H" + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "bifbase.h" +#endif + +// +// Defines and constants +enum TBioInfoFileVersion // The order here is important, only ever APPEND to the list + { + EBifVersionOriginal=1, + EBifVersionAddedAppCtrl, + EBifVersionAddedFileExtension + }; + +const TInt KIntDefaultArrayGranularity=4; + +/** 2nd UID of BIF file stores. */ +const TUid KUidBioInfoFile={0x10005233}; // unicode Uid, used as 2nd Uid of file store + +/* + * CBioInfoFile + */ + +CBioInfoFile::CBioInfoFile(RFs& aFs) +: iFs(aFs) + { + } + +void CBioInfoFile::ConstructL() + { + iIconZoomLevelArray=new(ELeave) CArrayFixFlat(KIntDefaultArrayGranularity); + iIdHeaderArray=new(ELeave) CArrayPtrFlat(KIntDefaultArrayGranularity); + } + +CBioInfoFile::~CBioInfoFile() + { + delete iMessageParserName; + delete iMessageAppCtrlName; + delete iDescription; + delete iFileExtension; + delete iIconsFilename; + + if(iIdHeaderArray) + { + iIdHeaderArray->ResetAndDestroy(); + delete iIdHeaderArray; + } + + delete iIconZoomLevelArray; + } + +/* + * CIdHeader + */ + +CBioInfoFile::CIdHeader::CIdHeader() + { + } + +CBioInfoFile::CIdHeader::~CIdHeader() + { + if (iText.IsPtr()) + delete iText.AsPtr(); + } + +void CBioInfoFile::CIdHeader::InternalizeL(RReadStream& aStream) + { + iType=(TBioMsgIdType)aStream.ReadInt16L(); + iConfidence=(CApaDataRecognizerType::TRecognitionConfidence)aStream.ReadInt32L(); + aStream>>iText; // is a TSwizzle + iPort=(TUint16)aStream.ReadUint16L(); + iCharacterSet.iUid=(TInt32)aStream.ReadInt32L(); + iGeneralIdData=(TInt16)aStream.ReadInt16L(); + } + +void CBioInfoFile::CIdHeader::ExternalizeL(RWriteStream& aStream) const + { + aStream.WriteInt16L(iType); + aStream.WriteInt32L(iConfidence); + aStream<ConstructL(aFileName,aMsgTypeUid); + return self; + } + +/** Allocates and constructs a new BIF reader object. + +It loads the specified BIF file. + +@param aFs +Connected file handle + +@param aFileName +BIF file name + +@param aMsgTypeUid +Optional message type UID. If this is specified, and the file does not does not +describe this type, then it leaves with KErrCorrupt. + +@return +New BIF reader object +*/ +EXPORT_C CBioInfoFileReader* CBioInfoFileReader::NewL(RFs& aFs,const TDesC& aFileName,TUid aMsgTypeUid) + { + CBioInfoFileReader* self=CBioInfoFileReader::NewLC(aFs,aFileName,aMsgTypeUid); + CleanupStack::Pop(self); + return self; + } + +CBioInfoFileReader::CBioInfoFileReader(RFs& aFs) +: CBioInfoFile(aFs) + { + } + +void CBioInfoFileReader::ConstructL(const TDesC& aFileName,TUid aMsgTypeUid) + { + CBioInfoFile::ConstructL(); + + iFileName = aFileName.AllocL(); + TEntry entry; + User::LeaveIfError(iFs.Entry(aFileName, entry)); + + iEntry = CBifEntry::NewL(entry); + + // Load the data + if( IsResFileL() ) + { + LoadResourceL(aMsgTypeUid); + } + else if( IsDatFile(entry.iType) ) + { + LoadDataL(aMsgTypeUid); + } + else + { + User::Leave(KErrCorrupt); + } + } + +TBool CBioInfoFileReader::IsDatFile(const TUidType& aUidType) const + { + if( aUidType[0] == KDirectFileStoreLayoutUid && aUidType[1] == KUidBioInfoFile) + { + return ETrue; + } + else + { + return EFalse; + } + } + +void CBioInfoFileReader::LoadDataL(TUid aMsgTypeUid) + { + // Open file and validate its Uids (if Uid supplied as argument) + CFileStore* store = CFileStore::OpenLC(iFs, *iFileName, EFileRead|EFileShareReadersOnly); + + const TUidType& type=store->Type(); + if (aMsgTypeUid!=KNullUid && type[2]!=aMsgTypeUid) + { + User::Leave(KErrCorrupt); // it's the wrong file!!!!! + } + + // Read from file into our data members + RStoreReadStream inStream; + inStream.OpenLC(*store,store->Root()); + InternalizeL(inStream); + + CleanupStack::PopAndDestroy(2, store); // inStream, store + } + +TBool CBioInfoFileReader::IsResFileL() const + { + // Check the extension to see if it's a resource file + TParse parse; + User::LeaveIfError(parse.Set(*iFileName, NULL, NULL)); + + // If first alpha character of extension is 'r' assume we're dealing with a resource file + TPtrC ext(parse.Ext()); + return ext.Length() > 1 && TCharF(ext[1]) == TCharF('r'); + } + + +void CBioInfoFileReader::LoadResourceL(TUid aMsgTypeUid) + { + // Open the resource file + RResourceFile file; + file.OpenL(iFs, *iFileName); + CleanupClosePushL(file); + + // Read the resource + HBufC8* resBuf = file.AllocReadLC(1); + + // interpret the resource buffer + TResourceReader reader; + reader.SetBuffer(resBuf); + + // Read message type uid, and check it's valid + iMessageTypeUid = TUid::Uid(reader.ReadInt32()); + if (aMsgTypeUid != KNullUid && iMessageTypeUid != aMsgTypeUid) + { + User::Leave(KErrCorrupt); + } + + // Read message parser name + delete iMessageParserName; + iMessageParserName = NULL; + iMessageParserName = reader.ReadHBufCL(); + // Read message app uid + iMessageAppUid = TUid::Uid(reader.ReadInt32()); + + // Read message appctrl uid + delete iMessageAppCtrlName; + iMessageAppCtrlName = NULL; + iMessageAppCtrlName = reader.ReadHBufCL(); + + // Read description + delete iDescription; + iDescription = NULL; + iDescription = reader.ReadHBufCL(); + + // Read file extension + delete iFileExtension; + iFileExtension = NULL; + iFileExtension = reader.ReadHBufCL(); + + // Read general data[1..3] + iGeneralData1 = (TInt16)reader.ReadInt16(); + iGeneralData2 = (TInt16)reader.ReadInt16(); + iGeneralData3 = (TInt16)reader.ReadInt16(); + + // Read in icon stuff + delete iIconsFilename; + iIconsFilename = NULL; + iIconsFilename = reader.ReadHBufCL(); + + // Read in zoom levels + TInt icons = reader.ReadInt16(); + while(icons--) + { + TIconZoomLevel zoom; + zoom.iZoomLevel = (TInt16)reader.ReadInt16(); + iIconZoomLevelArray->AppendL(zoom); + } + + // Read in IDs + TInt ids = reader.ReadInt16(); + while( ids-- > 0 ) + { + CIdHeader* header = new(ELeave)CIdHeader; + CleanupStack::PushL(header); + + header->iType = (TBioMsgIdType)reader.ReadInt16(); + header->iConfidence = (CApaDataRecognizerType::TRecognitionConfidence)reader.ReadInt32(); + header->iCharacterSet = TUid::Uid(reader.ReadInt32()); + + // Don't ask me why it's like this! + TPtrC text(reader.ReadTPtrC()); + header->iText = HBufC::NewL(text.Length()); + (*header->iText) = text; + + header->iPort = (TInt16)reader.ReadInt16(); + header->iGeneralIdData = (TInt16)reader.ReadInt16(); + + iIdHeaderArray->AppendL(header); + CleanupStack::Pop(header); + } + + CleanupStack::PopAndDestroy(2, &file); // resBuf, file + } + +/** +Destructor. +*/ +EXPORT_C CBioInfoFileReader::~CBioInfoFileReader() + { + delete iFileName; + delete iEntry; + } + + +void CBioInfoFileReader::InternalizeL(RReadStream& aStream) + { + // + // Get version number + const TInt32 version(aStream.ReadInt32L()); + __ASSERT_DEBUG(version==EBifVersionOriginal || + version==EBifVersionAddedAppCtrl || + version==EBifVersionAddedFileExtension, + Panic(EBifUnknownVersion)); + + // Get data for BIF version EBifVersionOriginal + iMessageTypeUid.iUid=(TInt32)aStream.ReadInt32L(); + + delete iMessageParserName; + iMessageParserName = NULL; + iMessageParserName = HBufC::NewL(aStream, KMaxFileName); + + iMessageAppUid.iUid=(TInt32)aStream.ReadInt32L(); + + delete iDescription; + iDescription = NULL; + iDescription = HBufC::NewL(aStream, KMaxFileName); + + iGeneralData1=(TInt16)aStream.ReadInt16L(); + iGeneralData2=(TInt16)aStream.ReadInt16L(); + iGeneralData3=(TInt16)aStream.ReadInt16L(); + + delete iIconsFilename; + iIconsFilename = NULL; + iIconsFilename = HBufC::NewL(aStream, KMaxFileName); + + aStream>>*iIconZoomLevelArray; + + const TInt32 numHeaders=(TInt32)aStream.ReadInt32L(); + for (TInt32 cc=0; cc>*header; + iIdHeaderArray->AppendL(header); + CleanupStack::Pop(header); + } + + if(version==EBifVersionOriginal) + return; + + // Get data for BIF version EBifVersionAddedAppCtrl + delete iMessageAppCtrlName; + iMessageAppCtrlName = NULL; + iMessageAppCtrlName = HBufC::NewL(aStream, KMaxFileName); + if(version==EBifVersionAddedAppCtrl) + return; + + delete iFileExtension; + iFileExtension = NULL; + iFileExtension = HBufC::NewL(aStream, KMaxFileName); + if(version==EBifVersionAddedFileExtension) + return; + + // Put code here for reading data from newer versions of BIF + } + +/** Gets the BIF's message type UID setting. + +@return +Message type UID +*/ +EXPORT_C TUid CBioInfoFileReader::MessageTypeUid() const + { + return iMessageTypeUid; + } + +/** Gets the BIF's message parser name. + +@return +BIF's message parser name +*/ +EXPORT_C const TPtrC CBioInfoFileReader::MessageParserName() const + { + return (iMessageParserName!=NULL) ? iMessageParserName->Des() : TPtrC(); + } + + +/** Gets the BIF's application UID setting. + +@return +Application UID setting +*/ +EXPORT_C TUid CBioInfoFileReader::MessageAppUid() const + { + return iMessageAppUid; + } + +/** Deprecated method. + +Use CBioInfoFileReader::MessageAppCtrlName + +@see CBioInfoFileReader::MessageAppCtrlName + +@return +Invalid return. + +@deprecated +*/ +EXPORT_C TUid CBioInfoFileReader::MessageAppCtrlUid() const + { + User::Invariant(); + return TUid(); + } + +/** Gets the BIF's control name. + +@return +Control name +*/ +EXPORT_C const TPtrC CBioInfoFileReader::MessageAppCtrlName() const + { + return (iMessageAppCtrlName != NULL) ? iMessageAppCtrlName->Des() : TPtrC(); + } + + +/** Gets the BIF's general data 1 setting. + +@return +General data 1 setting +*/ +EXPORT_C TInt16 CBioInfoFileReader::GeneralData1() const + { + return iGeneralData1; + } + +/** Gets the BIF's general data 2 setting. + +@return +General data 2 setting +*/ +EXPORT_C TInt16 CBioInfoFileReader::GeneralData2() const + { + return iGeneralData2; + } + +/** Gets the BIF's general data 3 setting. + +@return +General data 3 setting +*/ +EXPORT_C TInt16 CBioInfoFileReader::GeneralData3() const + { + return iGeneralData3; + } + +/** Gets the BIF's description setting. + +@return +BIF's description setting +*/ +EXPORT_C const TPtrC CBioInfoFileReader::Description() const + { + return (iDescription!=NULL) ? iDescription->Des() : TPtrC(); + } + +// +// Data getter +EXPORT_C const TPtrC CBioInfoFileReader::FileExtension() const +/** Gets the BIF's file extension setting. + +@return BIF's file extension setting */ + { + return (iFileExtension!=NULL) ? iFileExtension->Des() : TPtrC(); + } + +/** Gets the BIF's icons filename setting. + +@return +BIF's icons filename setting +*/ +EXPORT_C const TPtrC CBioInfoFileReader::IconsFilename() const + { + return (iIconsFilename!=NULL) ? iIconsFilename->Des() : TPtrC(); + } + +/** Gets the BIF's icon zoom levels setting. + +The array of icon zoom level settings is left of the cleanup stack and ownership +is returned to the caller. + +@return +Icon zoom levels setting +*/ +EXPORT_C const CArrayFixFlat* CBioInfoFileReader::ZoomLevelsLC() const + { + CArrayFixFlat* array=new(ELeave) CArrayFixFlat(KIntDefaultArrayGranularity); + CleanupStack::PushL(array); + + const TInt count=iIconZoomLevelArray->Count(); + + for(TInt i=0;iAppendL((*iIconZoomLevelArray)[i].iZoomLevel); + } + + return array; + } + +/** Gets the BIF's number of icon zoom levels. + +@return +Number of icon zoom levels +*/ +EXPORT_C TInt CBioInfoFileReader::ZoomLevelsCount() const + { + return iIconZoomLevelArray->Count(); + } + +/** Gets the BIF's ID array. + +The of IDs is left of the cleanup stack and ownership is returned to the caller. + +@return +ID array +*/ +EXPORT_C const CArrayFixFlat* CBioInfoFileReader::IdsLC() const + { + CArrayFixFlat* array=new(ELeave) CArrayFixFlat(KIntDefaultArrayGranularity); + CleanupStack::PushL(array); + + TBioMsgId id; + const TInt count=iIdHeaderArray->Count(); + + for(TInt i=0;iAt(i); + + // Read in swizzle(s) of Id + if (!header->iText.IsPtr()) + { + CFileStore* store = CFileStore::OpenLC(iFs,*iFileName,EFileRead|EFileShareReadersOnly); + RStoreReadStream inStream; + TStreamId streamId=header->iText.AsId(); + inStream.OpenLC(*store,streamId); + + TBioMsgIdText idText; + inStream>>idText; + header->iText = idText.AllocL(); + + CleanupStack::PopAndDestroy(2, store); // inStream, store + } + + // Fill object, ready for appending to array + id.iType=header->iType; + id.iConfidence=header->iConfidence; + id.iText=*(header->iText); + id.iPort=header->iPort; + id.iCharacterSet=header->iCharacterSet; + id.iGeneralIdData=header->iGeneralIdData; + + // Append object to array + array->AppendL(id); + } + return array; + } + +/** BIF entry. + +@return +BIF entry + +@internalTechnology +@released +*/ +EXPORT_C const CBifEntry& CBioInfoFileReader::BifEntry() const + { + return *iEntry; + }