You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
315 lines
7.3 KiB
315 lines
7.3 KiB
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nodefac.h
|
|
|
|
Abstract:
|
|
|
|
This module defines the CDavnodefactory class, which implements the
|
|
NodeFactory API, used to parse XML. It also exports the wrapper functions
|
|
that the C code uses to parse XML data. We need wrapper functions around the
|
|
C++ API.
|
|
|
|
Author:
|
|
|
|
Rohan Kumar [RohanK] 14-Sept-1999
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _NODE_FACTORY_
|
|
#define _NODE_FACTORY_
|
|
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#include <objbase.h>
|
|
#include "xmlparser.h"
|
|
|
|
#if DBG
|
|
#define XmlDavDbgPrint(_x_) DbgPrint _x_
|
|
#else
|
|
#define XmlDavDbgPrint(_x_)
|
|
#endif
|
|
|
|
typedef enum _CREATE_NODE_ATTRIBUTES {
|
|
CreateNode_isHidden = 0,
|
|
CreateNode_isCollection,
|
|
CreateNode_ContentLength,
|
|
CreateNode_CreationTime,
|
|
CreateNode_DisplayName,
|
|
CreateNode_LastModifiedTime,
|
|
CreateNode_Status,
|
|
CreateNode_Win32FileAttributes,
|
|
CreateNode_Win32CreationTime,
|
|
CreateNode_Win32LastAccessTime,
|
|
CreateNode_Win32LastModifiedTime,
|
|
CreateNode_ResourceType,
|
|
CreateNode_AvailableSpace,
|
|
CreateNode_TotalSpace,
|
|
CreateNode_Owner,
|
|
CreateNode_Timeout,
|
|
CreateNode_LockToken,
|
|
CreateNode_Max
|
|
} CREATE_NODE_ATTRIBUTES;
|
|
|
|
//
|
|
// IMPORTANT!!! The next two typedefs have been copied from standard files.
|
|
// This was done because including the standard header files was causing many
|
|
// compilation errors. This should be changed at some point.
|
|
//
|
|
typedef short CSHORT;
|
|
typedef struct _TIME_FIELDS {
|
|
CSHORT Year; // range [1601...]
|
|
CSHORT Month; // range [1..12]
|
|
CSHORT Day; // range [1..31]
|
|
CSHORT Hour; // range [0..23]
|
|
CSHORT Minute; // range [0..59]
|
|
CSHORT Second; // range [0..59]
|
|
CSHORT Milliseconds;// range [0..999]
|
|
CSHORT Weekday; // range [0..6] == [Sunday..Saturday]
|
|
} TIME_FIELDS, *PTIME_FIELDS;
|
|
|
|
//
|
|
// Copied from a standard header file. Must be fixed.
|
|
//
|
|
|
|
#define InsertTailList(ListHead, Entry) { \
|
|
PLIST_ENTRY _EX_Blink; \
|
|
PLIST_ENTRY _EX_ListHead; \
|
|
_EX_ListHead = (ListHead); \
|
|
_EX_Blink = _EX_ListHead->Blink; \
|
|
(Entry)->Flink = _EX_ListHead; \
|
|
(Entry)->Blink = _EX_Blink; \
|
|
_EX_Blink->Flink = (Entry); \
|
|
_EX_ListHead->Blink = (Entry); \
|
|
}
|
|
|
|
#define RemoveEntryList(Entry) { \
|
|
PLIST_ENTRY _EX_Blink; \
|
|
PLIST_ENTRY _EX_Flink; \
|
|
_EX_Flink = (Entry)->Flink; \
|
|
_EX_Blink = (Entry)->Blink; \
|
|
_EX_Blink->Flink = _EX_Flink; \
|
|
_EX_Flink->Blink = _EX_Blink; \
|
|
}
|
|
|
|
//
|
|
// The CDavNodeFactory class which implements the NodeFactory API for parsing
|
|
// the XML responses from the DAV server.
|
|
//
|
|
class CDavNodeFactory : public IXMLNodeFactory {
|
|
|
|
public:
|
|
|
|
ULONG m_ulRefCount;
|
|
PDAV_FILE_ATTRIBUTES m_DavFileAttributes;
|
|
|
|
//
|
|
// These are used in the CreateNode function to parse the XML responses.
|
|
//
|
|
BOOL m_FoundEntry, m_CreateNewEntry;
|
|
ULONG m_FileIndex;
|
|
CREATE_NODE_ATTRIBUTES m_CreateNodeAttribute;
|
|
PDAV_FILE_ATTRIBUTES m_DFAToUse;
|
|
PDAV_FILE_ATTRIBUTES m_CollectionDFA;
|
|
DWORD m_MinDisplayNameLength;
|
|
|
|
CDavNodeFactory() : m_ulRefCount(0), m_DavFileAttributes(NULL),
|
|
m_FoundEntry(FALSE), m_FileIndex(0), m_DFAToUse(NULL),
|
|
m_CollectionDFA(NULL), m_MinDisplayNameLength((DWORD)-1),
|
|
m_CreateNewEntry(FALSE),
|
|
m_CreateNodeAttribute(CreateNode_Max)
|
|
{}
|
|
|
|
//
|
|
// IUnknown interface methods.
|
|
//
|
|
|
|
virtual STDMETHODIMP_(ULONG)
|
|
AddRef(
|
|
VOID
|
|
);
|
|
|
|
virtual STDMETHODIMP_(ULONG)
|
|
Release(
|
|
VOID
|
|
);
|
|
|
|
virtual STDMETHODIMP
|
|
QueryInterface(
|
|
REFIID riid,
|
|
LPVOID *ppvObject
|
|
);
|
|
|
|
//
|
|
// IXMLNodeFactory interface methods.
|
|
//
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE
|
|
NotifyEvent(
|
|
IXMLNodeSource __RPC_FAR *pSource,
|
|
XML_NODEFACTORY_EVENT iEvt
|
|
);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE
|
|
BeginChildren(
|
|
IXMLNodeSource __RPC_FAR * pSource,
|
|
XML_NODE_INFO __RPC_FAR * pNodeInfo
|
|
);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE
|
|
EndChildren(
|
|
IXMLNodeSource __RPC_FAR * pSource,
|
|
BOOL fEmptyNode,
|
|
XML_NODE_INFO __RPC_FAR * pNodeInfo
|
|
);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE
|
|
Error(
|
|
IXMLNodeSource __RPC_FAR *pSource,
|
|
HRESULT hrErrorCode,
|
|
USHORT cNumRecs,
|
|
XML_NODE_INFO __RPC_FAR *__RPC_FAR *apNodeInfo
|
|
);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE
|
|
CreateNode(
|
|
IN IXMLNodeSource __RPC_FAR *pSource,
|
|
IN PVOID pNodeParent,
|
|
IN USHORT cNumRecs,
|
|
IN XML_NODE_INFO __RPC_FAR **aNodeInfo
|
|
);
|
|
|
|
};
|
|
|
|
extern "C" {
|
|
|
|
ULONG
|
|
DavPushData(
|
|
IN PCHAR DataBuff,
|
|
IN OUT PVOID *Context1,
|
|
IN OUT PVOID *Context2,
|
|
IN ULONG NumOfBytes,
|
|
IN BOOL isLast
|
|
);
|
|
|
|
ULONG
|
|
DavParseData(
|
|
PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
PVOID Context1,
|
|
PVOID Conttext2,
|
|
ULONG *NumOfFileEntries
|
|
);
|
|
|
|
ULONG
|
|
DavParseDataEx(
|
|
IN OUT PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
IN PVOID Context1,
|
|
IN PVOID Context2,
|
|
OUT ULONG *NumOfFileEntries,
|
|
OUT DAV_FILE_ATTRIBUTES ** pCollectionDFA
|
|
);
|
|
|
|
VOID
|
|
DavFinalizeFileAttributesList(
|
|
PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
BOOL fFreeHeadDFA
|
|
);
|
|
|
|
VOID
|
|
DavCloseContext(
|
|
PVOID Context1,
|
|
PVOID Context2
|
|
);
|
|
|
|
//
|
|
// IMPORTANT!!! The next prototype has been copied from a standard ".h" file.
|
|
// This was done because including the standard header file was causing many
|
|
// compilation errors. This should be changed at some point.
|
|
//
|
|
NTSYSAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
RtlTimeFieldsToTime (
|
|
PTIME_FIELDS TimeFields,
|
|
PLARGE_INTEGER Time
|
|
);
|
|
|
|
ULONG
|
|
DbgPrint(
|
|
PSTR Format,
|
|
...
|
|
);
|
|
|
|
}
|
|
|
|
ULONG
|
|
DavParsedateTimetzTimeString(
|
|
PWCHAR TimeString,
|
|
PLARGE_INTEGER lpft
|
|
);
|
|
|
|
ULONG
|
|
DavParseRfc1123TimeString(
|
|
PWCHAR TimeString,
|
|
PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
CREATE_NODE_ATTRIBUTES CreateNodeAttribute
|
|
);
|
|
|
|
#else
|
|
|
|
//
|
|
// These calls are wrapper routines used by the C code to parse XML using the
|
|
// NodeFactory C++ API that we are implementing.
|
|
//
|
|
|
|
ULONG
|
|
DavPushData(
|
|
IN PCHAR DataBuff,
|
|
IN OUT PVOID *Context1,
|
|
IN OUT PVOID *Context2,
|
|
IN ULONG NumOfBytes,
|
|
IN BOOL isLast
|
|
);
|
|
|
|
ULONG
|
|
DavParseData(
|
|
PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
PVOID Context1,
|
|
PVOID Conttext2,
|
|
ULONG *NumOfFileEntries
|
|
);
|
|
|
|
ULONG
|
|
DavParseDataEx(
|
|
IN OUT PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
IN PVOID Context1,
|
|
IN PVOID Context2,
|
|
OUT ULONG *NumOfFileEntries,
|
|
OUT DAV_FILE_ATTRIBUTES ** pCollectionDFA
|
|
);
|
|
|
|
VOID
|
|
DavFinalizeFileAttributesList(
|
|
PDAV_FILE_ATTRIBUTES DavFileAttributes,
|
|
BOOL fFreeHeadDFA
|
|
);
|
|
|
|
VOID
|
|
DavCloseContext(
|
|
PVOID Context1,
|
|
PVOID Context2
|
|
);
|
|
|
|
#endif // __cplusplus
|
|
|
|
|
|
#endif // _NODE_FACTORY_
|
|
|