#define SCHEMA_VERSION_NUMBER       1740

#define STRINGGUIDLEN 37
#define STRINGGUIDRDNLEN 37+3
typedef WCHAR STRINGGUID [STRINGGUIDLEN];
typedef WCHAR STRINGGUIDRDN [STRINGGUIDRDNLEN];

typedef FILETIME CSUSN;

HRESULT
PackString2Variant(
    LPWSTR lpszData,
    VARIANT * pvData
    );

HRESULT
PackDWORD2Variant(
    DWORD dwData,
    VARIANT * pvData
    );

HRESULT PackDWORDArray2Variant(
    DWORD    * pdwData,
    ULONG      cdword,
    VARIANT  * pvData
    );

HRESULT
PackBOOL2Variant(
    BOOL fData,
    VARIANT * pvData
    );

HRESULT
PackGuid2Variant(
    GUID      guidData,
    VARIANT * pvData
    );

HRESULT
UnpackGuidFromVariant(
    VARIANT   varGet,
    GUID      *pguidPropVal
    );

HRESULT PackGuidArray2Variant(
    GUID    * guidData,
    ULONG     cguids,
    VARIANT * pvData
    );

HRESULT
BuildVarArrayStr(
    LPWSTR *lppPathNames,
    DWORD  dwPathNames,
    VARIANT * pVar
    );

HRESULT GetFromVariant(VARIANT *pVar,
                DWORD *pCount,          // In, Out
                LPOLESTR  *rpgList);

int  StringFromGUID(REFGUID rguid, LPWSTR lptsz);

int  RdnFromGUID(REFGUID rguid, LPWSTR lptsz);

void GUIDFromString(LPWSTR psz,
                    GUID *pclsguid);

HRESULT GetProperty (IADs *pADs,
                     LPWSTR pszPropName,
                     LPWSTR pszPropVal);

HRESULT GetPropertyDW (IADs *pADs,
                       LPWSTR pszPropName,
                       DWORD *pdwPropVal);

HRESULT GetPropertyGuid(IADs *pADs, LPOLESTR pszPropName, GUID *pguidPropVal);

HRESULT GetPropertyAlloc (IADs *pADs,
                          LPWSTR pszPropName,
                          LPWSTR *ppszPropVal);

HRESULT SetProperty (IADs *pADs,
                     LPWSTR pszPropName,
                     LPWSTR pszPropVal);

HRESULT SetPropertyDW (IADs *pADs,
                       LPWSTR pszPropName,
                       DWORD dwPropVal);

HRESULT SetPropertyList(IADs *pADs,
                LPWSTR pszPropName,
                DWORD   Count,
                LPWSTR  *pList);

HRESULT SetPropertyListMerge(IADs *pADs,
                LPWSTR pszPropName,
                DWORD   Count,
                LPWSTR  *pList);

HRESULT GetPropertyList(IADs *pADs,
                LPWSTR pszPropName,
                DWORD *pCount,
                LPWSTR *pList);


HRESULT GetPropertyListAlloc(IADs *pADs,
                LPWSTR pszPropName,
                DWORD *pCount,
                LPWSTR **pList);

HRESULT GetPropertyListAllocDW (IADs *pADs, LPOLESTR pszPropName, DWORD *pCount, DWORD **pdwPropVal);
HRESULT SetPropertyListDW (IADs *pADs, LPOLESTR pszPropName, DWORD dwCount, DWORD *pdwPropVal);

HRESULT SetPropertyGuid (IADs *pADs,
                         LPOLESTR pszPropName,
                         GUID guidPropVal);

HRESULT SetPropertyListGuid(IADs *pADs,
                            LPOLESTR pszPropName,
                            DWORD cCount,
                            GUID *ppList);

HRESULT GetPropertyListAllocGuid(IADs *pADs,
                LPOLESTR pszPropName,
                DWORD *pCount,
                GUID **ppList);

HRESULT UsnUpd (IADs *pADs, LPWSTR szProp, LPOLESTR pUsn);

void UnpackPlatform (DWORD *pdwArch, CSPLATFORM *pPlatform);
void PackPlatform (DWORD dwArch, CSPLATFORM *pPlatform);

ULONG FindDescription(LPOLESTR *desc, ULONG cdesc, LCID *plcid,
			LPOLESTR szDescription, BOOL GetPrimary);

HRESULT GetCategoryLocaleDesc(LPOLESTR *pdesc, ULONG cdesc, LCID *plcid,
			LPOLESTR szDescription);

HRESULT CreateRepository(LPOLESTR szParentPath,
                         LPOLESTR szContainerName);

HRESULT GetRootPath(WCHAR *szRootPath);

HRESULT StoreIt (IADs *pADs);
BOOL  IsNullGuid(REFGUID rguid);

STDAPI
ReleasePackageInfo(PACKAGEDISPINFO *PackageInfo);

HRESULT GetPackageDetail (IADs            *pPackageADs,
                          PACKAGEDETAIL   *pPackageDetail);

#define CLASS_CS_CONTAINER L"classStore"
#define CLASS_CS_CLASS     L"classRegistration"
#define CLASS_CS_PACKAGE   L"packageRegistration"
#define CLASS_CS_CATEGORY  L"categoryRegistration"


#define CLASSCONTAINERNAME      L"CN=Classes"
#define PACKAGECONTAINERNAME    L"CN=Packages"
#define CATEGORYCONTAINERNAME   L"CN=Categories"
#define APPCATEGORYCONTAINERNAME  L"CN=AppCategories,CN=Default Domain Policy,CN=System,"
#define LDAPPREFIX		  L"LDAP://"

//
// ClassStoreContainer object propertynames
//
#define STOREVERSION       L"appSchemaVersion"
#define UPDATECOOKIE       L"lastUpdateSequence"

//
// Class object propertynames
//
#define MIMETYPES           L"mIMETypes"
#define PROGIDLIST          L"cOMProgId"
#define CLASSCLSID          L"cOMCLSID"
#define DESCRIPTION         L"description"
#define TREATASCLSID        L"cOMTreatAsClassId"
#define AUTOCONCLSID        L"cOMAutoConvertClassId"
#define IMPL_CATEGORIES     L"implementedCategories"
#define REQ_CATEGORIES      L"requiredCategories"
#define CLASSREFCOUNTER	    L"flags"	// BUGBUG:: schema to be put in.


//
// Package object propertynames
//

#define PKGTLBIDLIST        L"cOMTypelibId"
#define PKGCLSIDLIST        L"cOMClassID"
#define PKGPROGIDLIST       L"cOMProgID"
#define PKGIIDLIST	        L"cOMInterfaceID" 
#define QRYFILEEXT          L"fileExtension"   
#define PKGFILEEXTNLIST     L"fileExtPriority"
#define LOCALEID            L"localeID"
#define ARCHLIST            L"machineArchitecture"
#define VERSIONHI           L"versionNumberHi"
#define VERSIONLO           L"versionNumberLo"
#define PACKAGETYPE         L"packageType"
#define PACKAGEFLAGS        L"packageFlags"
#define PACKAGENAME         L"packageName"
#define SCRIPTPATH          L"msiScriptPath"
#define SCRIPTNAME          L"msiScriptName"
#define SCRIPTSIZE          L"msiScriptSize" 
#define HELPURL             L"url"
#define SETUPCOMMAND        L"setupCommand"
#define CLASSCTX            L"executionContext"
#define PKGUSN              L"lastUpdateSequence" 
#define MSIFILELIST         L"msiFileList"
#define PKGCATEGORYLIST     L"categories"  
#define UPGRADESCRIPTNAMES  L"canUpgradeScript" 
#define UILEVEL             L"installUiLevel"
#define PKGSCRIPT           L"msiScript" 
#define PKGUPGRADECODES     L"upgradeProductCode"        
#define PRODUCTCODE         L"productCode"    
#define MVIPC               L"upgradeProductCode"   // BUGBUG:: Schema name has to change
#define PRODUCTNAME         L"displayName"   

//
// Category object Propertynames
//
#define DESCRIPTION         L"description"
#define LOCALEDESCRIPTION   L"extensionName"
#define DEFAULT_LOCALE_ID   L"localeID"
#define CATEGORYCATID       L"categoryId"


#define OBJECTCLASS         L"objectclass"
#define OBJECTNAME          L"name"
#define DEFAULTCLASSSTOREPATH   L"defaultClassStore"

#define CATSEPERATOR    L"::"  // Name seperating lcid and description in DS.