// -------------------------------------------------------------------------------- // propfind.h // Copyright (c)1998 Microsoft Corporation, All Rights Reserved // Greg Friedman // -------------------------------------------------------------------------------- #ifndef __PROPFIND_H #define __PROPFIND_H #include "mimeole.h" // for base IHashTable interface #include "hash.h" class CByteStream; const DWORD c_dwMaxNamespaceID = DAVNAMESPACE_CONTACTS; // -------------------------------------------------------------------------------- // class CStringArray // Description : CStringArray is a simple utility class that maintains // an list of strings that are retrievable by index. // -------------------------------------------------------------------------------- class CStringArray { public: CStringArray(void); ~CStringArray(void); private: CStringArray(const CStringArray& other); CStringArray& operator=(const CStringArray& other); public: ULONG Length(void) { return m_ulLength; } HRESULT Add(LPCSTR psz); HRESULT Adopt(LPCSTR psz); LPCSTR GetByIndex(ULONG ulIndex); HRESULT RemoveByIndex(ULONG ulIndex); private: BOOL Expand(void); private: LPCSTR *m_rgpszValues; ULONG m_ulLength; ULONG m_ulCapacity; }; // wrap a CHash to provide a destructor that deallocates // string data. class CStringHash : public CHash { public: virtual ~CStringHash(); }; class CDAVNamespaceArbiterImp { public: CDAVNamespaceArbiterImp(void); ~CDAVNamespaceArbiterImp(void); HRESULT AddNamespace(LPCSTR pszNamespace, DWORD *pdwNamespaceID); HRESULT GetNamespaceID(LPCSTR pszNamespace, DWORD *pdwNamespaceID); HRESULT GetNamespacePrefix(DWORD dwNamespaceID, LPSTR *ppszNamespacePrefix); LPSTR AllocExpandedName(DWORD dwNamespaceID, LPCSTR pszPropertyName); HRESULT WriteNamespaces(IStream *pStream); BOOL m_rgbNsUsed[c_dwMaxNamespaceID + 1]; // flags indicating whether the // known namespaces are used CStringArray m_saNamespaces; // string array of namespaces private: HRESULT _AppendXMLNamespace(IStream *pStream, LPCSTR pszNamespace, DWORD dwNamespaceID, BOOL fWhitespacePrefix); }; class CPropPatchRequest : public IPropPatchRequest { public: // ---------------------------------------------------------------------------- // Construction/Destruction // ---------------------------------------------------------------------------- CPropPatchRequest(void); // ---------------------------------------------------------------------------- // IUnknown methods // ---------------------------------------------------------------------------- STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ---------------------------------------------------------------------------- // IDAVNamespaceArbiter methods // ---------------------------------------------------------------------------- STDMETHODIMP AddNamespace(LPCSTR pszNamespace, DWORD *pdwNamespaceID); STDMETHODIMP GetNamespaceID(LPCSTR pszNamespace, DWORD *pdwNamespaceID); STDMETHODIMP GetNamespacePrefix(DWORD dwNamespaceID, LPSTR *ppszNamespacePrefix); // ---------------------------------------------------------------------------- // IPropPatchRequest methods // ---------------------------------------------------------------------------- STDMETHODIMP SetProperty(DWORD dwNamespaceID, LPCSTR pszPropertyName, LPCSTR pszNewValue); STDMETHODIMP RemoveProperty(DWORD dwNamespaceID, LPCSTR pszPropertyName); STDMETHODIMP GenerateXML(LPSTR *ppszXML); // ---------------------------------------------------------------------------- // Internal Methods // ---------------------------------------------------------------------------- void SpecifyWindows1252Encoding(BOOL fSpecify1252) { m_fSpecify1252 = fSpecify1252; } STDMETHODIMP GenerateXML(LPHTTPTARGETLIST pTargets, LPSTR *ppszXML); private: BOOL m_fSpecify1252; CDAVNamespaceArbiterImp m_dna; ULONG m_cRef; // Reference Count CStringArray m_saPropNames; // string array of property names CStringArray m_saPropValues; // string array of property values CStringArray m_saRemovePropNames;// string array of properties to remove }; class CPropFindRequest : public IPropFindRequest { public: // ---------------------------------------------------------------------------- // Construction/Destruction // ---------------------------------------------------------------------------- CPropFindRequest(void); // ---------------------------------------------------------------------------- // IUnknown methods // ---------------------------------------------------------------------------- STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ---------------------------------------------------------------------------- // IDAVNamespaceArbiter methods // ---------------------------------------------------------------------------- STDMETHODIMP AddNamespace(LPCSTR pszNamespace, DWORD *pdwNamespaceID); STDMETHODIMP GetNamespaceID(LPCSTR pszNamespace, DWORD *pdwNamespaceID); STDMETHODIMP GetNamespacePrefix(DWORD dwNamespaceID, LPSTR *ppszNamespacePrefix); // ---------------------------------------------------------------------------- // IPropFindRequest methods // ---------------------------------------------------------------------------- STDMETHODIMP AddProperty(DWORD dwNamespaceID, LPCSTR pszPropertyName); STDMETHODIMP GenerateXML(LPSTR *ppszXML); private: HRESULT AppendXMLNamespace(CByteStream& bs, LPCSTR pszNamespace, DWORD dwNamespaceID); private: CDAVNamespaceArbiterImp m_dna; ULONG m_cRef; // Reference Count CStringArray m_saProperties; // string array of properties }; class CPropFindMultiResponse : public IPropFindMultiResponse { public: CPropFindMultiResponse(void); ~CPropFindMultiResponse(void); // ---------------------------------------------------------------------------- // IUnknown methods // ---------------------------------------------------------------------------- STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ---------------------------------------------------------------------------- // IPropFindMultiStatus methods // ---------------------------------------------------------------------------- STDMETHODIMP_(BOOL) IsComplete(void); STDMETHODIMP GetLength(ULONG *pulLength); STDMETHODIMP GetResponse(ULONG ulIndex, IPropFindResponse **ppResponse); // ---------------------------------------------------------------------------- // CPropFindMultiStatus methods // ---------------------------------------------------------------------------- BOOL GetDone(void) { return m_bDone; } void SetDone(BOOL bDone) { m_bDone = bDone; } HRESULT HrAddResponse(IPropFindResponse *pResponse); private: ULONG m_cRef; BOOL m_bDone; ULONG m_ulResponseCapacity; ULONG m_ulResponseLength; IPropFindResponse **m_rgResponses; }; class CPropFindResponse : public IPropFindResponse { public: CPropFindResponse(void); ~CPropFindResponse(void); // ---------------------------------------------------------------------------- // IUnknown methods // ---------------------------------------------------------------------------- STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ---------------------------------------------------------------------------- // IPropFindResponse methods // ---------------------------------------------------------------------------- STDMETHODIMP_(BOOL) IsComplete(void); STDMETHODIMP GetHref(LPSTR *ppszHref); STDMETHODIMP GetProperty(DWORD dwNamespaceID, LPSTR pszPropertyName, LPSTR *ppszPropertyValue); public: // ---------------------------------------------------------------------------- // CPropFindResponse methods // ---------------------------------------------------------------------------- HRESULT HrInitPropFindResponse(IPropFindRequest *pRequest); HRESULT HrAdoptHref(LPCSTR pszHref); HRESULT HrAdoptProperty(LPCSTR pszKey, LPCSTR pszValue); private: ULONG m_cRef; BOOL m_bDone; LPCSTR m_pszHref; IPropFindRequest *m_pRequest; CStringHash m_shProperties; DWORD m_dwCachedNamespaceID; LPSTR m_pszCachedNamespacePrefix; }; #endif // __PROPFIND_H