Leaked source code of windows server 2003
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

/*++
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_