--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/featuremgmt/featureregistry/src/inc/featregcmn.h Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,173 @@
+// Copyright (c) 2005-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:
+// Methods, data structures and constants common to Feature Registry Setup EXE
+// and Public API DLL, including private panic method.
+//
+//
+
+#ifndef FEATREGCMN_H
+#define FEATREGCMN_H
+
+#include <e32std.h>
+#include <e32property.h>
+#include <f32file.h>
+#include <featregpan.h>
+
+_LIT(KFeatureConfigFile,"_:\\private\\102744CA\\featreg.cfg");
+typedef TBuf<32> TConfigFileName;
+
+_LIT(KFeatRegSetupExe, "z:\\sys\\bin\\featregsetup.exe");
+
+//match pattern when searching for the file
+//note that for core image the file will be featreg.cfg
+//and for other rofs section it will be in the format featreg.cfg[x-y]
+//whwere x is the rom image id and y is currently set to 0(unused)
+_LIT(KFeatregMatchPattern,"featreg.cfg*");
+_LIT(KFeatregRomPrivatePath,"z:\\private\\102744CA\\");
+
+// feature registry data is currently kept in an RProperty with category and key:
+const TUid KFeaturePropCat = { 0x102744CA };
+const TUint KFeaturePropKey = 0;
+// if property with KFeaturePropCat and following key is defined, featregsetup.exe
+// looks for config info in its c: private data cage instead of z: (for tests only):
+const TUint KFeatRegConfigTestKey = 1;
+
+/**
+This function will try to find and open all the "featreg.cfg" files from the path specified
+process them in the order of increasing rom image id before copying the aggregate content
+into the buffer aBuf
+*/
+GLREF_C TInt ReadMultipleFeatureFileToBuf(RFs& aFs,const TDesC& aPath,RBuf8& aBuf);
+
+/**
+ * First block of data in feature config file and resulting binary property:
+ * says how many individual feature entries and "default-supported" ranges follow.
+ * Config data is invalid if header is not present, or it does not predict size
+ * of feature config file/property.
+ */
+class TFeatureHeader
+ {
+public:
+ TUint32 iTypePrefix; // must be equal to validTypePrefix
+ TUint32 iVersionNumber; // zero is the only valid version number
+ TUint32 iFeatureEntryCount;
+ TUint32 iFeatureRangeCount;
+
+ inline TUint32 PredictedPropertySize() const;
+ inline void SetInvalid();
+ inline TBool IsInvalid() const;
+ inline TBool IsInvalidOrBadSize(TUint32 aActualPropertySize) const;
+ };
+
+// First 4 bytes of config file: ASCII f-e-a-t. Stored in TUint32 in little endian, i.e. reverse order
+const TUint32 validTypePrefix = 0x74616566;
+const TUint32 invalidTypePrefix = 0; // must not equal validTypePrefix
+
+/**
+ * Second block of data in feature config file and resulting binary property:
+ * header.iFeatureEntryCount * TFeatureEntry
+ * If a feature UID is listed, bits in its status word control the following:
+ * - bit 0 (0x1): if set, feature is present, if not, feature is not present
+ * - bit 1 (0x2): if set, feature is upgradable in this ROM configuration
+ * - bits 2-31: reserved for future use & must be zero
+ * Config data is invalid if these are not listed from lowest to highest UID with
+ * no repeats.
+ */
+struct TFeatureEntry
+ {
+ TUint32 iUid;
+ TUint32 iInfo;
+ };
+
+/**
+ * Third/last block of data in feature config file and resulting binary property:
+ * header.iFeatureRangeCount * TFeatureRange
+ * Features with UIDs in these "default-supported" ranges are supported unless
+ * they are individually listed in the "entry" block as not supported.
+ * Config data is invalid if any ranges have iLowUid higher than iHighUid.
+ */
+struct TFeatureRange
+ {
+ TUint32 iLowUid;
+ TUint32 iHighUid;
+ };
+
+GLREF_C void Panic(TFeatRegPanic aReason);
+
+
+// ------------------------------------------------------------------------- //
+// Methods, data structures and constants common to Feature Registry Setup EXE
+// and Public API DLL, including private panic method.
+// ------------------------------------------------------------------------- //
+
+
+/**
+Construct config file path for the system drive.
+@param aFileName On completion will contain the full path and filename.
+*/
+inline void GetSystemDrivePath(TConfigFileName& aFileName)
+ {
+ aFileName.Copy(KFeatureConfigFile);
+ aFileName[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());
+ }
+
+
+
+/** returns the total size of the property that is predicted by the counts
+ in the header. Confirm !IsInvalid() before using otherwise numerical
+ overflow may occur */
+inline TUint32 TFeatureHeader::PredictedPropertySize() const
+ {
+ return sizeof(TFeatureHeader) +
+ + iFeatureEntryCount * sizeof(TFeatureEntry)
+ + iFeatureRangeCount * sizeof(TFeatureRange);
+ }
+
+/** sets invalid values in the header that API will report as corrupt regardless
+ of what data is provided with it */
+inline void TFeatureHeader::SetInvalid()
+ {
+ iTypePrefix = invalidTypePrefix;
+ iVersionNumber = 1; // i.e. not zero
+ // note total size of feature property may not exceed these constants,
+ // so they are definitely invalid
+ iFeatureEntryCount = RProperty::KMaxLargePropertySize + 1;
+ iFeatureRangeCount = RProperty::KMaxLargePropertySize + 1;
+ }
+
+/** asks whether the header contains invalid values irrespective of data size
+ See also IsInvalidOrBadSize() below */
+inline TBool TFeatureHeader::IsInvalid() const
+ {
+ // pretty safe to assume RProperty::KMaxLargePropertySize will not
+ // ever be large enough to cause overflow problems
+ return (iTypePrefix != validTypePrefix)
+ || (iVersionNumber != 0)
+ || (iFeatureEntryCount > RProperty::KMaxLargePropertySize)
+ || (iFeatureRangeCount > RProperty::KMaxLargePropertySize)
+ || (PredictedPropertySize() > RProperty::KMaxLargePropertySize);
+ }
+
+/** asks whether aActualPropertySize is in the valid range, header is invalid or
+ mismatch between property size predicted by the header and that supplied */
+inline TBool TFeatureHeader::IsInvalidOrBadSize(TUint32 aActualPropertySize) const
+ {
+ return (aActualPropertySize < sizeof(TFeatureHeader))
+ || (aActualPropertySize > RProperty::KMaxLargePropertySize)
+ || IsInvalid()
+ || (PredictedPropertySize() != aActualPropertySize);
+ }
+
+
+#endif