#pragma once #define OTHERFILES 0 #define MANIFEST 1 class CAssemblyCache : public IAssemblyCacheImport, public IAssemblyCacheEmit { public: enum CacheFlags { Base = 0, Staging }; typedef enum { COMPLETED = 0, CONFIRMED, CRITICAL } CacheStatus; // IUnknown methods STDMETHODIMP QueryInterface(REFIID riid,void ** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // Import/Emit methods STDMETHOD(GetManifestImport)( /* out */ LPASSEMBLY_MANIFEST_IMPORT *ppManifestImport); STDMETHOD(GetManifestFilePath)( /* out */ LPOLESTR *ppwzManifestFilePath, /* in, out */ LPDWORD ccManifestFilePath); STDMETHOD(GetManifestFileDir)( /* out */ LPOLESTR *ppwzManifestFileDir, /* in, out */ LPDWORD ccManifestFileDir); STDMETHOD(GetDisplayName)( /* out */ LPOLESTR *ppwzDisplayName, /* out */ LPDWORD ccDisplayName); // Import only methods STDMETHOD(FindExistMatching)( /* in */ LPASSEMBLY_FILE_INFO pAssemblyFileInfo, /* out */ LPOLESTR *ppwzPath); // Emit only methods STDMETHOD(CopyFile)( /* in */ LPOLESTR pwzSourcePath, /* in */ LPOLESTR pwzFileName, /* in */ DWORD dwFlags); STDMETHOD(Commit)( /* in */ DWORD dwFlags); CAssemblyCache(); ~CAssemblyCache(); static HRESULT CreateDirectoryHierarchy( LPWSTR pwzRootPath, LPWSTR pwzPath); static HRESULT GetCacheRootDir(CString &sCacheDir, CacheFlags eFlags); private: DWORD _dwSig; DWORD _cRef; DWORD _hr; CString _sRootDir; CString _sManifestFileDir; CString _sManifestFilePath; CString _sDisplayName; LPASSEMBLY_MANIFEST_IMPORT _pManifestImport; HRESULT Init(CAssemblyCache* pAssemblyCache); // status get/set methods BOOL IsStatus(LPWSTR pwzDisplayName, CacheStatus eStatus); HRESULT SetStatus(LPWSTR pwzDisplayName, CacheStatus eStatus); friend HRESULT CreateAssemblyCacheImport( LPASSEMBLY_CACHE_IMPORT *ppAssemblyCacheImport, LPASSEMBLY_IDENTITY pAssemblyIdentity, DWORD dwFlags); friend HRESULT CreateAssemblyCacheEmit( LPASSEMBLY_CACHE_EMIT *ppAssemblyCacheEmit, LPASSEMBLY_CACHE_EMIT pAssemblyCacheEmit, DWORD dwFlags); friend HRESULT SearchForHighestVersionInCache( LPWSTR *ppwzResultDisplayName, LPWSTR pwzSearchDisplayName, CAssemblyCache::CacheStatus eCacheStatus, CAssemblyCache* pCache); };