#ifndef _DESKSTAT_H_ #define _DESKSTAT_H_ #include "mshtml.h" // NOTE: This is NOT a IE4COMPONENTA struct, it is a IE4COMPONENTT struct. // Note: This is the old COMPONENTA structure used in IE4. It is kept here for compatibility. typedef struct _tagIE4COMPONENTA { DWORD dwSize; DWORD dwID; //Don't make this DWORD_PTR. The public version of this struct uses DWORD here. int iComponentType; BOOL fChecked; BOOL fDirty; BOOL fNoScroll; COMPPOS cpPos; TCHAR szFriendlyName[MAX_PATH]; TCHAR szSource[INTERNET_MAX_URL_LENGTH]; TCHAR szSubscribedURL[INTERNET_MAX_URL_LENGTH]; } IE4COMPONENTA; typedef IE4COMPONENTA *LPIE4COMPONENTA; typedef const IE4COMPONENTA *LPCIE4COMPONENTA; // NOTE: This is NOT a COMPONENTA struct, it is a COMPONENTT struct. // Note: This is the new NT5 COMPONENT structure. The old component structure is kept at the // begining of this struct and the new fields are added at the end. The dwSize field is used to // distinguish between the old and new structures. // typedef struct _tagCOMPONENTA { DWORD dwSize; DWORD dwID; //Don't make this DWORD_PTR. The public version of this struct uses DWORD here. int iComponentType; BOOL fChecked; BOOL fDirty; BOOL fNoScroll; COMPPOS cpPos; TCHAR szFriendlyName[MAX_PATH]; TCHAR szSource[INTERNET_MAX_URL_LENGTH]; TCHAR szSubscribedURL[INTERNET_MAX_URL_LENGTH]; // Add the new fields below this point. Everything above must exactly match the // old IE4COMPONENTA structure for compatibility. DWORD dwCurItemState; COMPSTATEINFO csiOriginal; COMPSTATEINFO csiRestored; } COMPONENTA; typedef COMPONENTA *LPCOMPONENTA; typedef const COMPONENTA *LPCCOMPONENTA; typedef struct _tagTAGENTRYA { LPCSTR pszTag; BOOL fSkipPast; } TAGENTRYA; typedef struct _tagTAGENTRYW { LPCWSTR pwszTag; BOOL fSkipPast; } TAGENTRYW; #define c_wszNULL (L"") //The following are the possible values for _iCharset field of CReadFileObj #define ANSI_HTML_CHARSET 1 #define UNICODE_HTML_CHARSET 2 // // The following class implements a uniform way to read chars from an ANSI or UNICODE file. // class CReadFileObj { friend class CActiveDesktop; private: HANDLE _hFile; //File handle int _iCharset; //ANSI_HTML_CHARSET or UNICODE_HTML_CHARSET public: //Constructor CReadFileObj(LPCTSTR lpszFileName); //Destructor ~CReadFileObj(); //Reads the given number of ansi characters, if an ansi file. HRESULT FileReadCharsA(LPSTR lpszBuff, UINT uiCharsToRead, UINT *puiCharsActuallyRead); //Reads the given number of UNICODE characters, if a UNICODE file. HRESULT FileReadCharsW(LPWSTR lpwszBuff, UINT uiCharsToRead, UINT *puiCharsActuallyRead); //Reads the given number of characters, and convert them if necessary to ANSI or UNICODE based on destCharset. HRESULT FileReadAndConvertChars(int iDestCharset, LPWSTR lpwszBuff, UINT uiCharsToRead, UINT *puiCharsActuallyRead, UINT *puiCharsConverted); //Seeks to a given character offset (not byte offset). HRESULT FileSeekChars(LONG lCharOffset, DWORD dwOrigin); //Gets the offset of the current file pointer from the begining of the file. HRESULT FileGetCurCharOffset(LONG *plCharOffset); }; interface IShellImageDataFactory; class CActiveDesktop : public IActiveDesktop, IActiveDesktopP, IADesktopP2, IPropertyBag { public: // *** IUnknown *** virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj); virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); // *** IActiveDesktop *** virtual STDMETHODIMP ApplyChanges(DWORD dwFlags); virtual STDMETHODIMP GetWallpaper(LPWSTR pwszWallpaper, UINT cchWallpaper, DWORD dwReserved); virtual STDMETHODIMP SetWallpaper(LPCWSTR pwszWallpaper, DWORD dwReserved); virtual STDMETHODIMP GetWallpaperOptions(LPWALLPAPEROPT pwpo, DWORD dwReserved); virtual STDMETHODIMP SetWallpaperOptions(LPCWALLPAPEROPT pwpo, DWORD dwReserved); virtual STDMETHODIMP GetPattern(LPWSTR pwszPattern, UINT cchPattern, DWORD dwReserved); virtual STDMETHODIMP SetPattern(LPCWSTR pszPattern, DWORD dwReserved); virtual STDMETHODIMP GetDesktopItemOptions(LPCOMPONENTSOPT pco, DWORD dwReserved); virtual STDMETHODIMP SetDesktopItemOptions(LPCCOMPONENTSOPT pco, DWORD dwReserved); virtual STDMETHODIMP AddDesktopItem(LPCCOMPONENT pcomp, DWORD dwReserved); virtual STDMETHODIMP AddDesktopItemWithUI(HWND hwnd, LPCOMPONENT pcomp, DWORD dwReserved); virtual STDMETHODIMP ModifyDesktopItem(LPCCOMPONENT pcomp, DWORD dwFlags); virtual STDMETHODIMP RemoveDesktopItem(LPCCOMPONENT pcomp, DWORD dwReserved); virtual STDMETHODIMP GetDesktopItemCount(LPINT lpiCount, DWORD dwReserved); virtual STDMETHODIMP GetDesktopItem(int nComponent, LPCOMPONENT pcomp, DWORD dwReserved); virtual STDMETHODIMP GetDesktopItemByID(ULONG_PTR dwID, LPCOMPONENT pcomp, DWORD dwReserved); virtual STDMETHODIMP GenerateDesktopItemHtml(LPCWSTR pwszFileName, LPCOMPONENT pcomp, DWORD dwReserved); virtual STDMETHODIMP AddUrl(HWND hwnd, LPCWSTR pszSource, LPCOMPONENT pcomp, DWORD dwFlags); virtual STDMETHODIMP GetDesktopItemBySource(LPCWSTR pszSource, LPCOMPONENT pcomp, DWORD dwReserved); // *** IActiveDesktopP *** virtual STDMETHODIMP SetSafeMode(DWORD dwFlags); virtual STDMETHODIMP EnsureUpdateHTML(void); virtual STDMETHODIMP SetScheme(LPCWSTR pwszSchemeName, DWORD dwFlags); virtual STDMETHODIMP GetScheme(LPWSTR pwszSchemeName, LPDWORD lpdwcchBuffer, DWORD dwFlags); // *** IADesktopP2 *** virtual STDMETHODIMP ReReadWallpaper(void); virtual STDMETHODIMP GetADObjectFlags(LPDWORD lpdwFlags, DWORD dwMask); virtual STDMETHODIMP UpdateAllDesktopSubscriptions(); virtual STDMETHODIMP MakeDynamicChanges(IOleObject *pOleObj); // *** IPropertyBag *** virtual STDMETHODIMP Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog); virtual STDMETHODIMP Write(LPCOLESTR pszPropName, VARIANT *pVar); //Some Ansi versions of the methods for Internal Use BOOL AddComponentPrivate(COMPONENTA *pcomp, DWORD dwID); BOOL UpdateComponentPrivate(int iIndex, COMPONENTA *pcomp); BOOL RemoveComponentPrivate(int iIndex, COMPONENTA *pcomp); BOOL GetComponentPrivate(int nComponent, COMPONENTA *pcomp); CActiveDesktop(); protected: DWORD _cRef; DWORD _dwNextID; HDSA _hdsaComponent; TCHAR _szSelectedWallpaper[MAX_PATH]; TCHAR _szSelectedWallpaperConverted[MAX_PATH]; TCHAR _szBackupWallpaper[MAX_PATH]; TCHAR _szSelectedPattern[MAX_PATH]; LPTSTR _pszScheme; WALLPAPEROPT _wpo; COMPONENTSOPT _co; HANDLE _hFileHtml; //File handle of desktop.htt CReadFileObj* _pReadFileObjHtmlBkgd; //Object used to read the background html wallpaper int _iDestFileCharset; //Whether the dest file desktop.htt is ANSI or UNICODE. // used for the temp wallpaper LPWSTR _pszWallpaperInUse; // If using a temp file, keep the name in use so we don't stomp it while the user is previewing other files. FILETIME _ftLastWrite; // The date that the original file was last written to. LPTSTR _pszOrigLastApplied; // Same as _pszOriginalFile except it doesn't change until apply is pressed. // put the BOOLs together BOOL _fDirty; BOOL _fWallpaperDirty; BOOL _fWallpaperChangedDuringInit; BOOL _fPatternDirty; BOOL _fSingleItem; BOOL _fInitialized; BOOL _fNeedBodyEnd; BOOL _fNoDeskMovr; BOOL _fBackgroundHtml; IStream *_pStream; //To generate individual components. BOOL _fUseDynamicHtml; //Indicates if Dynamic Html can be used to make changes. BOOL _fPolicyForWPName; // A policy exists for the wallpaper to be used. BOOL _fPolicyForWPStyle; // A policy exists for the wallpaper style to be used. BOOL _fIgnoreAddRemovePolicies; //If this is set, ignore the policy to add remove items. ~CActiveDesktop(); int _FindComponentIndexByID(DWORD dwID); int _FindComponentBySource(LPTSTR lpszSource, COMPONENTA *pComp); int _FindComponentBySrcUrl(LPTSTR lpszSrcUrl, COMPONENTA *pComp); void _ReadComponent(HKEY hkey, LPCTSTR pszComp); void _SortAndRationalize(void); void _ReadComponents(BOOL fActiveDesktop); BOOL _ReadWallpaper(BOOL fActiveDesktop); void _ReadPattern(void); void _Initialize(void); void _SaveComponent(HKEY hkey, int iIndex, COMPONENTA *pcomp); void _SaveComponents(void); void _SaveWallpaper(void); void _SavePattern(DWORD dwFlags); void _SaveSettings(DWORD dwFlags); void _GenerateHtmlHeader(void); void _GenerateHtmlPicture(COMPONENTA *pcomp); void _GenerateHtmlDoc(COMPONENTA *pcomp); void _GenerateHtmlSite(COMPONENTA *pcomp); void _GenerateHtmlControl(COMPONENTA *pcomp); void _GenerateHtmlComponent(COMPONENTA *pcomp); void _GenerateHtmlFooter(void); void _GenerateHtml(void); void _WriteHtmlFromString(LPCTSTR psz); void _WriteHtmlFromId(UINT uid); void _WriteHtmlFromIdF(UINT uid, ...); void _WriteHtmlFromFile(LPCTSTR pszContents); void _WriteHtmlFromReadFileObj(CReadFileObj *pReadFileObj, int iOffsetStart, int iOffsetEnd); void _WriteResizeable(COMPONENTA *pcomp); void _WriteHtmlW(LPCWSTR pwstr, UINT cchToWrite, UINT *pcchWritten); int _ScanTagEntriesA(CReadFileObj *pReadFileObj, int iOffsetStart, TAGENTRYA *pte, int cte); int _ScanTagEntriesW(CReadFileObj *pReadFileObj, int iOffsetStart, TAGENTRYW *pte, int cte); int _ScanForTagA(CReadFileObj *pReadFileObj, int iOffsetStart, LPCSTR pwszTag); int _ScanForTagW(CReadFileObj *pReadFileObj, int iOffsetStart, LPCWSTR pwszTag); void _ParseAnsiInputHtmlFile(LPTSTR szSelectedWallpaper, int *piOffsetBase, int *piOffsetComp); HRESULT _CopyComponent(COMPONENTA *pCompDest, COMPONENTA *pCompSrc, DWORD dwFlags); HRESULT _ConvertFileToTempBitmap(IN LPWSTR pszFile, IN int cchSize); HRESULT _SaveTempWallpaperSettings(void); private: HRESULT _AddDTIWithUIPrivateA(HWND hwnd, LPCCOMPONENT pComp, DWORD dwFlags); BOOL _IsDisplayInSafeMode(void); // The following are used for manipulating ActiveDesktop using Dynamic HTML. HRESULT _InsertNewDesktopItems(IHTMLDocument2 *pDoc); HRESULT _UpdateDesktopItemHtmlElements(IHTMLDocument2 *pDoc); HRESULT _UpdateHtmlElement(IHTMLElement *pElem); BOOL _UpdateIdOfElement(IHTMLElement *pElem, LPCOMPONENTA lpCompA); void _UpdateStyleOfElement(IHTMLElement *pElem, LPCOMPONENTA lpCompA); void _GenerateHtmlBStrForComp(COMPONENTA *pComp, BSTR *pbstr); }; extern IActiveDesktop *g_pActiveDesk; int GetIntFromSubkey(HKEY hKey, LPCTSTR lpszValueName, int iDefault); int GetIntFromReg(HKEY hKey, LPCTSTR lpszSubkey, LPCTSTR lpszNameValue, int iDefault); BOOL GetStringFromReg(HKEY hkey, LPCTSTR lpszSubkey, LPCTSTR lpszValueName, LPTSTR lpszValue, DWORD cchSizeofValueBuff); STDAPI CActiveDesktop_InternalCreateInstance(LPUNKNOWN * ppunk, REFIID riid); HRESULT GetPerUserFileName(LPTSTR pszOutputFileName, DWORD dwSize, LPTSTR pszPartialFileName); STDAPI CDeskHtmlProp_RegUnReg(BOOL bReg); //Function to convert components in either direction. void ConvertCompStruct(COMPONENTA *pCompDest, COMPONENTA *pCompSrc, BOOL fPubToPriv); void SetStateInfo(COMPSTATEINFO *pCompStateInfo, COMPPOS *pCompPos, DWORD dwItemState); #define MultiCompToWideComp(MultiComp, WideComp) ConvertCompStruct((COMPONENTA *)WideComp, MultiComp, FALSE) #define WideCompToMultiComp(WideComp, MultiComp) ConvertCompStruct(MultiComp, (COMPONENTA *)WideComp, TRUE) #define COMPONENT_TOP_WINDOWLESS (COMPONENT_TOP / 2) #define IsWindowLessComponent(pcomp) (((pcomp)->iComponentType == COMP_TYPE_PICTURE) || ((pcomp)->iComponentType == COMP_TYPE_HTMLDOC)) #define COMPONENT_DEFAULT_WIDTH ((DWORD)-1) #define COMPONENT_DEFAULT_HEIGHT ((DWORD)-1) #define DESKMOVR_FILENAME TEXT("\\Web\\DeskMovr.htt") #define DESKTOPHTML_FILENAME TEXT("\\Microsoft\\Internet Explorer\\Desktop.htt") #define PATTERN_FILENAME TEXT("\\Microsoft\\Internet Explorer\\Pattern.bmp") #define SAVE_PATTERN_NAME 0x00000001 #define GENERATE_PATTERN_FILE 0x00000002 //Property names #define c_wszPropName_TSPerfBGPolicy L"TSConnectEvent" #define c_wszPropName_IgnorePolicies L"IgnorePolicies" #define SZ_REGKEY_ACTDESKTOP_TSPERFPOLICY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Remote") #define SZ_REGVALUE_ACTDESKTOP_TSPERFPOLICY TEXT("ActiveDesktop") #define SZ_REGVDATE_ACTDESKTOP_TSPERFPOLICY TEXT("Force Blank") #define REGSTR_PATH_WP_POLICY REGSTR_PATH_POLICIES TEXT("\\") REGSTR_KEY_SYSTEM BOOL ReadPolicyForWallpaper(LPTSTR lpszPolicyForWallpaper, DWORD dwSizeofBuff); BOOL ReadPolicyForWPStyle(LPDWORD lpdwStyle); #endif // _DESKSTAT_H_