2 * Copyright 2015 Hans Leidekker for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 SIZE_T size_allocated
;
29 void *ws_alloc( WS_HEAP
*, SIZE_T
) DECLSPEC_HIDDEN
;
30 void *ws_realloc( WS_HEAP
*, void *, SIZE_T
) DECLSPEC_HIDDEN
;
31 void ws_free( WS_HEAP
*, void * ) DECLSPEC_HIDDEN
;
32 const char *debugstr_xmlstr( const WS_XML_STRING
* ) DECLSPEC_HIDDEN
;
33 WS_XML_STRING
*alloc_xml_string( const unsigned char *, ULONG
) DECLSPEC_HIDDEN
;
34 WS_XML_UTF8_TEXT
*alloc_utf8_text( const unsigned char *, ULONG
) DECLSPEC_HIDDEN
;
35 HRESULT
append_attribute( WS_XML_ELEMENT_NODE
*, WS_XML_ATTRIBUTE
* ) DECLSPEC_HIDDEN
;
36 void free_attribute( WS_XML_ATTRIBUTE
* ) DECLSPEC_HIDDEN
;
37 WS_TYPE
map_value_type( WS_VALUE_TYPE
) DECLSPEC_HIDDEN
;
38 BOOL
set_fpword( unsigned short, unsigned short * ) DECLSPEC_HIDDEN
;
39 void restore_fpword( unsigned short ) DECLSPEC_HIDDEN
;
40 HRESULT
set_output( WS_XML_WRITER
* ) DECLSPEC_HIDDEN
;
41 HRESULT
set_input( WS_XML_READER
*, char *, ULONG
) DECLSPEC_HIDDEN
;
42 ULONG
get_type_size( WS_TYPE
, const WS_STRUCT_DESCRIPTION
* ) DECLSPEC_HIDDEN
;
44 #define INVALID_PARAMETER_INDEX 0xffff
45 HRESULT
get_param_desc( const WS_STRUCT_DESCRIPTION
*, USHORT
, const WS_FIELD_DESCRIPTION
** ) DECLSPEC_HIDDEN
;
46 HRESULT
write_input_params( WS_XML_WRITER
*, const WS_ELEMENT_DESCRIPTION
*,
47 const WS_PARAMETER_DESCRIPTION
*, ULONG
, const void ** ) DECLSPEC_HIDDEN
;
48 HRESULT
read_output_params( WS_XML_READER
*, WS_HEAP
*, const WS_ELEMENT_DESCRIPTION
*,
49 const WS_PARAMETER_DESCRIPTION
*, ULONG
, const void ** ) DECLSPEC_HIDDEN
;
53 NODE_FLAG_IGNORE_TRAILING_ELEMENT_CONTENT
= 0x1,
58 WS_XML_ELEMENT_NODE hdr
;
65 struct node
*alloc_node( WS_XML_NODE_TYPE
) DECLSPEC_HIDDEN
;
66 void free_node( struct node
* ) DECLSPEC_HIDDEN
;
67 void destroy_nodes( struct node
* ) DECLSPEC_HIDDEN
;
68 HRESULT
copy_node( WS_XML_READER
*, struct node
** ) DECLSPEC_HIDDEN
;
70 static inline WS_XML_NODE_TYPE
node_type( const struct node
*node
)
72 return node
->hdr
.node
.nodeType
;
75 BOOL
move_to_root_element( struct node
*, struct node
** ) DECLSPEC_HIDDEN
;
76 BOOL
move_to_next_element( struct node
** ) DECLSPEC_HIDDEN
;
77 BOOL
move_to_prev_element( struct node
** ) DECLSPEC_HIDDEN
;
78 BOOL
move_to_child_element( struct node
** ) DECLSPEC_HIDDEN
;
79 BOOL
move_to_end_element( struct node
** ) DECLSPEC_HIDDEN
;
80 BOOL
move_to_parent_element( struct node
** ) DECLSPEC_HIDDEN
;
81 BOOL
move_to_first_node( struct node
** ) DECLSPEC_HIDDEN
;
82 BOOL
move_to_next_node( struct node
** ) DECLSPEC_HIDDEN
;
83 BOOL
move_to_prev_node( struct node
** ) DECLSPEC_HIDDEN
;
84 BOOL
move_to_bof( struct node
*, struct node
** ) DECLSPEC_HIDDEN
;
85 BOOL
move_to_eof( struct node
*, struct node
** ) DECLSPEC_HIDDEN
;
86 BOOL
move_to_child_node( struct node
** ) DECLSPEC_HIDDEN
;
87 BOOL
move_to_parent_node( struct node
** ) DECLSPEC_HIDDEN
;
104 ULONG
prop_size( const struct prop_desc
*, ULONG
) DECLSPEC_HIDDEN
;
105 void prop_init( const struct prop_desc
*, ULONG
, struct prop
*, void * ) DECLSPEC_HIDDEN
;
106 HRESULT
prop_set( const struct prop
*, ULONG
, ULONG
, const void *, ULONG
) DECLSPEC_HIDDEN
;
107 HRESULT
prop_get( const struct prop
*, ULONG
, ULONG
, void *, ULONG
) DECLSPEC_HIDDEN
;
109 HRESULT
message_set_action( WS_MESSAGE
*, const WS_XML_STRING
* ) DECLSPEC_HIDDEN
;
110 void message_set_send_context( WS_MESSAGE
*, const WS_PROXY_MESSAGE_CALLBACK_CONTEXT
* ) DECLSPEC_HIDDEN
;
111 void message_set_receive_context( WS_MESSAGE
*, const WS_PROXY_MESSAGE_CALLBACK_CONTEXT
* ) DECLSPEC_HIDDEN
;
112 void message_do_send_callback( WS_MESSAGE
* ) DECLSPEC_HIDDEN
;
113 void message_do_receive_callback( WS_MESSAGE
* ) DECLSPEC_HIDDEN
;
114 HRESULT
message_insert_http_headers( WS_MESSAGE
*, HINTERNET
) DECLSPEC_HIDDEN
;
116 HRESULT
channel_send_message( WS_CHANNEL
*, WS_MESSAGE
* ) DECLSPEC_HIDDEN
;
117 HRESULT
channel_receive_message( WS_CHANNEL
*, char **, ULONG
* ) DECLSPEC_HIDDEN
;
119 #define TICKS_PER_SEC 10000000
120 #define TICKS_PER_MIN (60 * (ULONGLONG)TICKS_PER_SEC)
121 #define TICKS_PER_HOUR (3600 * (ULONGLONG)TICKS_PER_SEC)
122 #define TICKS_PER_DAY (86400 * (ULONGLONG)TICKS_PER_SEC)
123 #define TICKS_MAX 3155378975999999999
124 #define TICKS_1601_01_01 504911232000000000
126 static const int month_days
[2][12] =
128 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
129 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
132 static inline int leap_year( int year
)
134 return !(year
% 4) && (year
% 100 || !(year
% 400));
137 static inline BOOL
is_nil_value( const char *value
, ULONG size
)
140 for (i
= 0; i
< size
; i
++) if (value
[i
]) return FALSE
;
144 static inline BOOL
is_valid_parent( const struct node
*node
)
146 if (!node
) return FALSE
;
147 return (node_type( node
) == WS_XML_NODE_TYPE_ELEMENT
|| node_type( node
) == WS_XML_NODE_TYPE_BOF
);
150 static inline void *heap_alloc( SIZE_T size
)
152 return HeapAlloc( GetProcessHeap(), 0, size
);
155 static inline void *heap_alloc_zero( SIZE_T size
)
157 return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, size
);
160 static inline void *heap_realloc( void *mem
, SIZE_T size
)
162 return HeapReAlloc( GetProcessHeap(), 0, mem
, size
);
165 static inline void *heap_realloc_zero( void *mem
, SIZE_T size
)
167 return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, mem
, size
);
170 static inline BOOL
heap_free( void *mem
)
172 return HeapFree( GetProcessHeap(), 0, mem
);