annotate GEMBASSY-1.0.3/gsoap/stdsoap2.cpp @ 0:8300eb051bea draft

Initial upload
author ktnyt
date Fri, 26 Jun 2015 05:19:29 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2 stdsoap2.c[pp] 2.8.17r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4 gSOAP runtime engine
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6 gSOAP XML Web services tools
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8 This part of the software is released under ONE of the following licenses:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9 GPL, or the gSOAP public license, or Genivia's license for commercial use.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11 Contributors:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13 Wind River Systems Inc., for the following additions under gSOAP public license:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14 - vxWorks compatible options
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16 gSOAP public license.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
17
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
18 The contents of this file are subject to the gSOAP Public License Version 1.3
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
19 (the "License"); you may not use this file except in compliance with the
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
20 License. You may obtain a copy of the License at
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
21 http://www.cs.fsu.edu/~engelen/soaplicense.html
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
22 Software distributed under the License is distributed on an "AS IS" basis,
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
23 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
24 for the specific language governing rights and limitations under the License.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
25
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
26 The Initial Developer of the Original Code is Robert A. van Engelen.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
27 Copyright (C) 2000-2013, Robert van Engelen, Genivia Inc., All Rights Reserved.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
28 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
29 GPL license.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
30
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
31 This program is free software; you can redistribute it and/or modify it under
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
32 the terms of the GNU General Public License as published by the Free Software
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
33 Foundation; either version 2 of the License, or (at your option) any later
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
34 version.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
35
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
36 This program is distributed in the hope that it will be useful, but WITHOUT ANY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
37 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
38 PARTICULAR PURPOSE. See the GNU General Public License for more details.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
39
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
40 You should have received a copy of the GNU General Public License along with
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
41 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
42 Place, Suite 330, Boston, MA 02111-1307 USA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
43
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
44 Author contact information:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
45 engelen@genivia.com / engelen@acm.org
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
46
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
47 This program is released under the GPL with the additional exemption that
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
48 compiling, linking, and/or using OpenSSL is allowed.
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
49 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
50 A commercial use license is available from Genivia, Inc., contact@genivia.com
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
51 --------------------------------------------------------------------------------
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
52 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
53
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
54 #define GSOAP_LIB_VERSION 20817
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
55
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
56 #ifdef AS400
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
57 # pragma convert(819) /* EBCDIC to ASCII */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
58 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
59
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
60 #include "stdsoap2.h"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
61 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
62 #include <ipcom_key_db.h>
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
63 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
64 #if GSOAP_VERSION != GSOAP_LIB_VERSION
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
65 # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
66 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
67
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
68 #ifdef __BORLANDC__
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
69 # pragma warn -8060
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
70 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
71 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
72 # ifdef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
73 # pragma comment(lib, "ws2.lib") /* WinCE */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
74 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
75 # pragma comment(lib, "ws2_32.lib")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
76 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
77 # pragma warning(disable : 4996) /* disable deprecation warnings */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
78 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
79 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
80
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
81 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
82 SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.17r 2013-12-18 00:00:00 GMT")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
83 extern "C" {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
84 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
85 SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.17r 2013-12-18 00:00:00 GMT")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
86 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
87
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
88 /* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
89 #ifndef SOAP_UNKNOWN_CHAR
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
90 #define SOAP_UNKNOWN_CHAR (127)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
91 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
92
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
93 /* EOF=-1 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
94 #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
95 #define SOAP_TT (soap_wchar)(-3) /* XML-specific '</' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
96 #define SOAP_GT (soap_wchar)(-4) /* XML-specific '>' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
97 #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
98 #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
99
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
100 #define soap_blank(c) ((c)+1 > 0 && (c) <= 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
101 #define soap_notblank(c) ((c) > 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
102
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
103 #if defined(WIN32) && !defined(UNDER_CE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
104 #define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
105 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
106 #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
107 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
108
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
109 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
110 static void soap_init_logs(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
111 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
112 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
113 static void soap_close_logfile(struct soap*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
114 static void soap_set_logfile(struct soap*, int, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
115 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
116
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
117 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
118 static void soap_init_mht(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
119 static void soap_free_mht(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
120 static void soap_track_unlink(struct soap*, const void*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
121 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
122
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
123 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
124 static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
125 static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
126 static int soap_getattrval(struct soap*, char*, size_t, soap_wchar);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
127 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
128
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
129 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
130 static void soap_free_ns(struct soap *soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
131 static soap_wchar soap_char(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
132 static soap_wchar soap_get_pi(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
133 static int soap_isxdigit(int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
134 static void *fplugin(struct soap*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
135 static size_t soap_count_attachments(struct soap *soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
136 static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
137 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
138 static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
139 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
140 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
141 static int soap_has_copies(struct soap*, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
142 static void soap_init_iht(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
143 static void soap_free_iht(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
144 static void soap_init_pht(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
145 static void soap_free_pht(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
146 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
147 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
148
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
149 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
150 static const char *soap_set_validation_fault(struct soap*, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
151 static int soap_isnumeric(struct soap*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
152 static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
153 static void soap_utilize_ns(struct soap *soap, const char *tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
154 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
155
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
156 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
157 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
158 static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
159 static int soap_putdimefield(struct soap*, const char*, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
160 static char *soap_getdimefield(struct soap*, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
161 static void soap_select_mime_boundary(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
162 static int soap_valid_mime_boundary(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
163 static void soap_resolve_attachment(struct soap*, struct soap_multipart*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
164 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
165 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
166
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
167 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
168 static int soap_getgziphdr(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
169 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
170
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
171 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
172 # ifndef SOAP_SSL_RSA_BITS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
173 # define SOAP_SSL_RSA_BITS 2048
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
174 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
175 static int soap_ssl_init_done = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
176 static int ssl_auth_init(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
177 static int ssl_verify_callback(int, X509_STORE_CTX*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
178 static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
179 static int ssl_password(char*, int, int, void *);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
180 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
181
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
182 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
183 # ifndef SOAP_SSL_RSA_BITS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
184 # define SOAP_SSL_RSA_BITS 2048
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
185 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
186 static int soap_ssl_init_done = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
187 static const char *ssl_verify(struct soap *soap, const char *host);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
188 # if defined(HAVE_PTHREAD_H)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
189 # include <pthread.h>
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
190 /* make GNUTLS thread safe with pthreads */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
191 GCRY_THREAD_OPTION_PTHREAD_IMPL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
192 # elif defined(HAVE_PTH_H)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
193 #include <pth.h>
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
194 /* make GNUTLS thread safe with PTH */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
195 GCRY_THREAD_OPTION_PTH_IMPL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
196 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
197 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
198
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
199 #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
200 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
201 static const char *soap_decode(char*, size_t, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
202 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
203 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
204
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
205 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
206 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
207 static soap_wchar soap_getchunkchar(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
208 static const char *http_error(struct soap*, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
209 static int http_get(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
210 static int http_405(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
211 static int http_200(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
212 static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
213 static int http_send_header(struct soap*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
214 static int http_post_header(struct soap*, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
215 static int http_response(struct soap*, int, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
216 static int http_parse(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
217 static int http_parse_header(struct soap*, const char*, const char*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
218 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
219 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
220
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
221 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
222
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
223 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
224 static int fsend(struct soap*, const char*, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
225 static size_t frecv(struct soap*, char*, size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
226 static int tcp_init(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
227 static const char *tcp_error(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
228 #ifndef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
229 static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
230 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
231 static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
232 static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
233 static int tcp_select(struct soap*, SOAP_SOCKET, int, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
234 static int tcp_disconnect(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
235 static int tcp_closesocket(struct soap*, SOAP_SOCKET);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
236 static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
237 static const char *soap_strerror(struct soap*);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
238 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
239
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
240 #define SOAP_TCP_SELECT_RCV 0x1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
241 #define SOAP_TCP_SELECT_SND 0x2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
242 #define SOAP_TCP_SELECT_ERR 0x4
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
243 #define SOAP_TCP_SELECT_ALL 0x7
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
244
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
245 #if defined(WIN32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
246 #define SOAP_SOCKBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
247 { u_long blocking = 0; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
248 ioctlsocket(fd, FIONBIO, &blocking); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
250 #define SOAP_SOCKNONBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
251 { u_long nonblocking = 1; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
252 ioctlsocket(fd, FIONBIO, &nonblocking); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
253 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
254 #elif defined(VXWORKS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
255 #define SOAP_SOCKBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
256 { u_long blocking = 0; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
257 ioctl(fd, FIONBIO, (int)(&blocking)); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
258 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
259 #define SOAP_SOCKNONBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
260 { u_long nonblocking = 1; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
261 ioctl(fd, FIONBIO, (int)(&nonblocking)); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
262 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
263 #elif defined(__VMS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
264 #define SOAP_SOCKBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
265 { int blocking = 0; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
266 ioctl(fd, FIONBIO, &blocking); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
268 #define SOAP_SOCKNONBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
269 { int nonblocking = 1; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
270 ioctl(fd, FIONBIO, &nonblocking); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
271 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
272 #elif defined(PALM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
273 #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
274 #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
275 #elif defined(SYMBIAN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
276 #define SOAP_SOCKBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
277 { long blocking = 0; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
278 ioctl(fd, 0/*FIONBIO*/, &blocking); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
280 #define SOAP_SOCKNONBLOCK(fd) \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
281 { long nonblocking = 1; \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
282 ioctl(fd, 0/*FIONBIO*/, &nonblocking); \
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
284 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
285 #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
286 #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
287 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
288
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
289 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
290
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
291 #if defined(PALM) && !defined(PALM_2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
292 unsigned short errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
293 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
294
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
295 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
296 static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
297 static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
298 static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
299 static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
300 static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
301 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
302
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
303 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
304 const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}};
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
305 const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
306 const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
307 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
308
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
309 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
310 static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
311 /* Alternative indentation form for SOAP_XML_INDENT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
312 static const char soap_indent[21] = "\n ";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
313 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
314 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
315
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
316 #ifndef SOAP_CANARY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
317 # define SOAP_CANARY (0xC0DE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
318 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
319
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
320 static const char soap_padding[4] = "\0\0\0";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
321 #define SOAP_STR_PADDING (soap_padding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
322 #define SOAP_STR_EOS (soap_padding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
323 #define SOAP_NON_NULL (soap_padding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
324
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
325 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
326 static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
327 { { 160, "nbsp" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
328 { 161, "iexcl" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
329 { 162, "cent" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
330 { 163, "pound" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
331 { 164, "curren" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
332 { 165, "yen" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
333 { 166, "brvbar" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
334 { 167, "sect" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
335 { 168, "uml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
336 { 169, "copy" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
337 { 170, "ordf" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
338 { 171, "laquo" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
339 { 172, "not" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
340 { 173, "shy" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
341 { 174, "reg" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
342 { 175, "macr" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
343 { 176, "deg" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
344 { 177, "plusmn" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
345 { 178, "sup2" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
346 { 179, "sup3" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
347 { 180, "acute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
348 { 181, "micro" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
349 { 182, "para" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
350 { 183, "middot" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
351 { 184, "cedil" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
352 { 185, "sup1" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
353 { 186, "ordm" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
354 { 187, "raquo" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
355 { 188, "frac14" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
356 { 189, "frac12" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
357 { 190, "frac34" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
358 { 191, "iquest" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
359 { 192, "Agrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
360 { 193, "Aacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
361 { 194, "Acirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
362 { 195, "Atilde" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
363 { 196, "Auml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
364 { 197, "Aring" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
365 { 198, "AElig" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
366 { 199, "Ccedil" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
367 { 200, "Egrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
368 { 201, "Eacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
369 { 202, "Ecirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
370 { 203, "Euml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
371 { 204, "Igrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
372 { 205, "Iacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
373 { 206, "Icirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
374 { 207, "Iuml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
375 { 208, "ETH" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
376 { 209, "Ntilde" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
377 { 210, "Ograve" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
378 { 211, "Oacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
379 { 212, "Ocirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
380 { 213, "Otilde" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
381 { 214, "Ouml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
382 { 215, "times" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
383 { 216, "Oslash" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
384 { 217, "Ugrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
385 { 218, "Uacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
386 { 219, "Ucirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
387 { 220, "Uuml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
388 { 221, "Yacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
389 { 222, "THORN" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
390 { 223, "szlig" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
391 { 224, "agrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
392 { 225, "aacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
393 { 226, "acirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
394 { 227, "atilde" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
395 { 228, "auml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
396 { 229, "aring" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
397 { 230, "aelig" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
398 { 231, "ccedil" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
399 { 232, "egrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
400 { 233, "eacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
401 { 234, "ecirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
402 { 235, "euml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
403 { 236, "igrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
404 { 237, "iacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
405 { 238, "icirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
406 { 239, "iuml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
407 { 240, "eth" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
408 { 241, "ntilde" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
409 { 242, "ograve" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
410 { 243, "oacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
411 { 244, "ocirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
412 { 245, "otilde" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
413 { 246, "ouml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
414 { 247, "divide" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
415 { 248, "oslash" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
416 { 249, "ugrave" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
417 { 250, "uacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
418 { 251, "ucirc" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
419 { 252, "uuml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
420 { 253, "yacute" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
421 { 254, "thorn" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
422 { 255, "yuml" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
423 { 0, NULL }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
424 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
425 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
426
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
427 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
428 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
429 static const struct soap_code_map h_error_codes[] =
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
430 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
431 #ifdef HOST_NOT_FOUND
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
432 { HOST_NOT_FOUND, "Host not found" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
433 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
434 #ifdef TRY_AGAIN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
435 { TRY_AGAIN, "Try Again" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
436 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
437 #ifdef NO_RECOVERY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
438 { NO_RECOVERY, "No Recovery" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
439 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
440 #ifdef NO_DATA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
441 { NO_DATA, "No Data" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
442 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
443 #ifdef NO_ADDRESS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
444 { NO_ADDRESS, "No Address" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
445 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
446 { 0, NULL }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
447 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
448 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
449 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
450
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
451 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
452 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
453 static const struct soap_code_map h_http_error_codes[] =
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
454 { { 200, "OK" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
455 { 201, "Created" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
456 { 202, "Accepted" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
457 { 203, "Non-Authoritative Information" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
458 { 204, "No Content" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
459 { 205, "Reset Content" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
460 { 206, "Partial Content" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
461 { 300, "Multiple Choices" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
462 { 301, "Moved Permanently" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
463 { 302, "Found" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
464 { 303, "See Other" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
465 { 304, "Not Modified" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
466 { 305, "Use Proxy" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
467 { 307, "Temporary Redirect" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
468 { 400, "Bad Request" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
469 { 401, "Unauthorized" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
470 { 402, "Payment Required" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
471 { 403, "Forbidden" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
472 { 404, "Not Found" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
473 { 405, "Method Not Allowed" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
474 { 406, "Not Acceptable" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
475 { 407, "Proxy Authentication Required" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
476 { 408, "Request Time-out" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
477 { 409, "Conflict" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
478 { 410, "Gone" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
479 { 411, "Length Required" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
480 { 412, "Precondition Failed" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
481 { 413, "Request Entity Too Large" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
482 { 414, "Request-URI Too Large" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
483 { 415, "Unsupported Media Type" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
484 { 416, "Requested range not satisfiable" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
485 { 417, "Expectation Failed" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
486 { 500, "Internal Server Error" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
487 { 501, "Not Implemented" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
488 { 502, "Bad Gateway" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
489 { 503, "Service Unavailable" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
490 { 504, "Gateway Time-out" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
491 { 505, "HTTP Version not supported" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
492 { 0, NULL }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
493 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
494 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
495 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
496
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
497 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
498 static const struct soap_code_map h_ssl_error_codes[] =
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
499 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
500 #define _SSL_ERROR(e) { e, #e }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
501 _SSL_ERROR(SSL_ERROR_SSL),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
502 _SSL_ERROR(SSL_ERROR_ZERO_RETURN),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
503 _SSL_ERROR(SSL_ERROR_WANT_READ),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
504 _SSL_ERROR(SSL_ERROR_WANT_WRITE),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
505 _SSL_ERROR(SSL_ERROR_WANT_CONNECT),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
506 _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
507 _SSL_ERROR(SSL_ERROR_SYSCALL),
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
508 { 0, NULL }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
509 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
510 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
511
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
512 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
513 static const struct soap_code_map mime_codes[] =
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
514 { { SOAP_MIME_7BIT, "7bit" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
515 { SOAP_MIME_8BIT, "8bit" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
516 { SOAP_MIME_BINARY, "binary" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
517 { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
518 { SOAP_MIME_BASE64, "base64" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
519 { SOAP_MIME_IETF_TOKEN, "ietf-token" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
520 { SOAP_MIME_X_TOKEN, "x-token" },
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
521 { 0, NULL }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
522 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
523 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
524
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
525 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
526 static int tcp_done = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
527 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
528
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
529 #if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
530 extern int h_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
531 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
532
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
533 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
534 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
535 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
536 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
537 fsend(struct soap *soap, const char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
538 { register int nwritten, err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
539 SOAP_SOCKET sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
540 #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
541 if (soap->os)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
542 { soap->os->write(s, (std::streamsize)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
543 if (soap->os->good())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
544 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
545 soap->errnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
546 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
548 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
549 sk = soap->sendsk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
550 if (!soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
551 sk = soap->socket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
552 while (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
553 { if (soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
554 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
555 if (soap->send_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
556 { for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
557 { register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
558 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
559 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
560 r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
561 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
562 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
563 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
564 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
565 r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
566 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
567 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
568 r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
569 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
570 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
571 if (!r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
572 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
573 err = soap->errnum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
574 if (!err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
575 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
576 if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
577 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
578 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
579 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
580 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
581 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
582 nwritten = SSL_write(soap->ssl, s, (int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
583 else if (soap->bio)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
584 nwritten = BIO_write(soap->bio, s, (int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
585 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
586 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
587 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
588 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
589 nwritten = gnutls_record_send(soap->session, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
590 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
591 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
592 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
593 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
594 { if (soap->peerlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
595 nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
596 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
597 nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
598 /* retry and back-off algorithm */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
599 /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
600 if (nwritten < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
601 { int udp_repeat;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
602 int udp_delay;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
603 if ((soap->connect_flags & SO_BROADCAST))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
604 udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
605 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
606 udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
607 udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
608 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
609 { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
610 if (soap->peerlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
611 nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
612 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
613 nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
614 udp_delay <<= 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
615 if (udp_delay > 500) /* UDP_UPPER_DELAY */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
616 udp_delay = 500;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
617 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
618 while (nwritten < 0 && --udp_repeat > 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
619 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
620 if (nwritten < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
621 { err = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
622 if (err && err != SOAP_EINTR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
623 { soap->errnum = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
624 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
625 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
626 nwritten = 0; /* and call write() again */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
627 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
628 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
629 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
630 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
631 #if !defined(PALM) && !defined(AS400)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
632 nwritten = send(sk, s, (int)n, soap->socket_flags);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
633 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
634 nwritten = send(sk, (void*)s, n, soap->socket_flags);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
635 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
636 if (nwritten <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
637 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
638 register int r = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
639 err = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
640 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
641 if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
642 { soap->errnum = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
643 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
644 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
645 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
646 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
647 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
648 { if (nwritten == GNUTLS_E_INTERRUPTED)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
649 err = SOAP_EINTR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
650 else if (nwritten == GNUTLS_E_AGAIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
651 err = SOAP_EAGAIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
652 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
653 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
654 if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
655 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
656 #if defined(WITH_OPENSSL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
657 if (soap->ssl && r == SSL_ERROR_WANT_READ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
658 r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
659 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
660 #elif defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
661 if (soap->session && !gnutls_record_get_direction(soap->session))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
662 r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
663 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
664 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
665 r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
666 if (!r && soap->send_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
667 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
668 if (r < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
669 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
671 else if (err && err != SOAP_EINTR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
672 { soap->errnum = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
673 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
674 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
675 nwritten = 0; /* and call write() again */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
676 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
677 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
678 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
679 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
680 #ifdef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
681 nwritten = fwrite((void*)s, 1, n, stdout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
682 fflush(stdout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
683 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
684 #ifdef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
685 nwritten = fwrite(s, 1, n, soap->sendfd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
686 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
687 #ifdef VXWORKS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
688 #ifdef WMW_RPM_IO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
689 if (soap->rpmreqid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
690 nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
691 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
692 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
693 nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
694 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
695 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
696 nwritten = _write(soap->sendfd, s, (unsigned int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
697 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
698 nwritten = write(soap->sendfd, s, (unsigned int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
699 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
700 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
701 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
702 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
703 if (nwritten <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
704 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
705 #ifndef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
706 err = soap_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
707 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
708 err = EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
709 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
710 if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
711 { soap->errnum = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
712 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
713 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
714 nwritten = 0; /* and call write() again */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
715 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
716 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
717 n -= nwritten;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
718 s += nwritten;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
719 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
720 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
721 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
722 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
723 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
724
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
725 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
726 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
727 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
728 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
729 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
730 soap_send_raw(struct soap *soap, const char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
731 { if (!n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
732 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
733 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
734 if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
735 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
736 if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
737 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
738 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
739 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
740 soap->count += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
741 else if (soap->mode & SOAP_IO)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
742 { register size_t i = SOAP_BUFLEN - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
743 while (n >= i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
744 { memcpy(soap->buf + soap->bufidx, s, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
745 soap->bufidx = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
746 if (soap_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
747 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
748 s += i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
749 n -= i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
750 i = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
751 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
752 memcpy(soap->buf + soap->bufidx, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
753 soap->bufidx += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
754 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
755 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
756 return soap_flush_raw(soap, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
757 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
758 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
759 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
760
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
761 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
762 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
763 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
764 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
765 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
766 soap_flush(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
767 { register size_t n = soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
768 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
769 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
770 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
771 if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
772 { register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
773 if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
774 return soap->error = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
775 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
776 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
777 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
778 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
779 if (soap->mode & SOAP_ENC_ZLIB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
780 { soap->d_stream->next_in = (Byte*)soap->buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
781 soap->d_stream->avail_in = (unsigned int)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
782 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
783 soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
784 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
785 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
786 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
787 if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
788 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
789 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
790 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
791 if (!soap->d_stream->avail_out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
792 { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
793 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
794 soap->d_stream->next_out = (Byte*)soap->z_buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
795 soap->d_stream->avail_out = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
796 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
797 } while (soap->d_stream->avail_in);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
798 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
799 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
800 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
801 return soap_flush_raw(soap, soap->buf, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
802 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
803 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
804 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
805 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
806
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
807 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
808 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
809 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
810 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
811 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
812 soap_flush_raw(struct soap *soap, const char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
813 { if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
814 { register char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
815 if (!(t = (char*)soap_push_block(soap, NULL, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
816 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
817 memcpy(t, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
818 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
819 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
820 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
821 if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
822 { char t[16];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
823 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
824 soap_snprintf(t, sizeof(t), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
825 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
826 sprintf(t, &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
827 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
828 DBGMSG(SENT, t, strlen(t));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
829 if ((soap->error = soap->fsend(soap, t, strlen(t))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
830 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
831 soap->chunksize += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
833 DBGMSG(SENT, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
834 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, soap->socket, soap->sendfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
835 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
836 return soap->error = soap->fsend(soap, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
837 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
838 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
839
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
840 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
841 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
842 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
843 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
844 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
845 soap_send(struct soap *soap, const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
846 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
847 return soap_send_raw(soap, s, strlen(s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
848 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
849 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
850 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
851
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
852 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
853 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
854 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
855 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
856 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
857 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
858 soap_send2(struct soap *soap, const char *s1, const char *s2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
859 { if (soap_send(soap, s1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
860 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
861 return soap_send(soap, s2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
863 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
864 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
865
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
866 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
867 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
868 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
869 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
870 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
871 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
872 soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
873 { if (soap_send(soap, s1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
874 || soap_send(soap, s2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
875 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
876 return soap_send(soap, s3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
878 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
879 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
880
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
881 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
882 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
883 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
884 static size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
885 frecv(struct soap *soap, char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
886 { register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
887 register int retries = 100; /* max 100 retries with non-blocking sockets */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
888 SOAP_SOCKET sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
889 soap->errnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
890 #if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
891 if (soap->is)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
892 { if (soap->is->good())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
893 return soap->is->read(s, (std::streamsize)n).gcount();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
894 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
895 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
896 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
897 sk = soap->recvsk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
898 if (!soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
899 sk = soap->socket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
900 if (soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
901 { for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
902 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
903 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
904 register int err = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
905 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
906 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
907 if (soap->recv_timeout && !soap->ssl) /* SSL: sockets are nonblocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
908 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
909 if (soap->recv_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
910 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
911 { for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
912 { r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
913 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
914 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
915 if (!r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
916 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
917 r = soap->errnum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
918 if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
919 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
921 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
922 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
923 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
924 { r = SSL_read(soap->ssl, s, (int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
925 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
926 return (size_t)r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
927 err = SSL_get_error(soap->ssl, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
928 if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
929 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
930 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
931 else if (soap->bio)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
932 { r = BIO_read(soap->bio, s, (int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
933 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
934 return (size_t)r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
935 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
936 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
937 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
938 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
939 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
940 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
941 { r = (int)gnutls_record_recv(soap->session, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
942 if (r >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
943 return (size_t)r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
944 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
945 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
946 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
947 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
948 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
949 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
950 { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
951 memset((void*)&soap->peer, 0, sizeof(soap->peer));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
952 r = recvfrom(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
953 soap->peerlen = (size_t)k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
954 #ifndef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
955 soap->ip = ntohl(soap->peer.sin_addr.s_addr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
956 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
957 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
958 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
959 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
960 r = recv(sk, s, (int)n, soap->socket_flags);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
961 #ifdef PALM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
962 /* CycleSyncDisplay(curStatusMsg); */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
963 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
964 if (r >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
965 return (size_t)r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
966 r = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
967 if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
968 { soap->errnum = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
969 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
970 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
971 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
972 #if defined(WITH_OPENSSL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
973 if (soap->ssl && err == SSL_ERROR_WANT_WRITE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
974 r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
975 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
976 #elif defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
977 if (soap->session && gnutls_record_get_direction(soap->session))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
978 r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
979 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
980 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
981 r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
982 if (!r && soap->recv_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
983 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
984 if (r < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
985 { r = soap->errnum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
986 if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
987 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
989 if (retries-- <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
990 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
991 #ifdef PALM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
992 r = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
993 if (r != SOAP_EINTR && retries-- <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
994 { soap->errnum = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
995 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
996 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
997 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
998 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
999 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1000 #ifdef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1001 return fread(s, 1, n, stdin);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1002 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1003 #ifdef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1004 return fread(s, 1, n, soap->recvfd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1005 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1006 #ifdef WMW_RPM_IO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1007 if (soap->rpmreqid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1008 r = httpBlockRead(soap->rpmreqid, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1009 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1010 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1011 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1012 r = _read(soap->recvfd, s, (unsigned int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1013 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1014 r = read(soap->recvfd, s, (unsigned int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1015 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1016 if (r >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1017 return (size_t)r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1018 soap->errnum = soap_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1019 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1020 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1021 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1022 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1023 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1024 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1025
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1026 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1027 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1028 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1029 static soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1030 soap_getchunkchar(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1031 { if (soap->bufidx < soap->buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1032 return soap->buf[soap->bufidx++];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1033 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1034 soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1035 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, soap->socket, soap->recvfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1036 DBGMSG(RECV, soap->buf, soap->buflen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1037 if (soap->buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1038 return soap->buf[soap->bufidx++];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1039 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1040 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1041 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1042 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1043
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1044 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1045 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1046 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1047 soap_isxdigit(int c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1048 { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1049 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1050 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1051
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1052 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1053 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1054 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1055 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1056 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1057 soap_recv_raw(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1058 { register size_t ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1059 #if !defined(WITH_LEANER) || defined(WITH_ZLIB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1060 register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1061 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1062 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1063 if (soap->mode & SOAP_ENC_ZLIB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1064 { if (soap->d_stream->next_out == Z_NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1065 { soap->bufidx = soap->buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1066 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1068 if (soap->d_stream->avail_in || !soap->d_stream->avail_out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1069 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1070 soap->d_stream->next_out = (Byte*)soap->buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1071 soap->d_stream->avail_out = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1072 r = inflate(soap->d_stream, Z_NO_FLUSH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1073 if (r == Z_NEED_DICT && soap->z_dict)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1074 r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1075 if (r == Z_OK || r == Z_STREAM_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1076 { soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1077 ret = soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1078 if (soap->zlib_in == SOAP_ZLIB_GZIP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1079 soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1080 if (r == Z_STREAM_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1081 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1082 soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1083 soap->d_stream->next_out = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1084 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1085 if (ret)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1086 { soap->count += ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1087 DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1088 DBGMSG(RECV, soap->buf, ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1089 DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1090 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1091 if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1092 return soap->error = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1093 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1094 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1095 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1096 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1097 else if (r != Z_BUF_ERROR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1098 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1099 soap->d_stream->next_out = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1100 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1101 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1102 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1103 zlib_again:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1104 if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1105 { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1106 soap->buflen = soap->z_buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1107 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1108 DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1109 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1110 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1111 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1112 if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1113 { for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1114 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1115 char *t, tmp[17];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1116 if (soap->chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1117 { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1118 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1119 DBGMSG(RECV, soap->buf, ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1120 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1121 soap->chunksize -= ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1122 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1124 t = tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1125 if (!soap->chunkbuflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1126 { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1127 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, soap->socket));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1128 DBGMSG(RECV, soap->buf, ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1129 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1130 if (!ret)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1131 { soap->ahead = EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1132 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1134 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1135 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1136 soap->bufidx = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1137 soap->buflen = soap->chunkbuflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1138 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1139 while (!soap_isxdigit((int)(c = soap_getchunkchar(soap))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1140 { if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1141 { soap->ahead = EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1142 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1144 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1145 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1146 *t++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1147 while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1148 while ((int)c != EOF && c != '\n')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1149 c = soap_getchunkchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1150 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1151 { soap->ahead = EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1152 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1153 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1154 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1155 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1156 soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1157 if (!soap->chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1158 { soap->bufidx = soap->buflen = soap->chunkbuflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1159 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1160 while ((int)c != EOF && c != '\n')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1161 c = soap_getchunkchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1162 ret = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1163 soap->ahead = EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1164 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1165 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1166 soap->buflen = soap->bufidx + soap->chunksize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1167 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1168 if (soap->buflen > soap->chunkbuflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1169 { soap->buflen = soap->chunkbuflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1170 soap->chunksize -= soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1171 soap->chunkbuflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1172 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1173 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1174 else if (soap->chunkbuflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1175 soap->chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1176 ret = soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1177 if (ret)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1178 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1179 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1180 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1181 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1182 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1183 { soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1184 soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1185 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, soap->socket, soap->recvfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1186 DBGMSG(RECV, soap->buf, ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1187 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1188 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1189 if (soap->mode & SOAP_ENC_ZLIB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1190 { memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1191 soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1192 soap->d_stream->avail_in = (unsigned int)ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1193 soap->d_stream->next_out = (Byte*)soap->buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1194 soap->d_stream->avail_out = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1195 r = inflate(soap->d_stream, Z_NO_FLUSH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1196 if (r == Z_NEED_DICT && soap->z_dict)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1197 r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1198 if (r == Z_OK || r == Z_STREAM_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1199 { soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1200 soap->z_buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1201 soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1202 if (soap->zlib_in == SOAP_ZLIB_GZIP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1203 soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1204 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1205 if (ret && !soap->buflen && r != Z_STREAM_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1206 goto zlib_again;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1207 ret = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1208 if (r == Z_STREAM_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1209 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1210 soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1211 soap->d_stream->next_out = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1213 DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1214 DBGMSG(RECV, soap->buf, ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1215 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1216 if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1217 return soap->error = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1218 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1219 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1220 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1221 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1222 soap->d_stream->next_out = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1223 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1224 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1225 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1226 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1227 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1228 if (soap->fpreparerecv
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1229 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1230 && soap->zlib_in == SOAP_ZLIB_NONE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1231 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1232 && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1233 return soap->error = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1234 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1235 soap->count += ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1236 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=%lu (+%lu)\n", (unsigned long)soap->count, (unsigned long)ret));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1237 return !ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1238 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1239 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1240
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1241 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1242 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1243 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1244 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1245 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1246 soap_recv(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1247 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1248 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1249 if (soap->mode & SOAP_ENC_DIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1250 { if (soap->dime.buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1251 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1252 int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1253 unsigned char tmp[12];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1254 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1255 soap->count += soap->dime.buflen - soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1256 soap->buflen = soap->dime.buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1257 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1258 for (i = -(long)soap->dime.size&3; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1259 { soap->bufidx++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1260 if (soap->bufidx >= soap->buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1261 if (soap_recv_raw(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1262 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1263 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1264 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1265 s = (char*)tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1266 for (i = 12; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1267 { *s++ = soap->buf[soap->bufidx++];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1268 if (soap->bufidx >= soap->buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1269 if (soap_recv_raw(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1270 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1271 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1272 soap->dime.flags = tmp[0] & 0x7;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1273 soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1274 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1275 if (soap->dime.flags & SOAP_DIME_CF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1276 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1277 soap->dime.chunksize = soap->dime.size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1278 if (soap->buflen - soap->bufidx >= soap->dime.size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1279 { soap->dime.buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1280 soap->buflen = soap->bufidx + soap->dime.chunksize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1282 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1283 soap->dime.chunksize -= soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1284 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1285 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1286 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1287 soap->dime.buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1288 soap->dime.chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1289 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1290 soap->count = soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1291 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1292 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1293 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1294 if (soap->dime.chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1295 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1296 if (soap_recv_raw(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1297 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1298 if (soap->buflen - soap->bufidx >= soap->dime.chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1299 { soap->dime.buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1300 soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1301 soap->buflen = soap->bufidx + soap->dime.chunksize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1302 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1303 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1304 soap->dime.chunksize -= soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1305 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%lu\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned long)soap->count));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1306 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1307 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1308 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1309 while (soap->ffilterrecv)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1310 { int err, last = soap->filterstop;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1311 if (last)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1312 soap->bufidx = soap->buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1313 if ((err = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1314 return soap->error = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1315 if (soap->buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1316 { soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1317 soap->filterstop = last;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1318 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1320 if (last)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1321 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", last));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1322 soap->filterstop = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1323 return last;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1324 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1325 soap->filterstop = soap_recv_raw(soap); /* do not call again after EOF */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1327 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1328 return soap_recv_raw(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1329 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1330 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1331
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1332 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1333 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1334 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1335 soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1336 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1337 soap_getchar(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1338 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1339 c = soap->ahead;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1340 if (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1341 { if (c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1342 soap->ahead = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1343 return c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1345 return soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1347 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1348
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1349 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1350 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1351 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1352 const struct soap_code_map*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1353 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1354 soap_code(const struct soap_code_map *code_map, const char *str)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1355 { if (code_map && str)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1356 { while (code_map->string)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1357 { if (!strcmp(str, code_map->string)) /* case sensitive */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1358 return code_map;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1359 code_map++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1360 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1361 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1362 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1363 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1364 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1365
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1366 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1367 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1368 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1369 long
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1370 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1371 soap_code_int(const struct soap_code_map *code_map, const char *str, long other)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1372 { if (code_map)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1373 { while (code_map->string)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1374 { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1375 return code_map->code;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1376 code_map++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1379 return other;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1380 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1381 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1382
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1383 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1384 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1385 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1386 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1387 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1388 soap_code_str(const struct soap_code_map *code_map, long code)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1389 { if (!code_map)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1390 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1391 while (code_map->code != code && code_map->string)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1392 code_map++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1393 return code_map->string;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1394 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1395 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1396
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1397 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1398 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1399 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1400 long
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1401 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1402 soap_code_bits(const struct soap_code_map *code_map, const char *str)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1403 { register long bits = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1404 if (code_map)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1405 { while (str && *str)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1406 { const struct soap_code_map *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1407 for (p = code_map; p->string; p++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1408 { register size_t n = strlen(p->string);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1409 if (!strncmp(p->string, str, n) && soap_blank((soap_wchar)str[n]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1410 { bits |= p->code;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1411 str += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1412 while (*str > 0 && *str <= 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1413 str++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1414 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1415 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1416 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1417 if (!p->string)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1418 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1419 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1420 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1421 return bits;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1422 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1423 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1424
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1425 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1426 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1427 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1428 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1429 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1430 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1431 { register char *t = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1432 if (code_map)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1433 { while (code_map->string)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1434 { if (code_map->code & code)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1435 { register const char *s = code_map->string;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1436 if (t != soap->tmpbuf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1437 *t++ = ' ';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1438 while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1439 *t++ = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1440 if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1441 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1442 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1443 code_map++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1444 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1446 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1447 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1448 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1449 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1450
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1451 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1452 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1453 static soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1454 soap_char(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1455 { char tmp[8];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1456 register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1457 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1458 register char *s = tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1459 for (i = 0; i < 7; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1460 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1461 if (c == ';' || (int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1462 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1463 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1464 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1465 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1466 if (*tmp == '#')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1467 { if (tmp[1] == 'x' || tmp[1] == 'X')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1468 return (soap_wchar)soap_strtol(tmp + 2, NULL, 16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1469 return (soap_wchar)soap_strtol(tmp + 1, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1470 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1471 if (!strcmp(tmp, "lt"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1472 return '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1473 if (!strcmp(tmp, "gt"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1474 return '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1475 if (!strcmp(tmp, "amp"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1476 return '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1477 if (!strcmp(tmp, "quot"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1478 return '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1479 if (!strcmp(tmp, "apos"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1480 return '\'';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1481 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1482 return (soap_wchar)soap_code_int(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1483 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1484 return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1485 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1486 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1487 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1488
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1489 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1490 #ifdef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1491 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1492 soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1493 soap_get0(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1494 { if (soap->bufidx >= soap->buflen && soap_recv(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1495 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1496 return (unsigned char)soap->buf[soap->bufidx];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1497 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1498 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1499 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1500
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1501 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1502 #ifdef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1503 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1504 soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1505 soap_get1(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1506 { if (soap->bufidx >= soap->buflen && soap_recv(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1507 return EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1508 return (unsigned char)soap->buf[soap->bufidx++];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1510 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1511 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1512
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1513 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1514 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1515 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1516 soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1517 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1518 soap_get(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1519 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1520 c = soap->ahead;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1521 if (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1522 { if ((int)c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1523 soap->ahead = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1524 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1525 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1526 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1527 while ((int)c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1528 { if (soap->cdata)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1529 { if (c == ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1530 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1531 if (c == ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1532 { c = soap_get0(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1533 if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1534 { soap->cdata = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1535 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1536 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1537 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1538 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1539 { soap_unget(soap, ']');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1540 return ']';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1541 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1542 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1543 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1544 { soap_revget1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1545 return ']';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1546 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1548 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1549 return c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1550 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1551 switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1552 { case '<':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1553 do c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1554 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1555 if (c == '!' || c == '?' || c == '%')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1556 { register int k = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1557 if (c == '!')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1558 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1559 if (c == '[')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1560 { do c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1561 while ((int)c != EOF && c != '[');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1562 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1563 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1564 soap->cdata = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1565 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1566 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1567 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1568 if (c == '-' && (c = soap_get1(soap)) == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1569 { do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1570 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1571 if (c == '-' && (c = soap_get1(soap)) == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1572 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1573 } while ((int)c != EOF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1574 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1576 else if (c == '?')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1577 c = soap_get_pi(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1578 while ((int)c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1579 { if (c == '<')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1580 k++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1581 else if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1582 { if (--k <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1583 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1584 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1585 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1587 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1588 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1589 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1590 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1591 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1592 if (c == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1593 return SOAP_TT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1594 soap_revget1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1595 return SOAP_LT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1596 case '>':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1597 return SOAP_GT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1598 case '"':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1599 return SOAP_QT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1600 case '\'':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1601 return SOAP_AP;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1602 case '&':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1603 return soap_char(soap) | 0x80000000;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1604 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1605 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1606 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1607 return c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1608 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1609 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1610
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1611 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1612 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1613 static soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1614 soap_get_pi(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1615 { char buf[64];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1616 register char *s = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1617 register int i = sizeof(buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1618 register soap_wchar c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1619 /* This is a quick way to parse XML PI and we could use a callback instead to
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1620 * enable applications to intercept processing instructions */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1621 while ((int)c != EOF && c != '?')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1622 { if (--i > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1623 { if (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1624 c = ' ';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1625 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1626 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1627 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1628 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1629 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1630 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <?%s?>\n", buf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1631 if (!strncmp(buf, "xml ", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1632 { s = strstr(buf, " encoding=");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1633 if (s && s[10])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1634 { if (!soap_tag_cmp(s + 11, "iso-8859-1*")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1635 || !soap_tag_cmp(s + 11, "latin1*"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1636 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1637 soap->mode |= SOAP_ENC_LATIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1638 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1639 else if (!soap_tag_cmp(s + 11, "utf-8*"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1640 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1641 soap->mode &= ~SOAP_ENC_LATIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1643 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1644 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1645 if ((int)c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1646 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1647 return c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1648 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1649 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1650
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1651 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1652 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1653 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1654 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1655 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1656 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1657 soap_move(struct soap *soap, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1658 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %lu bytes forward\n", (unsigned long)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1659 for (; n; n--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1660 if ((int)soap_getchar(soap) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1661 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1662 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1663 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1664 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1665 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1666
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1667 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1668 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1669 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1670 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1671 size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1672 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1673 soap_tell(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1674 { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1675 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1676 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1677 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1678
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1679 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1680 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1681 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1682 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1683 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1684 soap_pututf8(struct soap *soap, register unsigned long c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1685 { char tmp[16];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1686 if (c < 0x80 && c > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1687 { *tmp = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1688 return soap_send_raw(soap, tmp, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1690 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1691 if (c >= 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1692 { register char *t = tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1693 if (c < 0x0800)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1694 *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1695 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1696 { if (c < 0x010000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1697 *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1698 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1699 { if (c < 0x200000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1700 *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1701 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1702 { if (c < 0x04000000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1703 *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1704 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1705 { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1706 *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1707 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1708 *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1709 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1710 *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1711 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1712 *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1713 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1714 *t++ = (char)(0x80 | (c & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1715 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1716 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1717 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1718 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1719 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1720 soap_snprintf(tmp, sizeof(tmp), "&#%lu;", c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1721 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1722 sprintf(tmp, "&#%lu;", c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1723 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1724 return soap_send(soap, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1725 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1726 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1727
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1728 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1729 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1730 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1731 soap_wchar
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1732 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1733 soap_getutf8(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1734 { register soap_wchar c, c1, c2, c3, c4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1735 c = soap->ahead;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1736 if (c >= 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1737 soap->ahead = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1738 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1739 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1740 if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1741 return c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1742 c1 = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1743 if (c1 < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1744 { soap_revget1(soap); /* doesn't look like this is UTF8 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1745 return c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1746 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1747 c1 &= 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1748 if (c < 0xE0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1749 return ((soap_wchar)(c & 0x1F) << 6) | c1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1750 c2 = (soap_wchar)soap_get1(soap) & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1751 if (c < 0xF0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1752 return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1753 c3 = (soap_wchar)soap_get1(soap) & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1754 if (c < 0xF8)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1755 return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1756 c4 = (soap_wchar)soap_get1(soap) & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1757 if (c < 0xFC)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1758 return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1759 return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1760 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1761 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1762
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1763 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1764 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1765 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1766 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1767 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1768 soap_puthex(struct soap *soap, const unsigned char *s, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1769 { char d[2];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1770 register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1771 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1772 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1773 { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1774 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1775 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1776 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1777 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1778 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1779 { register int m = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1780 d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0'));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1781 m &= 0x0F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1782 d[1] = (char)(m + (m > 9 ? '7' : '0'));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1783 if (soap_send_raw(soap, d, 2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1784 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1785 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1786 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1787 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1788 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1789
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1790 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1791 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1792 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1793 unsigned char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1794 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1795 soap_gethex(struct soap *soap, int *n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1796 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1797 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1798 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1799 { soap->dom->data = soap_string_in(soap, 0, -1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1800 return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1801 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1802 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1803 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1804 soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1805 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1806 { register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1807 register size_t i, k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1808 if (soap_append_lab(soap, NULL, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1809 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1810 s = soap->labbuf + soap->labidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1811 k = soap->lablen - soap->labidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1812 soap->labidx = soap->lablen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1813 for (i = 0; i < k; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1814 { register char d1, d2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1815 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1816 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1817 if (soap_isxdigit(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1818 { d1 = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1819 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1820 if (soap_isxdigit(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1821 d2 = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1822 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1823 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1824 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1825 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1826 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1827 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1828 { unsigned char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1829 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1830 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1831 *n = (int)(soap->lablen + i - k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1832 p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1833 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1834 memcpy(p, soap->labbuf, soap->lablen + i - k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1835 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1836 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1837 *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1838 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1839 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1840 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1841 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1842 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1843 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1844 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1845 register char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1846 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1847 { soap_end_block(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1848 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1849 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1850 for (i = 0; i < SOAP_BLKLEN; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1851 { register char d1, d2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1852 register soap_wchar c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1853 if (soap_isxdigit(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1854 { d1 = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1855 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1856 if (soap_isxdigit(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1857 d2 = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1858 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1859 { soap_end_block(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1860 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1861 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1863 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1864 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1865 { unsigned char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1866 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1867 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1868 *n = (int)soap_size_block(soap, NULL, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1869 p = (unsigned char*)soap_save_block(soap, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1870 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1872 *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1873 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1874 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1875 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1876 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1877 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1878
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1879 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1880 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1881 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1882 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1883 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1884 soap_putbase64(struct soap *soap, const unsigned char *s, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1885 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1886 register unsigned long m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1887 char d[4];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1888 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1889 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1890 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1891 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1892 { if (!(soap->dom->data = soap_s2base64(soap, s, NULL, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1893 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1894 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1895 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1896 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1897 for (; n > 2; n -= 3, s += 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1898 { m = s[0];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1899 m = (m << 8) | s[1];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1900 m = (m << 8) | s[2];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1901 for (i = 4; i > 0; m >>= 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1902 d[--i] = soap_base64o[m & 0x3F];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1903 if (soap_send_raw(soap, d, 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1904 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1905 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1906 if (n > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1907 { m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1908 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1909 m = (m << 8) | *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1910 for (; i < 3; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1911 m <<= 8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1912 for (i++; i > 0; m >>= 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1913 d[--i] = soap_base64o[m & 0x3F];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1914 for (i = 3; i > n; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1915 d[i] = '=';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1916 if (soap_send_raw(soap, d, 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1917 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1918 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1919 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1921 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1922
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1923 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1924 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1925 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1926 unsigned char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1927 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1928 soap_getbase64(struct soap *soap, int *n, int malloc_flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1929 { (void)malloc_flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1930 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1931 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1932 { soap->dom->data = soap_string_in(soap, 0, -1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1933 return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1934 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1935 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1936 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1937 soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1938 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1939 { register size_t i, k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1940 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1941 if (soap_append_lab(soap, NULL, 2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1942 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1943 s = soap->labbuf + soap->labidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1944 k = soap->lablen - soap->labidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1945 soap->labidx = 3 * (soap->lablen / 3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1946 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1947 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1948 if (k > 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1949 { for (i = 0; i < k - 2; i += 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1950 { register unsigned long m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1951 register int j = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1952 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1953 { register soap_wchar c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1954 if (c < SOAP_AP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1955 c &= 0x7FFFFFFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1956 if (c == '=' || c < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1957 { unsigned char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1958 switch (j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1959 { case 2:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1960 *s++ = (char)((m >> 4) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1961 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1962 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1963 case 3:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1964 *s++ = (char)((m >> 10) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1965 *s++ = (char)((m >> 2) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1966 i += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1967 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1968 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1969 *n = (int)(soap->lablen + i - k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1970 p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1971 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1972 memcpy(p, soap->labbuf, soap->lablen + i - k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1973 if (c >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1974 { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1975 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1976 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1977 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1978 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1980 c -= '+';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1981 if (c >= 0 && c <= 79)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1982 { register int b = soap_base64i[c];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1983 if (b >= 64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1984 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1985 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1986 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1987 m = (m << 6) + b;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1988 j++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1989 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1990 else if (!soap_blank(c + '+'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1991 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1992 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1993 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1994 } while (j < 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1995 *s++ = (char)((m >> 16) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1996 *s++ = (char)((m >> 8) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1997 *s++ = (char)(m & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1998 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
1999 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2000 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2001 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2002 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2003 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2004 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2005 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2006 register char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2007 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2008 { soap_end_block(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2009 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2010 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2011 for (i = 0; i < SOAP_BLKLEN; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2012 { register unsigned long m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2013 register int j = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2014 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2015 { register soap_wchar c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2016 if (c == '=' || c < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2017 { unsigned char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2018 i *= 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2019 switch (j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2020 { case 2:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2021 *s++ = (char)((m >> 4) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2022 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2023 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2024 case 3:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2025 *s++ = (char)((m >> 10) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2026 *s++ = (char)((m >> 2) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2027 i += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2028 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2029 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2030 *n = (int)soap_size_block(soap, NULL, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2031 p = (unsigned char*)soap_save_block(soap, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2032 if (c >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2033 { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2034 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2035 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2036 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2037 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2038 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2039 c -= '+';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2040 if (c >= 0 && c <= 79)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2041 { int b = soap_base64i[c];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2042 if (b >= 64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2043 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2044 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2045 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2046 m = (m << 6) + b;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2047 j++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2048 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2049 else if (!soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2050 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2051 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2052 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2053 } while (j < 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2054 *s++ = (char)((m >> 16) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2055 *s++ = (char)((m >> 8) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2056 *s++ = (char)(m & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2057 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2058 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2059 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2060 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2061 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2062
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2063 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2064 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2065 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2066 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2067 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2068 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2069 soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2070 { /* Check MTOM xop:Include element (within hex/base64Binary) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2071 /* TODO: this code to be obsoleted with new import/xop.h conventions */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2072 short body = soap->body; /* should save type too? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2073 if (!soap_peek_element(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2074 { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2075 { if (soap_dime_forward(soap, ptr, size, id, type, options)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2076 || (soap->body && soap_element_end_in(soap, "xop:Include")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2077 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2078 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2079 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2080 soap->body = body;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2081 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2082 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2083 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2084 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2085
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2086 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2087 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2088 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2089 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2090 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2091 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2092 soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2093 { struct soap_xlist *xp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2094 *ptr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2095 *size = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2096 *id = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2097 *type = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2098 *options = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2099 if (!*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2100 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2101 *id = soap_strdup(soap, soap->href);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2102 xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2103 if (!xp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2104 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2105 xp->next = soap->xlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2106 xp->ptr = ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2107 xp->size = size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2108 xp->id = *id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2109 xp->type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2110 xp->options = options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2111 soap->xlist = xp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2112 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2113 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2114 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2115 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2116
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2117 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2118 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2119 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2120 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2121 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2122 soap_strdup(struct soap *soap, const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2123 { char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2124 if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2125 strcpy(t, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2126 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2127 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2128 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2129
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2130 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2131 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2132 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2133 wchar_t *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2134 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2135 soap_wstrdup(struct soap *soap, const wchar_t *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2136 { wchar_t *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2137 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2138 { size_t n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2139 while (s[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2140 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2141 if ((t = (wchar_t*)soap_malloc(soap, sizeof(wchar_t)*(n+1))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2142 memcpy(t, s, sizeof(wchar_t)*(n+1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2144 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2146 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2147
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2148 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2149 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2150 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2151 struct soap_blist*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2152 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2153 soap_new_block(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2154 { struct soap_blist *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2155 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2156 if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2157 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2158 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2159 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2160 p->next = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2161 p->ptr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2162 p->size = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2163 soap->blist = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2164 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2165 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2166 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2167
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2168 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2169 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2170 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2171 void*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2172 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2173 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2174 { char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2175 if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2176 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2177 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)b->size + (unsigned int)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2178 if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(char*) + sizeof(size_t))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2179 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2180 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2181 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2182 *(char**)p = b->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2183 *(size_t*)(p + sizeof(char*)) = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2184 b->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2185 b->size += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2186 return p + sizeof(char*) + sizeof(size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2187 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2188 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2189
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2190 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2191 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2192 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2193 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2194 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2195 soap_pop_block(struct soap *soap, struct soap_blist *b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2196 { char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2197 if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2198 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2199 if (!b->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2200 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2201 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2202 p = b->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2203 b->size -= *(size_t*)(p + sizeof(char*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2204 b->ptr = *(char**)p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2205 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2206 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2207 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2208
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2209 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2210 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2211 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2212 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2213 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2214 soap_update_pointers(struct soap *soap, char *start, char *end, char *p1, char *p2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2215 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2216 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2217 int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2218 register struct soap_ilist *ip = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2219 register struct soap_flist *fp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2220 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2221 register struct soap_xlist *xp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2222 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2223 register void *p, **q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2224 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2225 { for (ip = soap->iht[i]; ip; ip = ip->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2226 { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2227 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + (p1-p2)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2228 ip->ptr = (char*)ip->ptr + (p1-p2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2229 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2230 for (q = &ip->link; q; q = (void**)p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2231 { p = *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2232 if (p && (char*)p >= start && (char*)p < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2233 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2234 *q = (char*)p + (p1-p2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2235 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2236 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2237 for (q = &ip->copy; q; q = (void**)p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2238 { p = *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2239 if (p && (char*)p >= start && (char*)p < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2240 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2241 *q = (char*)p + (p1-p2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2242 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2243 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2244 for (fp = ip->flist; fp; fp = fp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2245 { if ((char*)fp->ptr >= start && (char*)fp->ptr < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2246 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2247 fp->ptr = (char*)fp->ptr + (p1-p2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2248 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2250 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2251 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2252 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2253 for (xp = soap->xlist; xp; xp = xp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2254 { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2255 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, xp->ptr, (char*)xp->ptr + (p1-p2)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2256 xp->ptr = (unsigned char**)((char*)xp->ptr + (p1-p2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2257 xp->size = (int*)((char*)xp->size + (p1-p2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2258 xp->type = (char**)((char*)xp->type + (p1-p2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2259 xp->options = (char**)((char*)xp->options + (p1-p2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2260 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2261 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2262 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2263 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2264 (void)soap; (void)start; (void)end; (void)p1; (void)p2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2265 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2266 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2267 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2268
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2269 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2270 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2271 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2272 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2273 soap_has_copies(struct soap *soap, register const char *start, register const char *end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2274 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2275 register struct soap_ilist *ip = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2276 register struct soap_flist *fp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2277 register const char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2278 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2279 { for (ip = soap->iht[i]; ip; ip = ip->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2280 { for (p = (const char*)ip->copy; p; p = *(const char**)p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2281 if (p >= start && p < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2282 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2283 for (fp = ip->flist; fp; fp = fp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2284 if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2285 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2286 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2288 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2289 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2290 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2291 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2292
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2293 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2294 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2295 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2296 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2297 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2298 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2299 soap_resolve(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2300 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2301 register struct soap_ilist *ip = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2302 register struct soap_flist *fp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2303 short flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2304 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2305 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2306 { for (ip = soap->iht[i]; ip; ip = ip->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2307 { if (ip->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2308 { register void *p, **q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2309 q = (void**)ip->link;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2310 ip->link = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2311 r = ip->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2312 DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s'\n", ip->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2313 while (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2314 { p = *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2315 *q = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2316 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, r));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2317 q = (void**)p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2318 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2320 else if (*ip->id == '#')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2321 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing data for id='%s'\n", ip->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2322 strcpy(soap->id, ip->id + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2323 return soap->error = SOAP_MISSING_ID;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2324 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2327 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2328 { flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2329 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2330 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2331 { for (ip = soap->iht[i]; ip; ip = ip->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2332 { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2333 { if (ip->copy)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2334 { register void *p, **q = (void**)ip->copy;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2335 DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2336 ip->copy = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2337 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2338 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2339 p = *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2340 memcpy(q, ip->ptr, ip->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2341 q = (void**)p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2342 } while (q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2343 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2345 for (fp = ip->flist; fp; fp = ip->flist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2346 { register unsigned int k = fp->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2347 register void *p = ip->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2348 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d location=%p level=%u,%u id='%s'\n", ip->type, p, ip->level, fp->level, ip->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2349 while (ip->level < k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2350 { register void **q = (void**)soap_malloc(soap, sizeof(void*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2351 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2352 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2353 *q = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2354 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2355 p = (void*)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2356 k--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2357 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2358 if (fp->fcopy)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2359 fp->fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2360 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2361 soap_fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2362 ip->flist = fp->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2363 SOAP_FREE(soap, fp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2364 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2365 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2366 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2367 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2368 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2369 } while (flag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2370 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2371 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2372 { for (ip = soap->iht[i]; ip; ip = ip->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2373 { if (ip->copy || ip->flist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2374 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the developers\n", ip->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2375 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2376 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2378 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2379 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2380 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2382 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2383 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2384
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2385 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2386 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2387 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2388 size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2389 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2390 soap_size_block(struct soap *soap, struct soap_blist *b, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2391 { if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2392 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2393 if (b->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2394 { b->size -= *(size_t*)(b->ptr + sizeof(char*)) - n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2395 *(size_t*)(b->ptr + sizeof(char*)) = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2396 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2397 return b->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2398 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2399 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2400
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2401 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2402 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2403 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2404 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2405 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2406 soap_first_block(struct soap *soap, struct soap_blist *b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2407 { char *p, *q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2408 if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2409 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2410 p = b->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2411 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2412 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2413 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2414 r = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2415 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2416 { q = *(char**)p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2417 *(char**)p = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2418 r = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2419 p = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2420 } while (p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2421 b->ptr = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2422 return r + sizeof(char*) + sizeof(size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2423 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2424 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2425
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2426 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2427 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2428 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2429 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2430 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2431 soap_next_block(struct soap *soap, struct soap_blist *b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2432 { char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2433 if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2434 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2435 p = b->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2436 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2437 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2438 b->ptr = *(char**)p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2439 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2440 if (b->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2441 return b->ptr + sizeof(char*) + sizeof(size_t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2442 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2443 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2444 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2445 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2446
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2447 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2448 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2449 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2450 size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2451 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2452 soap_block_size(struct soap *soap, struct soap_blist *b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2453 { if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2454 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2455 return *(size_t*)(b->ptr + sizeof(char*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2456 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2457 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2458
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2459 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2460 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2461 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2462 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2463 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2464 soap_end_block(struct soap *soap, struct soap_blist *b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2465 { char *p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2466 if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2467 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2468 if (b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2469 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2470 for (p = b->ptr; p; p = q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2471 { q = *(char**)p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2472 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2474 if (soap->blist == b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2475 soap->blist = b->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2476 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2477 { struct soap_blist *bp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2478 for (bp = soap->blist; bp; bp = bp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2479 { if (bp->next == b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2480 { bp->next = b->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2481 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2482 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2483 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2485 SOAP_FREE(soap, b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2486 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2487 DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2488 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2489 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2490
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2491 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2492 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2493 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2494 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2495 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2496 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2497 { register size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2498 register char *q, *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2499 if (!b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2500 b = soap->blist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2501 if (b->size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2502 { if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2503 p = (char*)soap_malloc(soap, b->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2504 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)b->size, b->ptr, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2505 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2506 { for (s = p, q = soap_first_block(soap, b); q; q = soap_next_block(soap, b))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2507 { n = soap_block_size(soap, b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2508 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2509 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2510 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2511 soap_update_pointers(soap, q, q + n, s, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2512 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2513 memcpy(s, q, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2514 s += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2516 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2517 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2518 soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2519 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2520 soap_end_block(soap, b);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2521 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2522 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2523 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2524
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2525 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2526 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2527 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2528 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2529 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2530 soap_putsize(struct soap *soap, const char *type, int size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2531 { return soap_putsizes(soap, type, &size, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2532 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2533 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2534
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2535 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2536 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2537 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2538 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2539 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2540 soap_putsizes(struct soap *soap, const char *type, const int *size, int dim)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2541 { return soap_putsizesoffsets(soap, type, size, NULL, dim);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2542 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2543 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2544
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2545 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2546 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2547 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2548 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2549 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2550 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2551 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2552 register size_t l;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2553 if (!type || strlen(type) + 13 > sizeof(soap->type)) /* prevent overruns */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2554 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2555 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2556 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2557 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2558 soap_snprintf(soap->type, sizeof(soap->type) - 1, "%s[%d", type, size[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2559 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2560 sprintf(soap->type, "%s[%d", type, size[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2561 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2562 for (i = 1; i < dim; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2563 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2564 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2565 l = strlen(soap->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2566 soap_snprintf(soap->type + l, sizeof(soap->type) - l - 1, " %d", size[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2567 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2568 if ((l = strlen(soap->type)) + 13 > sizeof(soap->type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2569 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2570 sprintf(soap->type + l, " %d", size[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2571 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2572 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2573 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2574 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2575 { if (offset)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2576 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2577 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2578 soap_snprintf(soap->type, sizeof(soap->type) - 1, "%s[%d", type, size[0] + offset[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2579 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2580 sprintf(soap->type, "%s[%d", type, size[0] + offset[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2581 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2582 for (i = 1; i < dim; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2583 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2584 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2585 l = strlen(soap->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2586 soap_snprintf(soap->type + l, sizeof(soap->type) - l - 1, ",%d", size[i] + offset[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2587 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2588 if ((l = strlen(soap->type)) + 13 > sizeof(soap->type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2589 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2590 sprintf(soap->type + l, ",%d", size[i] + offset[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2591 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2592 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2593 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2594 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2595 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2596 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2597 soap_snprintf(soap->type, sizeof(soap->type) - 1, "%s[%d", type, size[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2598 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2599 sprintf(soap->type, "%s[%d", type, size[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2600 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2601 for (i = 1; i < dim; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2602 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2603 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2604 l = strlen(soap->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2605 soap_snprintf(soap->type + l, sizeof(soap->type) - l - 1, ",%d", size[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2606 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2607 if ((l = strlen(soap->type)) + 13 > sizeof(soap->type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2608 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2609 sprintf(soap->type + l, ",%d", size[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2610 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2611 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2612 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2613 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2614 strcat(soap->type, "]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2615 return soap->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2616 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2617 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2618
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2619 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2620 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2621 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2622 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2623 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2624 soap_putoffset(struct soap *soap, int offset)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2625 { return soap_putoffsets(soap, &offset, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2626 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2627 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2628
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2629 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2630 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2631 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2632 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2633 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2634 soap_putoffsets(struct soap *soap, const int *offset, int dim)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2635 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2636 register size_t l;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2637 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2638 soap_snprintf(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, "[%d", offset[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2639 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2640 if (sizeof(soap->arrayOffset) < 13) /* prevent overruns */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2641 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2642 sprintf(soap->arrayOffset, "[%d", offset[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2643 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2644 for (i = 1; i < dim; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2645 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2646 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2647 l = strlen(soap->arrayOffset);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2648 soap_snprintf(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, ",%d", offset[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2649 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2650 if ((l = strlen(soap->arrayOffset)) + 13 > sizeof(soap->arrayOffset))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2651 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2652 sprintf(soap->arrayOffset + l, ",%d", offset[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2653 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2654 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2655 strcat(soap->arrayOffset, "]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2656 return soap->arrayOffset;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2657 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2658 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2659
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2660 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2661 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2662 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2663 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2664 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2665 soap_size(const int *size, int dim)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2666 { register int i, n = size[0];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2667 for (i = 1; i < dim; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2668 n *= size[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2669 return n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2671 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2672
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2673 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2674 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2675 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2676 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2677 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2678 soap_getoffsets(const char *attr, const int *size, int *offset, int dim)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2679 { register int i, j = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2680 if (offset)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2681 for (i = 0; i < dim && attr && *attr; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2682 { attr++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2683 j *= size[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2684 j += offset[i] = (int)soap_strtol(attr, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2685 attr = strchr(attr, ',');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2686 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2687 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2688 for (i = 0; i < dim && attr && *attr; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2689 { attr++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2690 j *= size[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2691 j += (int)soap_strtol(attr, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2692 attr = strchr(attr, ',');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2693 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2694 return j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2695 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2696 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2697
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2698 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2699 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2700 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2701 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2702 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2703 soap_getsize(const char *attr1, const char *attr2, int *j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2704 { register int n, k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2705 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2706 *j = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2707 if (!*attr1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2708 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2709 if (*attr1 == '[')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2710 attr1++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2711 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2712 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2713 { k = (int)soap_strtol(attr1, &s, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2714 n *= k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2715 if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2716 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2717 attr1 = strchr(s, ',');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2718 if (!attr1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2719 attr1 = strchr(s, ' ');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2720 if (attr2 && *attr2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2721 { attr2++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2722 *j *= k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2723 k = (int)soap_strtol(attr2, &s, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2724 *j += k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2725 if (k < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2726 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2727 attr2 = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2728 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2729 if (!attr1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2730 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2731 attr1++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2732 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2733 return n - *j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2734 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2735 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2736
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2737 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2738 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2739 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2740 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2741 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2742 soap_getsizes(const char *attr, int *size, int dim)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2743 { register int i, k, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2744 if (!*attr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2745 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2746 i = (int)strlen(attr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2747 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2748 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2749 { for (i = i-1; i >= 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2750 if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2751 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2752 k = (int)soap_strtol(attr + i + 1, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2753 n *= size[--dim] = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2754 if (k < 0 || n > SOAP_MAXARRAYSIZE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2755 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2756 } while (i >= 0 && attr[i] != '[');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2757 return n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2758 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2759 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2760
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2761 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2762 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2763 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2764 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2765 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2766 soap_getposition(const char *attr, int *pos)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2767 { register int i, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2768 if (!*attr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2769 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2770 n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2771 i = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2772 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2773 { pos[n++] = (int)soap_strtol(attr + i, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2774 while (attr[i] && attr[i] != ',' && attr[i] != ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2775 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2776 if (attr[i] == ',')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2777 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2778 } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2779 return n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2780 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2781 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2782
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2783 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2784 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2785 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2786 struct soap_nlist *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2787 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2788 soap_push_namespace(struct soap *soap, const char *id, const char *ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2789 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2790 register struct Namespace *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2791 register short i = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2792 register size_t n, k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2793 n = strlen(id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2794 k = strlen(ns) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2795 p = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2796 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2797 { for (i = 0; p->id; p++, i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2798 { if (p->ns && !strcmp(ns, p->ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2799 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2800 if (p->out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2801 { if (!strcmp(ns, p->out))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2802 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2803 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2804 else if (p->in)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2805 { if (!soap_tag_cmp(ns, p->in))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2806 { if ((p->out = (char*)SOAP_MALLOC(soap, k)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2807 strcpy(p->out, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2808 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2809 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2810 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2811 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2812 if (!p || !p->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2813 i = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2814 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2815 if (i >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2816 k = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2817 np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2818 if (!np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2819 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2820 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2821 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2822 np->next = soap->nlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2823 soap->nlist = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2824 np->level = soap->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2825 np->index = i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2826 strcpy((char*)np->id, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2827 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2828 if (i < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2829 { np->ns = strcpy((char*)np->id + n + 1, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2830 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2831 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2832 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2833 { np->ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2834 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2835 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2836 return np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2837 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2838 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2839
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2840 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2841 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2842 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2843 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2844 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2845 soap_pop_namespace(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2846 { register struct soap_nlist *np, *nq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2847 for (np = soap->nlist; np && np->level >= soap->level; np = nq)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2848 { nq = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2849 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s'\n", soap->level, np->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2850 SOAP_FREE(soap, np);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2851 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2852 soap->nlist = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2853 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2854 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2855
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2856 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2857 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2858 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2859 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2860 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2861 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2862 { register struct soap_nlist *np = soap->nlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2863 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2864 while (np && (strncmp(np->id, id1, n1) || np->id[n1]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2865 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2866 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2867 { if (!(soap->mode & SOAP_XML_IGNORENS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2868 if (np->index < 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2869 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_'))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2870 return SOAP_NAMESPACE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2871 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2872 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2873 if (n1 == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2874 return (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2875 if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2876 || (soap->mode & SOAP_XML_IGNORENS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2877 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2878 return soap->error = SOAP_SYNTAX_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2879 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2880 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2881
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2882 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2883 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2884 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2885 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2886 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2887 soap_current_namespace(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2888 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2889 register const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2890 if (!tag || !strncmp(tag, "xml", 3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2891 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2892 np = soap->nlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2893 if (!(s = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2894 { while (np && *np->id) /* find default namespace, if present */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2895 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2896 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2897 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2898 { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2899 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2900 if (!np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2901 soap->error = SOAP_NAMESPACE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2902 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2903 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2904 { if (np->index >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2905 return soap->namespaces[np->index].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2906 if (np->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2907 return soap_strdup(soap, np->ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2908 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2909 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2910 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2911 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2912
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2913 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2914 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2915 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2916 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2917 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2918 soap_tag_cmp(const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2919 { for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2920 { register int c1 = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2921 register int c2 = *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2922 if (!c1 || c1 == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2923 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2924 if (c2 != '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2925 { if (c1 != c2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2926 { if (c1 >= 'A' && c1 <= 'Z')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2927 c1 += 'a' - 'A';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2928 if (c2 >= 'A' && c2 <= 'Z')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2929 c2 += 'a' - 'A';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2930 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2931 if (c1 != c2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2932 { if (c2 != '*')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2933 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2934 c2 = *++t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2935 if (!c2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2936 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2937 if (c2 >= 'A' && c2 <= 'Z')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2938 c2 += 'a' - 'A';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2939 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2940 { c1 = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2941 if (!c1 || c1 == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2942 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2943 if (c1 >= 'A' && c1 <= 'Z')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2944 c1 += 'a' - 'A';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2945 if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2946 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2947 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2949 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2951 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2952 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2953 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2955 if (*t == '*' && !t[1])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2956 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2957 return *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2959 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2960
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2961 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2962 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2963 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2964 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2965 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2966 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2967 { register const char *s, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2968 register int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2969 if (!tag1 || !tag2 || !*tag2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2970 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2971 s = strchr(tag1, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2972 t = strchr(tag2, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2973 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2974 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2975 { if (t[1] && SOAP_STRCMP(s + 1, t + 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2976 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2977 if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2978 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2979 if (err == SOAP_NAMESPACE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2980 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2981 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2982 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2983 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2984 else if (!t[1])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2985 { err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2986 if (err == SOAP_NAMESPACE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2987 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2989 else if (SOAP_STRCMP(tag1, t + 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2990 { return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2992 else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2993 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2994 if (err == SOAP_NAMESPACE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2995 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2996 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2997 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2998 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
2999 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3000 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3001 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3002 { if (SOAP_STRCMP(s + 1, tag2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3003 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3004 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3005 else if (SOAP_STRCMP(tag1, tag2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3006 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3007 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3008 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3009 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3010 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3011
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3012 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3013 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3014 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3015 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3016 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3017 soap_match_array(struct soap *soap, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3018 { if (*soap->arrayType)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3019 if (soap_match_tag(soap, soap->arrayType, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3020 && soap_match_tag(soap, soap->arrayType, "xsd:anyType")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3021 && soap_match_tag(soap, soap->arrayType, "xsd:ur-type")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3022 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3023 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3024 return SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3026 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3027 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3028 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3029
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3030 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3031 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3032 * SSL/TLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3033 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3034 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3035
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3036 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3037 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3038 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3039 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3040 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3041 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3042 soap_rand()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3043 { unsigned char buf[4];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3044 if (!soap_ssl_init_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3045 soap_ssl_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3046 RAND_pseudo_bytes(buf, 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3047 return *(int*)buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3048 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3049 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3050 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3051
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3052 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3053 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3054 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3055 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3056 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3057 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3058 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3059 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3060 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3061 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3062 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3063 { int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3064 soap->keyfile = keyfile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3065 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3066 soap->keyid = keyid;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3067 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3068 soap->password = password;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3069 soap->cafile = cafile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3070 soap->capath = capath;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3071 soap->crlfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3072 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3073 soap->dhfile = dhfile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3074 soap->randfile = randfile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3075 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3076 soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3077 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3078 if (dhfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3079 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3080 int n = (int)soap_strtoul(dhfile, &s, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3081 if (!soap->dh_params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3082 gnutls_dh_params_init(&soap->dh_params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3083 /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3084 if (n >= 512 && s && *s == '\0')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3085 gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3086 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3087 { unsigned int dparams_len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3088 unsigned char dparams_buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3089 FILE *fd = fopen(dhfile, "r");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3090 if (!fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3091 return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3092 dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3093 fclose(fd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3094 gnutls_datum_t dparams = { dparams_buf, dparams_len };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3095 if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3096 return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3097 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3098 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3099 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3100 { if (!soap->rsa_params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3101 gnutls_rsa_params_init(&soap->rsa_params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3102 gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3103 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3104 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3105 { gnutls_deinit(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3106 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3107 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3108 if (soap->xcred)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3109 { gnutls_certificate_free_credentials(soap->xcred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3110 soap->xcred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3111 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3112 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3113 err = soap->fsslauth(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3114 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3115 if (!err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3116 { if (sid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3117 SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3118 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3119 SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3121 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3122 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3124 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3125 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3126
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3127 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3128 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3129 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3130 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3131 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3132 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3133 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3134 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3135 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3136 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3137 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3138 { soap->keyfile = keyfile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3139 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3140 soap->keyid = keyid;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3141 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3142 soap->password = password;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3143 soap->cafile = cafile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3144 soap->capath = capath;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3145 soap->ssl_flags = SOAP_SSL_CLIENT | flags;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3146 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3147 soap->dhfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3148 soap->randfile = randfile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3149 soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3150 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3151 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3152 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3153 { gnutls_deinit(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3154 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3155 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3156 if (soap->xcred)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3157 { gnutls_certificate_free_credentials(soap->xcred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3158 soap->xcred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3159 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3160 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3161 return soap->fsslauth(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3162 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3163 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3164 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3165
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3166 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3167 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3168 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3169 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3170 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3171 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3172 soap_ssl_init()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3173 { /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3174 if (!soap_ssl_init_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3175 { soap_ssl_init_done = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3176 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3177 SSL_library_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3178 OpenSSL_add_all_algorithms(); /* 2.8.1 change (wsseapi.c) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3179 OpenSSL_add_all_digests();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3180 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3181 SSL_load_error_strings();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3182 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3183 if (!RAND_load_file("/dev/urandom", 1024))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3184 { char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3185 RAND_seed(buf, sizeof(buf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3186 while (!RAND_status())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3187 { int r = rand();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3188 RAND_seed(&r, sizeof(int));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3189 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3190 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3191 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3192 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3193 # if defined(HAVE_PTHREAD_H)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3194 gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3195 # elif defined(HAVE_PTH_H)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3196 gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3197 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3198 gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3199 gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3200 gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3201 gnutls_global_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3202 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3203 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3204 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3205 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3206 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3207
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3208 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3209 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3210 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3211 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3212 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3213 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3214 soap_ssl_error(struct soap *soap, int ret)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3215 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3216 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3217 int err = SSL_get_error(soap->ssl, ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3218 const char *msg = soap_code_str(h_ssl_error_codes, err);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3219 if (msg)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3220 strcpy(soap->msgbuf, msg);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3221 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3222 return ERR_error_string(err, soap->msgbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3223 if (ERR_peek_error())
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3224 { unsigned long r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3225 strcat(soap->msgbuf, "\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3226 while ((r = ERR_get_error()))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3227 ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3228 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3229 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3230 { switch (ret)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3231 { case 0:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3232 strcpy(soap->msgbuf, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information.");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3233 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3234 case -1:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3235 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3236 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "Error observed by underlying SSL/TLS BIO: %s", strerror(errno));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3237 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3238 { const char *s = strerror(errno);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3239 size_t l = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3240 sprintf(soap->msgbuf, "Error observed by underlying SSL/TLS BIO: %s", l + 44 < sizeof(soap->msgbuf) ? s : SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3241 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3242 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3243 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3244 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3245 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3246 return soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3247 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3248 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3249 return gnutls_strerror(ret);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3250 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3251 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3252 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3253 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3254
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3255 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3256 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3257 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3258 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3259 ssl_auth_init(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3260 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3261 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3262 long flags;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3263 int mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3264 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3265 EVP_PKEY* pkey;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3266 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3267 if (!soap_ssl_init_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3268 soap_ssl_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3269 ERR_clear_error();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3270 if (!soap->ctx)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3271 { if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3272 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3273 /* The following alters the behavior of SSL read/write: */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3274 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3275 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3276 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3277 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3278 if (soap->randfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3279 { if (!RAND_load_file(soap->randfile, -1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3280 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't load randomness", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3282 if (soap->cafile || soap->capath)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3283 { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3284 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3285 if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3286 SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3288 if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3289 { if (!SSL_CTX_set_default_verify_paths(soap->ctx))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3290 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3291 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3292 /* This code assumes a typical scenario, see alternative code below */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3293 if (soap->keyfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3294 { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3295 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read certificate key file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3296 if (soap->password)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3297 { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3298 SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3299 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3300 if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3301 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3302 #ifndef WM_SECURE_KEY_STORAGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3303 if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3304 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3305 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3307 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3308 if (NULL == (pkey = ipcom_key_db_pkey_get(soap->keyid)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3309 return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3310 if (0 == SSL_CTX_use_PrivateKey(soap->ctx, pkey))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3311 return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3312 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3313 /* Suggested alternative approach to check the key file for certs (cafile=NULL):*/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3314 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3315 if (soap->password)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3316 { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3317 SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3318 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3319 if (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3320 { if (soap->keyfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3321 { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3322 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read certificate or key file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3323 if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3324 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3327 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3328 if ((soap->ssl_flags & SOAP_SSL_RSA))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3329 { RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3330 if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3331 { if (rsa)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3332 RSA_free(rsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3333 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set RSA key", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3334 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3335 RSA_free(rsa);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3336 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3337 else if (soap->dhfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3338 { DH *dh = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3339 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3340 int n = (int)soap_strtoul(soap->dhfile, &s, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3341 /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3342 if (n >= 512 && s && *s == '\0')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3343 #if defined(VXWORKS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3344 DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3345 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3346 dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3347 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3348 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3349 { BIO *bio;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3350 bio = BIO_new_file(soap->dhfile, "r");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3351 if (!bio)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3352 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3353 dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3354 BIO_free(bio);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3355 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3356 if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3357 { if (dh)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3358 DH_free(dh);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3359 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3360 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3361 DH_free(dh);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3362 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3363 flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); /* disable SSL v2 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3364 if ((soap->ssl_flags & SOAP_SSLv3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3365 flags |= SSL_OP_NO_TLSv1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3366 if ((soap->ssl_flags & SOAP_TLSv1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3367 flags |= SSL_OP_NO_SSLv3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3368 #ifdef SSL_OP_NO_TICKET
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3369 /* TLS extension is enabled by default in OPENSSL v0.9.8k
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3370 Disable it by adding SSL_OP_NO_TICKET */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3371 flags |= SSL_OP_NO_TICKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3372 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3373 SSL_CTX_set_options(soap->ctx, flags);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3374 if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3375 mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3376 else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3377 mode = SSL_VERIFY_PEER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3378 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3379 mode = SSL_VERIFY_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3380 SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3381 #if (OPENSSL_VERSION_NUMBER < 0x00905100L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3382 SSL_CTX_set_verify_depth(soap->ctx, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3383 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3384 SSL_CTX_set_verify_depth(soap->ctx, 9);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3385 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3386 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3387 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3388 int ret;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3389 if (!soap_ssl_init_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3390 soap_ssl_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3391 if (!soap->xcred)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3392 { gnutls_certificate_allocate_credentials(&soap->xcred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3393 if (soap->cafile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3394 { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3395 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3396 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3397 if (soap->crlfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3398 { if (gnutls_certificate_set_x509_crl_file(soap->xcred, soap->crlfile, GNUTLS_X509_FMT_PEM) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3399 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3400 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3401 if (soap->keyfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3402 { if (gnutls_certificate_set_x509_key_file(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM) < 0) /* TODO: GNUTLS need to concat cert and key in single key file */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3403 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read key file", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3404 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3405 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3406 if ((soap->ssl_flags & SOAP_SSL_CLIENT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3407 { gnutls_init(&soap->session, GNUTLS_CLIENT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3408 if (soap->cafile || soap->crlfile || soap->keyfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3409 { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3410 if (ret < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3411 return soap_set_receiver_error(soap, soap_ssl_error(soap, ret), "SSL/TLS set priority error", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3412 gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3413 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3414 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3415 { if (!soap->acred)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3416 gnutls_anon_allocate_client_credentials(&soap->acred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3417 gnutls_init(&soap->session, GNUTLS_CLIENT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3418 gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3419 gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3420 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3421 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3422 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3423 { if (!soap->keyfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3424 return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3425 if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3426 gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3427 else if (soap->dh_params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3428 gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3429 if (!soap->cache)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3430 gnutls_priority_init(&soap->cache, "NORMAL", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3431 gnutls_init(&soap->session, GNUTLS_SERVER);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3432 gnutls_priority_set(soap->session, soap->cache);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3433 gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3434 if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3435 gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3436 gnutls_session_enable_compatibility_mode(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3437 if ((soap->ssl_flags & SOAP_TLSv1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3438 { int protocol_priority[] = { GNUTLS_TLS1_0, 0 };
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3439 if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3440 return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set TLS v1.0 protocol", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3442 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3443 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3444 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3446 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3447 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3448
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3449 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3450 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3451 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3452 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3453 ssl_password(char *buf, int num, int rwflag, void *userdata)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3454 { if (num < (int)strlen((char*)userdata) + 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3455 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3456 return (int)strlen(strcpy(buf, (char*)userdata));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3458 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3459 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3460
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3461 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3462 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3463 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3464 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3465 ssl_verify_callback(int ok, X509_STORE_CTX *store)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3466 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3467 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3468 if (!ok)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3469 { char buf[1024];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3470 int err = X509_STORE_CTX_get_error(store);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3471 X509 *cert = X509_STORE_CTX_get_current_cert(store);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3472 fprintf(stderr, "SSL verify error or warning with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3473 X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3474 fprintf(stderr, "certificate issuer %s\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3475 X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3476 fprintf(stderr, "certificate subject %s\n", buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3477 /* accept self signed certificates and certificates out of date */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3478 switch (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3479 { case X509_V_ERR_CERT_NOT_YET_VALID:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3480 case X509_V_ERR_CERT_HAS_EXPIRED:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3481 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3482 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3483 X509_STORE_CTX_set_error(store, X509_V_OK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3484 ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3486 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3487 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3488 /* Note: return 1 to continue, but unsafe progress will be terminated by OpenSSL */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3489 return ok;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3490 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3491 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3492 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3493
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3494 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3495 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3496 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3497 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3498 ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3499 { ok = ssl_verify_callback(ok, store);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3500 if (!ok)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3501 { /* accept self signed certificates and certificates out of date */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3502 switch (X509_STORE_CTX_get_error(store))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3503 { case X509_V_ERR_CERT_NOT_YET_VALID:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3504 case X509_V_ERR_CERT_HAS_EXPIRED:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3505 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3506 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3507 X509_STORE_CTX_set_error(store, X509_V_OK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3508 ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3510 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3511 /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3512 return ok;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3513 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3514 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3515 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3516
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3517 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3518 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3519 static const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3520 ssl_verify(struct soap *soap, const char *host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3521 { unsigned int status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3522 const char *err = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3523 int r = gnutls_certificate_verify_peers2(soap->session, &status);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3524 if (r < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3525 err = "Certificate verify error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3526 else if ((status & GNUTLS_CERT_INVALID))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3527 err = "The certificate is not trusted";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3528 else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3529 err = "The certificate hasn't got a known issuer";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3530 else if ((status & GNUTLS_CERT_REVOKED))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3531 err = "The certificate has been revoked";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3532 else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3533 { gnutls_x509_crt_t cert;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3534 const gnutls_datum_t *cert_list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3535 unsigned int cert_list_size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3536 if (gnutls_x509_crt_init(&cert) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3537 err = "Could not get X509 certificates";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3538 else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3539 err = "Could not get X509 certificates";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3540 else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3541 err = "Error parsing X509 certificate";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3542 else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3543 err = "The certificate has expired";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3544 else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3545 err = "The certificate is not yet activated";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3546 else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3547 { if (!gnutls_x509_crt_check_hostname(cert, host))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3548 err = "Certificate host name mismatch";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3549 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3550 gnutls_x509_crt_deinit(cert);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3552 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3554 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3555
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3556 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3557 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3558 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3559 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3560 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3561 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3562 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3563 soap_ssl_accept(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3564 { SOAP_SOCKET sk = soap->socket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3565 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3566 BIO *bio;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3567 int retries, r, s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3568 if (!soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3569 return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3570 soap->ssl_flags &= ~SOAP_SSL_CLIENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3571 if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3572 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3573 if (!soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3574 { soap->ssl = SSL_new(soap->ctx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3575 if (!soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3576 return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3577 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3578 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3579 SSL_clear(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3580 bio = BIO_new_socket((int)sk, BIO_NOCLOSE);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3581 SSL_set_bio(soap->ssl, bio, bio);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3582 /* Set SSL sockets to non-blocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3583 retries = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3584 if (soap->accept_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3585 { SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3586 retries = 10*soap->accept_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3587 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3588 if (retries <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3589 retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3590 while ((r = SSL_accept(soap->ssl)) <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3591 { int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3592 if (retries-- <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3593 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3594 err = SSL_get_error(soap->ssl, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3595 if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3596 { if (err == SSL_ERROR_WANT_READ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3597 s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3598 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3599 s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3600 if (s < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3601 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3602 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3603 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3604 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3605 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3606 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3608 if (r <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3609 { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3610 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3611 return SOAP_SSL_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3612 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3613 if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3614 { X509 *peer;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3615 int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3616 if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3617 { soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3618 return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3619 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3620 peer = SSL_get_peer_certificate(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3621 if (!peer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3622 { soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3623 return soap_set_sender_error(soap, "SSL/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3624 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3625 X509_free(peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3626 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3627 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3628 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3629 int retries = 0, r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3630 if (!soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3631 return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3632 soap->ssl_flags &= ~SOAP_SSL_CLIENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3633 if (!soap->session && (soap->error = soap->fsslauth(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3634 { soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3635 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3636 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3637 gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3638 /* Set SSL sockets to non-blocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3639 if (soap->accept_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3640 { SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3641 retries = 10*soap->accept_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3643 if (retries <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3644 retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3645 while ((r = gnutls_handshake(soap->session)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3646 { int s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3647 /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3648 if (retries-- <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3649 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3650 if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3651 { if (!gnutls_record_get_direction(soap->session))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3652 s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3653 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3654 s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3655 if (s < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3656 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3657 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3658 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3659 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3660 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3662 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3663 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3664 { soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3665 return soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3666 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3667 if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3668 { const char *err = ssl_verify(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3669 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3670 { soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3671 return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3672 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3673 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3674 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3675 if (soap->recv_timeout || soap->send_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3676 SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3677 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3678 SOAP_SOCKBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3679 soap->imode |= SOAP_ENC_SSL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3680 soap->omode |= SOAP_ENC_SSL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3681 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3683 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3684 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3685 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3686
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3687 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3688 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3689 * TCP/UDP [SSL/TLS] IPv4 and IPv6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3690 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3691 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3692
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3693 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3694 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3695 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3696 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3697 tcp_init(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3698 { soap->errmode = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3699 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3700 if (tcp_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3701 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3702 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3703 { WSADATA w;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3704 if (WSAStartup(MAKEWORD(1, 1), &w))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3705 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3706 tcp_done = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3707 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3708 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3709 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3710 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3711 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3712 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3713
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3714 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3715 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3716 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3717 static const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3718 tcp_error(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3719 { register const char *msg = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3720 switch (soap->errmode)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3721 { case 0:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3722 msg = soap_strerror(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3723 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3724 case 1:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3725 msg = "WSAStartup failed";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3726 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3727 case 2:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3728 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3729 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3730 msg = soap_code_str(h_error_codes, soap->errnum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3731 if (!msg)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3732 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3733 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3734 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3735 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "TCP/UDP IP error %d", soap->errnum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3736 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3737 sprintf(soap->msgbuf, "TCP/UDP IP error %d", soap->errnum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3738 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3739 msg = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3740 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3741 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3742 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3743 return msg;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3744 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3745 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3746 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3747
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3748 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3749 #ifndef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3750 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3751 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3752 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3753 tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3754 { soap_int32 iadd = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3755 struct hostent hostent, *host = &hostent;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3756 #ifdef VXWORKS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3757 int hostint;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3758 /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3759 iadd = inet_addr((char*)addr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3760 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3761 #if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3762 struct hostent_data ht_data;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3763 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3764 #ifdef AS400
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3765 iadd = inet_addr((void*)addr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3766 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3767 iadd = inet_addr(addr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3768 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3769 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3770 if (iadd != -1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3771 { memcpy(inaddr, &iadd, sizeof(iadd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3772 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3773 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3774 #if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) || defined(__ANDROID__)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3775 if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3776 host = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3777 #elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3778 memset((void*)&ht_data, 0, sizeof(ht_data));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3779 if (gethostbyname_r(addr, &hostent, &ht_data) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3780 { host = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3781 soap->errnum = h_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3782 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3783 #elif defined(HAVE_GETHOSTBYNAME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3784 host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3785 #elif defined(VXWORKS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3786 /* If the DNS resolver library resolvLib has been configured in the vxWorks
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3787 * image, a query for the host IP address is sent to the DNS server, if the
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3788 * name was not found in the local host table. */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3789 hostint = hostGetByName((char*)addr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3790 if (hostint == ERROR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3791 { host = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3792 soap->errnum = soap_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3793 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3794 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3795 #ifdef AS400
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3796 if (!(host = gethostbyname((void*)addr)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3797 soap->errnum = h_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3798 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3799 if (!(host = gethostbyname(addr)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3800 soap->errnum = h_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3801 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3802 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3803 if (!host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3804 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3805 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3806 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3807 #ifdef VXWORKS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3808 inaddr->s_addr = hostint;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3809 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3810 memcpy(inaddr, host->h_addr, host->h_length);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3811 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3812 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3813 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3814 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3815 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3816 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3817
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3818 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3819 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3820 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3821 static SOAP_SOCKET
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3822 tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3823 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3824 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3825 struct addrinfo hints, *res, *ressave;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3826 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3827 SOAP_SOCKET sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3828 int err = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3829 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3830 #ifndef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3831 int len = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3832 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3833 int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3834 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3835 int set = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3836 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3837 #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3838 int retries;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3839 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3840 if (soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3841 soap->fclosesocket(soap, soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3842 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3843 if (tcp_init(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3844 { soap->errnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3845 soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3846 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3847 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3848 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3849 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3850 memset((void*)&hints, 0, sizeof(hints));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3851 hints.ai_family = PF_UNSPEC;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3852 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3853 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3854 hints.ai_socktype = SOCK_DGRAM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3855 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3856 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3857 hints.ai_socktype = SOCK_STREAM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3858 soap->errmode = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3859 if (soap->proxy_host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3860 err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3861 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3862 err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3863 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3864 { soap_set_sender_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3865 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3866 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3867 ressave = res;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3868 again:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3869 sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3870 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3871 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3872 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3873 again:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3874 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3875 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3876 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3877 sk = socket(AF_INET, SOCK_DGRAM, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3878 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3879 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3880 sk = socket(AF_INET, SOCK_STREAM, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3881 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3882 if (!soap_valid_socket(sk))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3883 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3884 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3885 if (res->ai_next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3886 { res = res->ai_next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3887 goto again;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3888 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3889 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3890 soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3891 soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3892 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3893 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3894 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3895 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3896 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3897 #ifdef SOCKET_CLOSE_ON_EXEC
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3898 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3899 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3900 SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3901 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3902 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3903 fcntl(sk, F_SETFD, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3904 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3905 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3906 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3907 if (soap->connect_flags == SO_LINGER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3908 { struct linger linger;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3909 memset((void*)&linger, 0, sizeof(linger));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3910 linger.l_onoff = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3911 linger.l_linger = soap->linger_time;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3912 if (setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3913 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3914 soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3915 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3916 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3917 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3918 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3919 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3921 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3922 else if (soap->connect_flags && setsockopt(sk, SOL_SOCKET, soap->connect_flags, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3923 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3924 soap_set_sender_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3925 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3926 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3927 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3928 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3929 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3930 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3931 if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3932 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3933 soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3934 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3935 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3936 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3937 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3938 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3939 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3940 if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3941 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3942 soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3943 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3944 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3945 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3946 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3947 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3949 if (setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3950 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3951 soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3952 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3953 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3954 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3955 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3956 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3957 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3958 #ifdef TCP_KEEPIDLE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3959 if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3960 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3961 soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3962 soap->fclosesocket(soap, (SOAP_SOCKET)sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3963 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3964 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3965 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3966 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3967 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3968 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3969 #ifdef TCP_KEEPINTVL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3970 if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3971 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3972 soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3973 soap->fclosesocket(soap, (SOAP_SOCKET)sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3974 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3975 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3976 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3977 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3978 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3979 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3980 #ifdef TCP_KEEPCNT
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3981 if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3982 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3983 soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3984 soap->fclosesocket(soap, (SOAP_SOCKET)sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3985 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3986 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3987 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3988 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3989 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3990 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3991 #ifdef TCP_NODELAY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3992 if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3993 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3994 soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3995 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3996 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3997 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3998 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
3999 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4000 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4001 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4002 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4003 if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4004 { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4005 in6addr->sin6_scope_id = soap->ipv6_multicast_if;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4006 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4007 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4008 #ifdef IP_MULTICAST_TTL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4009 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4010 { if (soap->ipv4_multicast_ttl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4011 { unsigned char ttl = soap->ipv4_multicast_ttl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4012 if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4013 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4014 soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4015 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4016 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4017 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4019 if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4020 { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4021 #ifndef WINDOWS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4022 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4023 soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4024 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4025 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4026 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4027 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4028 #ifndef IP_MULTICAST_IF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4029 #define IP_MULTICAST_IF 2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4030 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4031 if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4032 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4033 soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4034 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4035 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4037 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4038 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4039 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4040 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4041 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4042 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", sk, host, port));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4043 #ifndef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4044 soap->peerlen = sizeof(soap->peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4045 memset((void*)&soap->peer, 0, sizeof(soap->peer));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4046 soap->peer.sin_family = AF_INET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4047 soap->errmode = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4048 if (soap->proxy_host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4049 { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4050 { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4051 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4052 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4054 soap->peer.sin_port = htons((short)soap->proxy_port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4055 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4056 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4057 { if (soap->fresolve(soap, host, &soap->peer.sin_addr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4058 { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4059 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4060 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4061 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4062 soap->peer.sin_port = htons((short)port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4063 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4064 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4065 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4066 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4067 return sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4068 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4069 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4070 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4071 { memcpy(&soap->peer, res->ai_addr, res->ai_addrlen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4072 soap->peerlen = res->ai_addrlen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4073 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4074 return sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4075 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4076 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4077 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4078 if (soap->connect_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4079 SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4080 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4081 SOAP_SOCKBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4082 retries = 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4083 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4084 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4085 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4086 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4087 if (connect(sk, res->ai_addr, (int)res->ai_addrlen))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4088 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4089 if (connect(sk, (struct sockaddr*)&soap->peer, sizeof(soap->peer)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4090 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4091 { err = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4092 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4093 if (err == SOAP_EADDRINUSE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4094 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4095 if (retries-- > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4096 goto again;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4097 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4098 else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4099 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4100 SOAP_SOCKLEN_T k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4101 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4102 { register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4103 r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4104 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4105 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4106 if (!r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4107 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4108 soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4109 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4110 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4111 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4112 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4113 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4114 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4115 r = soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4116 if (r != SOAP_EINTR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4117 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4118 soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4119 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4120 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4121 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4122 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4123 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4124 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4125 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4126 k = (SOAP_SOCKLEN_T)sizeof(soap->errnum);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4127 if (!getsockopt(sk, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4128 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4129 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4130 if (!soap->errnum)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4131 soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4132 soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4133 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4134 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4135 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4136 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4137 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4138 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4139 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4140 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4141 if (res->ai_next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4142 { res = res->ai_next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4143 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4144 goto again;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4146 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4147 if (err && err != SOAP_EINTR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4148 { soap->errnum = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4149 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4150 soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4151 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4152 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4153 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4154 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4155 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4156 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4157 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4158 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4159 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4160 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4161 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4162 soap->peerlen = 0; /* IPv6: already connected so use send() */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4163 freeaddrinfo(ressave);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4164 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4165 soap->socket = sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4166 soap->imode &= ~SOAP_ENC_SSL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4167 soap->omode &= ~SOAP_ENC_SSL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4168 if (!soap_tag_cmp(endpoint, "https:*"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4169 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4170 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4171 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4172 BIO *bio;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4173 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4174 int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4175 if (soap->proxy_host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4176 { soap_mode m = soap->mode; /* preserve settings */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4177 soap_mode om = soap->omode; /* make sure we only parse HTTP */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4178 size_t n = soap->count; /* save the content length */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4179 const char *userid, *passwd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4180 int status = soap->status; /* save the current status/command */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4181 short keep_alive = soap->keep_alive; /* save the KA status */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4182 soap->omode &= ~SOAP_ENC; /* mask IO and ENC */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4183 soap->omode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4184 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4185 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4186 if (soap->ntlm_challenge)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4187 { if (soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4188 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4189 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4190 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4191 if (soap_begin_send(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4192 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4193 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4194 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4195 soap->status = SOAP_CONNECT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4196 soap->keep_alive = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4197 if ((soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4198 || soap_end_send_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4199 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4200 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4202 soap->keep_alive = keep_alive;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4203 soap->omode = om;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4204 om = soap->imode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4205 soap->imode &= ~SOAP_ENC; /* mask IO and ENC */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4206 userid = soap->userid; /* preserve */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4207 passwd = soap->passwd; /* preserve */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4208 if ((soap->error = soap->fparse(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4209 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4210 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4212 soap->status = status; /* restore */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4213 soap->userid = userid; /* restore */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4214 soap->passwd = passwd; /* restore */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4215 soap->imode = om; /* restore */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4216 soap->count = n; /* restore */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4217 if (soap_begin_send(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4218 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4219 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4220 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4221 if (endpoint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4222 { strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint)); /* restore */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4223 soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4224 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4225 soap->mode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4226 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4227 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4228 soap->ssl_flags |= SOAP_SSL_CLIENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4229 if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4230 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4231 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4232 soap->error = SOAP_SSL_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4233 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4235 if (!soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4236 { soap->ssl = SSL_new(soap->ctx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4237 if (!soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4238 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4239 soap->error = SOAP_SSL_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4240 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4241 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4242 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4243 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4244 SSL_clear(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4245 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4246 { if (!strcmp(soap->session_host, host) && soap->session_port == port)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4247 SSL_set_session(soap->ssl, soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4248 SSL_SESSION_free(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4249 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4250 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4251 soap->imode |= SOAP_ENC_SSL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4252 soap->omode |= SOAP_ENC_SSL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4253 bio = BIO_new_socket((int)sk, BIO_NOCLOSE);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4254 SSL_set_bio(soap->ssl, bio, bio);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4255 /* Connect timeout: set SSL sockets to non-blocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4256 retries = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4257 if (soap->connect_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4258 { SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4259 retries = 10*soap->connect_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4260 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4261 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4262 SOAP_SOCKBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4263 if (retries <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4264 retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4265 /* Try connecting until success or timeout (when nonblocking) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4266 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4267 { if ((r = SSL_connect(soap->ssl)) <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4268 { int err = SSL_get_error(soap->ssl, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4269 if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4270 { register int s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4271 if (err == SSL_ERROR_WANT_READ)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4272 s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4273 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4274 s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4275 if (s < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4276 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4277 soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4278 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4279 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4281 if (s == 0 && retries-- <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4282 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4283 soap_set_sender_error(soap, "Timeout", "SSL_connect failed in tcp_connect()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4284 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4285 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4286 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4288 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4289 { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL_connect error in tcp_connect()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4290 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4291 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4292 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4293 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4294 } while (!SSL_is_init_finished(soap->ssl));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4295 /* Set SSL sockets to nonblocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4296 SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4297 /* Check server credentials when required */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4298 if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4299 { int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4300 if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4301 { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4302 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4303 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4304 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4305 if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4306 { X509_NAME *subj;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4307 STACK_OF(CONF_VALUE) *val = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4308 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4309 GENERAL_NAMES *names = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4310 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4311 int ext_count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4312 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4313 int ok = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4314 X509 *peer = SSL_get_peer_certificate(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4315 if (!peer)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4316 { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4317 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4318 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4320 #if (OPENSSL_VERSION_NUMBER < 0x0090800fL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4321 ext_count = X509_get_ext_count(peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4322 if (ext_count > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4323 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4324 for (i = 0; i < ext_count; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4325 { X509_EXTENSION *ext = X509_get_ext(peer, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4326 const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4327 if (ext_str && !strcmp(ext_str, "subjectAltName"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4328 { X509V3_EXT_METHOD *meth = (X509V3_EXT_METHOD*)X509V3_EXT_get(ext);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4329 unsigned char *data;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4330 if (!meth)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4331 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4332 data = ext->value->data;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4333 if (data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4334 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4335 #if (OPENSSL_VERSION_NUMBER > 0x00907000L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4336 void *ext_data;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4337 if (meth->it)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4338 ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4339 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4340 { /* OpenSSL is not portable at this point (?):
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4341 Some compilers appear to prefer
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4342 meth->d2i(NULL, (const unsigned char**)&data, ...
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4343 and others prefer
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4344 meth->d2i(NULL, &data, ext->value->length);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4345 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4346 ext_data = meth->d2i(NULL, &data, ext->value->length);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4348 if (ext_data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4349 val = meth->i2v(meth, ext_data, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4350 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4351 val = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4352 if (meth->it)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4353 ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4354 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4355 meth->ext_free(ext_data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4356 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4357 void *ext_data = meth->d2i(NULL, &data, ext->value->length);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4358 if (ext_data)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4359 val = meth->i2v(meth, ext_data, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4360 meth->ext_free(ext_data);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4361 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4362 if (val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4363 { int j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4364 for (j = 0; j < sk_CONF_VALUE_num(val); j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4365 { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4366 if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4367 { ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4368 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4369 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4370 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4371 sk_CONF_VALUE_pop_free(val, X509V3_conf_free);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4372 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4374 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4375 if (ok)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4376 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4379 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4380 names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4381 if (names)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4382 { val = i2v_GENERAL_NAMES(NULL, names, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4383 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4384 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4385 if (val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4386 { int j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4387 for (j = 0; j < sk_CONF_VALUE_num(val); j++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4388 { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4389 if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4390 { ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4391 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4392 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4393 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4394 sk_CONF_VALUE_pop_free(val, X509V3_conf_free);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4395 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4396 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4397 if (!ok && (subj = X509_get_subject_name(peer)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4398 { int i = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4399 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4400 { ASN1_STRING *name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4401 i = X509_NAME_get_index_by_NID(subj, NID_commonName, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4402 if (i == -1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4403 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4404 name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4405 if (name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4406 { if (!soap_tag_cmp(host, (const char*)M_ASN1_STRING_data(name)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4407 ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4408 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4409 { unsigned char *tmp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4410 ASN1_STRING_to_UTF8(&tmp, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4411 if (tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4412 { if (!soap_tag_cmp(host, (const char*)tmp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4413 ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4414 else if (tmp[0] == '*') /* wildcard domain */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4415 { const char *t = strchr(host, '.');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4416 if (t && !soap_tag_cmp(t, (const char*)tmp+1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4417 ok = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4418 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4419 OPENSSL_free(tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4420 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4421 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4422 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4423 } while (!ok);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4424 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4425 X509_free(peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4426 if (!ok)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4427 { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4428 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4429 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4430 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4432 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4433 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4434 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4435 soap->ssl_flags |= SOAP_SSL_CLIENT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4436 if (!soap->session && (soap->error = soap->fsslauth(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4437 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4438 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4439 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4440 gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4441 /* Set SSL sockets to non-blocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4442 if (soap->connect_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4443 { SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4444 retries = 10*soap->connect_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4446 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4447 SOAP_SOCKBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4448 if (retries <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4449 retries = 100; /* timeout: 10 sec retries, 100 times 0.1 sec */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4450 while ((r = gnutls_handshake(soap->session)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4451 { int s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4452 /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4453 if (retries-- <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4454 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4455 if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4456 { if (!gnutls_record_get_direction(soap->session))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4457 s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4458 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4459 s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4460 if (s < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4461 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4462 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4463 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4464 { soap->errnum = soap_socket_errno(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4465 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4466 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4467 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4468 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4469 { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL/TLS handshake failed", SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4470 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4471 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4472 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4473 if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4474 { const char *err = ssl_verify(soap, host);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4475 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4476 { soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4477 soap->error = soap_set_sender_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4478 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4480 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4481 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4482 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4483 soap->fclosesocket(soap, sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4484 soap->error = SOAP_SSL_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4485 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4486 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4487 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4488 if (soap->recv_timeout || soap->send_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4489 SOAP_SOCKNONBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4490 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4491 SOAP_SOCKBLOCK(sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4492 return sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4493 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4494 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4495 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4496
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4497 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4498 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4499 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4500 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4501 tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4502 { int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4503 struct timeval tv;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4504 fd_set fd[3], *rfd, *sfd, *efd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4505 int retries = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4506 int eintr = SOAP_MAXEINTR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4507 soap->errnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4508 #ifndef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4509 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4510 /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4511 if (1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4512 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4513 /* if fd max set size exceeded, use poll() */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4514 if ((int)sk >= (int)FD_SETSIZE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4515 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4516 #ifdef HAVE_POLL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4517 { struct pollfd pollfd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4518 pollfd.fd = (int)sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4519 pollfd.events = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4520 if (flags & SOAP_TCP_SELECT_RCV)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4521 pollfd.events |= POLLIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4522 if (flags & SOAP_TCP_SELECT_SND)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4523 pollfd.events |= POLLOUT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4524 if (flags & SOAP_TCP_SELECT_ERR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4525 pollfd.events |= POLLERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4526 if (timeout <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4527 timeout /= -1000; /* -usec -> ms */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4528 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4529 { retries = timeout - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4530 timeout = 1000;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4531 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4532 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4533 { r = poll(&pollfd, 1, timeout);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4534 if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4535 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4536 } while (r == 0 && retries--);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4537 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4538 { r = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4539 if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd.revents & POLLIN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4540 r |= SOAP_TCP_SELECT_RCV;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4541 if ((flags & SOAP_TCP_SELECT_SND) && (pollfd.revents & POLLOUT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4542 r |= SOAP_TCP_SELECT_SND;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4543 if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd.revents & POLLERR))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4544 r |= SOAP_TCP_SELECT_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4546 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4548 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4549 { soap->error = SOAP_FD_EXCEEDED;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4550 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4552 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4553 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4554 if (timeout > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4555 retries = timeout - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4556 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4557 { rfd = sfd = efd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4558 if (flags & SOAP_TCP_SELECT_RCV)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4559 { rfd = &fd[0];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4560 FD_ZERO(rfd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4561 FD_SET(sk, rfd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4562 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4563 if (flags & SOAP_TCP_SELECT_SND)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4564 { sfd = &fd[1];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4565 FD_ZERO(sfd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4566 FD_SET(sk, sfd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4567 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4568 if (flags & SOAP_TCP_SELECT_ERR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4569 { efd = &fd[2];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4570 FD_ZERO(efd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4571 FD_SET(sk, efd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4572 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4573 if (timeout <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4574 { tv.tv_sec = -timeout / 1000000;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4575 tv.tv_usec = -timeout % 1000000;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4577 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4578 { tv.tv_sec = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4579 tv.tv_usec = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4580 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4581 r = select((int)sk + 1, rfd, sfd, efd, &tv);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4582 if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4583 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4584 } while (r == 0 && retries--);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4585 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4586 { r = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4587 if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4588 r |= SOAP_TCP_SELECT_RCV;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4589 if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4590 r |= SOAP_TCP_SELECT_SND;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4591 if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4592 r |= SOAP_TCP_SELECT_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4593 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4594 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4595 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4596 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4597 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4598
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4599 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4600 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4601 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4602 static SOAP_SOCKET
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4603 tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4604 { SOAP_SOCKET sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4605 (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4606 sk = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4607 #ifdef SOCKET_CLOSE_ON_EXEC
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4608 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4609 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4610 SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4611 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4612 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4613 fcntl(sk, F_SETFD, FD_CLOEXEC);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4614 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4615 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4616 return sk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4617 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4618 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4619 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4620
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4621 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4622 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4623 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4624 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4625 tcp_disconnect(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4626 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4627 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4628 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4629 { int r, s = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4630 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4631 { SSL_SESSION_free(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4632 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4633 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4634 if (*soap->host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4635 { soap->session = SSL_get1_session(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4636 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4637 { strcpy(soap->session_host, soap->host);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4638 soap->session_port = soap->port;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4639 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4640 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4641 r = SSL_shutdown(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4642 /* SSL shutdown does not work when reads are pending, non-blocking */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4643 if (r == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4644 { while (SSL_want_read(soap->ssl))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4645 { if (SSL_read(soap->ssl, NULL, 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4646 || soap_socket_errno(soap->socket) != SOAP_EAGAIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4647 { r = SSL_shutdown(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4648 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4649 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4650 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4651 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4652 if (r == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4653 { if (soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4654 { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4655 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4656 #if !defined(WITH_LEAN) && !defined(WIN32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4657 /*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4658 wait up to 5 seconds for close_notify to be sent by peer (if peer not
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4659 present, this avoids calling SSL_shutdown() which has a lengthy return
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4660 timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4661 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4662 r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4663 if (r <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4664 { soap->errnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4665 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4666 soap->fclosesocket(soap, soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4667 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4668 ERR_remove_state(0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4669 SSL_free(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4670 soap->ssl = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4671 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4672 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4673 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4674 r = SSL_shutdown(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4675 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4676 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4677 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4678 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4679 if (r != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4680 { s = ERR_get_error();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4681 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4682 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4683 if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4684 { soap->fclosesocket(soap, soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4685 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4686 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4687 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4688 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4689 SSL_free(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4690 soap->ssl = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4691 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4692 return SOAP_SSL_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4693 ERR_remove_state(0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4695 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4696 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4697 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4698 { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4699 gnutls_deinit(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4700 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4701 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4702 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4703 if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4704 { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4705 soap->fclosesocket(soap, soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4706 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4707 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4708 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4709 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4710 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4711 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4712
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4713 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4714 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4715 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4716 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4717 tcp_closesocket(struct soap *soap, SOAP_SOCKET sk)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4718 { (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4719 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4720 return soap_closesocket(sk);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4721 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4722 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4723 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4724
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4725 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4726 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4727 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4728 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4729 tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4730 { (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4731 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4732 return shutdown(sk, how);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4733 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4734 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4735 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4736
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4737 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4738 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4739 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4740 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4741 SOAP_SOCKET
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4742 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4743 soap_bind(struct soap *soap, const char *host, int port, int backlog)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4744 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4745 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4746 struct addrinfo *addrinfo = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4747 struct addrinfo hints;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4748 struct addrinfo res;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4749 int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4750 #ifdef WITH_NO_IPV6_V6ONLY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4751 int unset = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4752 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4753 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4754 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4755 #ifndef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4756 int len = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4757 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4758 int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4759 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4760 int set = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4761 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4762 if (soap_valid_socket(soap->master))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4763 { soap->fclosesocket(soap, soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4764 soap->master = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4766 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4767 soap->errmode = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4768 if (tcp_init(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4769 { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4770 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4771 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4772 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4773 memset((void*)&hints, 0, sizeof(hints));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4774 hints.ai_family = PF_UNSPEC;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4775 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4776 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4777 hints.ai_socktype = SOCK_DGRAM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4778 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4779 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4780 hints.ai_socktype = SOCK_STREAM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4781 hints.ai_flags = AI_PASSIVE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4782 soap->errmode = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4783 err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4784 if (err || !addrinfo)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4785 { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4786 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4787 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4788 res = *addrinfo;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4789 memcpy(&soap->peer, addrinfo->ai_addr, addrinfo->ai_addrlen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4790 soap->peerlen = addrinfo->ai_addrlen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4791 res.ai_addr = (struct sockaddr*)&soap->peer;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4792 res.ai_addrlen = soap->peerlen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4793 freeaddrinfo(addrinfo);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4794 soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4795 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4796 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4797 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4798 soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4799 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4800 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4801 soap->master = (int)socket(AF_INET, SOCK_STREAM, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4802 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4803 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4804 if (!soap_valid_socket(soap->master))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4805 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4806 soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4807 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4808 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4809 soap->port = port;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4810 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4811 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4812 soap->socket = soap->master;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4813 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4814 #ifdef SOCKET_CLOSE_ON_EXEC
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4815 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4816 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4817 SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4818 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4819 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4820 fcntl(soap->master, F_SETFD, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4821 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4822 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4823 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4824 if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4825 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4826 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4827 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4828 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4829 if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4830 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4831 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4832 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4833 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4834 if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4835 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4836 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4837 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4838 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4839 if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4840 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4841 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4842 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4843 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4844 #ifdef TCP_NODELAY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4845 if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4846 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4847 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4848 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4849 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4850 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4851 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4852 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4853 #ifdef WITH_IPV6_V6ONLY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4854 if (setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4855 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4856 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt set IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4857 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4858 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4859 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4860 #ifdef WITH_NO_IPV6_V6ONLY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4861 if (setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&unset, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4862 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4863 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt unset IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4864 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4865 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4866 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4867 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4868 if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4869 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4870 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4871 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4872 soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4873 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4874 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4875 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4876 soap->peerlen = sizeof(soap->peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4877 memset((void*)&soap->peer, 0, sizeof(soap->peer));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4878 soap->peer.sin_family = AF_INET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4879 soap->errmode = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4880 if (host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4881 { if (soap->fresolve(soap, host, &soap->peer.sin_addr))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4882 { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4883 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4884 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4885 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4886 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4887 soap->peer.sin_addr.s_addr = htonl(INADDR_ANY);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4888 soap->peer.sin_port = htons((short)port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4889 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4890 if (bind(soap->master, (struct sockaddr*)&soap->peer, (int)soap->peerlen))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4891 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4892 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4893 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4894 soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4895 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4896 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4897 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4898 if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4899 { soap->errnum = soap_socket_errno(soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4900 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4901 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4902 soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4903 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4904 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4905 return soap->master;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4906 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4907 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4908 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4909
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4910 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4911 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4912 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4913 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4914 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4915 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4916 soap_poll(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4917 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4918 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4919 register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4920 if (soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4921 { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4922 if (r > 0 && (r & SOAP_TCP_SELECT_ERR))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4923 r = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4924 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4925 else if (soap_valid_socket(soap->master))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4926 r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4927 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4928 return SOAP_OK; /* OK when no socket! */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4929 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4930 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4931 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4932 if (soap->imode & SOAP_ENC_SSL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4933 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4934 if (soap_valid_socket(soap->socket)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4935 && (r & SOAP_TCP_SELECT_SND)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4936 && (!(r & SOAP_TCP_SELECT_RCV)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4937 || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4938 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4939 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4940 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4941 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4942 { int t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4943 if (soap_valid_socket(soap->socket)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4944 && (r & SOAP_TCP_SELECT_SND)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4945 && (!(r & SOAP_TCP_SELECT_RCV)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4946 || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4947 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4949 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4950 else if (r < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4951 { if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4952 { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4953 return soap->error = SOAP_TCP_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4955 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4956 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4957 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4958 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4959 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4960 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4961 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4962 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4963 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4964
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4965 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4966 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4967 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4968 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4969 SOAP_SOCKET
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4970 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4971 soap_accept(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4972 { int n = (int)sizeof(soap->peer);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4973 register int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4974 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4975 #ifndef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4976 int len = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4977 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4978 int len = SOAP_BUFLEN + 1; /* speeds up windows xfer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4979 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4980 int set = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4981 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4982 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4983 memset((void*)&soap->peer, 0, sizeof(soap->peer));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4984 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4985 soap->errmode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4986 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4987 if (!soap_valid_socket(soap->master))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4988 { soap->errnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4989 soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4990 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4992 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4993 if ((soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4994 return soap->socket = soap->master;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4995 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4996 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4997 { if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4998 { for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
4999 { register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5000 r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout ? soap->accept_timeout : 60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5001 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5002 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5003 if (!r && soap->accept_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5004 { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5005 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5006 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5007 if (r < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5008 { r = soap->errnum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5009 if (r != SOAP_EINTR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5010 { soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5011 soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5012 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5013 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5014 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5015 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5016 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5017 if (soap->accept_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5018 SOAP_SOCKNONBLOCK(soap->master)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5019 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5020 SOAP_SOCKBLOCK(soap->master)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5021 soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5022 soap->peerlen = (size_t)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5023 if (soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5024 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5025 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5026 unsigned int ip1, ip2, ip3, ip4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5027 char port[16];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5028 getnameinfo((struct sockaddr*)&soap->peer, n, soap->host, sizeof(soap->host), port, 16, NI_NUMERICHOST | NI_NUMERICSERV);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5029 sscanf(soap->host, "%u.%u.%u.%u", &ip1, &ip2, &ip3, &ip4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5030 soap->ip = (unsigned long)ip1 << 24 | (unsigned long)ip2 << 16 | (unsigned long)ip3 << 8 | (unsigned long)ip4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5031 soap->port = soap_strtol(port, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5032 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5033 soap->ip = ntohl(soap->peer.sin_addr.s_addr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5034 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5035 soap_snprintf(soap->host, sizeof(soap->host), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5036 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5037 sprintf(soap->host, "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5038 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5039 soap->port = (int)ntohs(soap->peer.sin_port); /* does not return port number on some systems */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5040 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5041 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", soap->socket, soap->port, soap->host));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5042 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5043 if (soap->accept_flags == SO_LINGER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5044 { struct linger linger;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5045 memset((void*)&linger, 0, sizeof(linger));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5046 linger.l_onoff = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5047 linger.l_linger = soap->linger_time;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5048 if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5049 { soap->errnum = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5050 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5051 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5052 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5054 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5055 else if (soap->accept_flags && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5056 { soap->errnum = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5057 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5058 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5059 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5060 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5061 if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5062 { soap->errnum = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5063 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5064 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5065 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5066 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5067 if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5068 { soap->errnum = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5069 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5070 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5071 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5072 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5073 if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5074 { soap->errnum = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5075 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5076 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5077 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5078 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5079 #ifdef TCP_NODELAY
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5080 if (setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5081 { soap->errnum = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5082 soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5083 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5084 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5085 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5086 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5087 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5088 soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5089 if (soap->send_timeout || soap->recv_timeout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5090 SOAP_SOCKNONBLOCK(soap->socket)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5091 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5092 SOAP_SOCKBLOCK(soap->socket)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5093 return soap->socket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5095 err = soap_socket_errno(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5096 if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5097 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5098 soap->errnum = err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5099 soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5100 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5101 return SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5102 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5103 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5104 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5105 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5106 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5107
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5108 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5109 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5110 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5111 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5112 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5113 soap_closesock(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5114 { register int status = soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5115 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5116 if (status) /* close on error: attachment state is not to be trusted */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5117 { soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5118 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5119 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5120 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5121 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5122 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5123 if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5124 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5125 if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5126 { if (soap->fclose && (soap->error = soap->fclose(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5127 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5128 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5129 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5130 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5131 if (!(soap->mode & SOAP_MIME_POSTCHECK))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5132 { if (soap->zlib_state == SOAP_ZLIB_DEFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5133 deflateEnd(soap->d_stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5134 else if (soap->zlib_state == SOAP_ZLIB_INFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5135 inflateEnd(soap->d_stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5136 soap->zlib_state = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5137 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5138 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5139 return soap->error = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5141 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5142
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5143 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5144 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5145 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5146 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5147 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5148 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5149 soap_force_closesock(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5150 { soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5151 if (soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5152 return soap_closesocket(soap->socket);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5153 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5154 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5155 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5156 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5157
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5158 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5159 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5160 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5161 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5162 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5163 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5164 soap_cleanup(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5165 { soap_done(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5166 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5167 if (!tcp_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5168 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5169 tcp_done = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5170 WSACleanup();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5171 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5172 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5173 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5174 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5175
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5176 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5177 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5178 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5179 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5180 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5181 soap_done(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5182 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5183 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5184 int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5185 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5186 if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5187 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5188 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context%s\n", soap->state == SOAP_COPY ? " copy" : ""));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5189 soap_free_temp(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5190 while (soap->clist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5191 { struct soap_clist *p = soap->clist->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5192 SOAP_FREE(soap, soap->clist);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5193 soap->clist = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5194 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5195 if (soap->state == SOAP_INIT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5196 soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5197 soap->keep_alive = 0; /* to force close the socket */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5198 if (soap->master == soap->socket) /* do not close twice */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5199 soap->master = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5200 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5201 #ifdef WITH_COOKIES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5202 soap_free_cookies(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5203 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5204 while (soap->plugins)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5205 { register struct soap_plugin *p = soap->plugins->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5206 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5207 if (soap->plugins->fcopy || soap->state == SOAP_INIT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5208 soap->plugins->fdelete(soap, soap->plugins);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5209 SOAP_FREE(soap, soap->plugins);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5210 soap->plugins = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5212 soap->fplugin = fplugin;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5213 soap->fmalloc = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5214 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5215 soap->fpost = http_post;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5216 soap->fget = http_get;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5217 soap->fput = http_405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5218 soap->fdel = http_405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5219 soap->fopt = http_200;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5220 soap->fhead = http_200;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5221 soap->fform = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5222 soap->fposthdr = http_post_header;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5223 soap->fresponse = http_response;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5224 soap->fparse = http_parse;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5225 soap->fparsehdr = http_parse_header;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5226 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5227 soap->fheader = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5228 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5229 #ifndef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5230 soap->fresolve = tcp_gethost;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5231 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5232 soap->fresolve = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5233 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5234 soap->faccept = tcp_accept;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5235 soap->fopen = tcp_connect;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5236 soap->fclose = tcp_disconnect;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5237 soap->fclosesocket = tcp_closesocket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5238 soap->fshutdownsocket = tcp_shutdownsocket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5239 soap->fsend = fsend;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5240 soap->frecv = frecv;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5241 soap->fpoll = soap_poll;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5242 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5243 soap->fopen = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5244 soap->fclose = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5245 soap->fpoll = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5246 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5247 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5248 soap->feltbegin = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5249 soap->feltendin = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5250 soap->feltbegout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5251 soap->feltendout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5252 soap->fprepareinitsend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5253 soap->fprepareinitrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5254 soap->fpreparesend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5255 soap->fpreparerecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5256 soap->fpreparefinalsend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5257 soap->fpreparefinalrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5258 soap->ffiltersend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5259 soap->ffilterrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5260 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5261 soap->fseterror = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5262 soap->fignore = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5263 soap->fserveloop = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5264 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5265 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5266 { SSL_SESSION_free(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5267 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5268 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5269 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5270 if (soap->state == SOAP_INIT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5271 { if (soap_valid_socket(soap->master))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5272 { soap->fclosesocket(soap, soap->master);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5273 soap->master = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5274 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5275 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5276 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5277 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5278 { SSL_free(soap->ssl);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5279 soap->ssl = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5281 if (soap->state == SOAP_INIT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5282 { if (soap->ctx)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5283 { SSL_CTX_free(soap->ctx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5284 soap->ctx = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5285 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5286 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5287 ERR_remove_state(0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5288 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5289 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5290 if (soap->state == SOAP_INIT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5291 { if (soap->xcred)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5292 { gnutls_certificate_free_credentials(soap->xcred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5293 soap->xcred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5294 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5295 if (soap->acred)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5296 { gnutls_anon_free_client_credentials(soap->acred);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5297 soap->acred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5298 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5299 if (soap->cache)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5300 { gnutls_priority_deinit(soap->cache);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5301 soap->cache = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5302 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5303 if (soap->dh_params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5304 { gnutls_dh_params_deinit(soap->dh_params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5305 soap->dh_params = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5307 if (soap->rsa_params)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5308 { gnutls_rsa_params_deinit(soap->rsa_params);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5309 soap->rsa_params = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5310 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5312 if (soap->session)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5313 { gnutls_deinit(soap->session);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5314 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5315 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5316 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5317 #ifdef WITH_C_LOCALE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5318 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5319 _free_locale(soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5320 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5321 freelocale(soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5322 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5323 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5324 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5325 if (soap->d_stream)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5326 { SOAP_FREE(soap, (void*)soap->d_stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5327 soap->d_stream = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5328 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5329 if (soap->z_buf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5330 { SOAP_FREE(soap, (void*)soap->z_buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5331 soap->z_buf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5332 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5333 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5334 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5335 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5336 for (i = 0; i < SOAP_MAXLOGS; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5337 { if (soap->logfile[i])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5338 { SOAP_FREE(soap, (void*)soap->logfile[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5339 soap->logfile[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5340 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5341 soap_close_logfile(soap, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5342 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5343 soap->state = SOAP_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5344 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5345 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5346 soap_free_mht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5347 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5348 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5349 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5350
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5351 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5352 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5353 * HTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5354 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5355 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5356
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5357 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5358 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5359 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5360 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5361 http_parse(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5362 { char header[SOAP_HDRLEN], *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5363 unsigned short httpcmd = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5364 int status = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5365 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5366 *soap->endpoint = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5367 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5368 if (!soap->ntlm_challenge)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5369 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5370 { soap->userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5371 soap->passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5372 soap->authrealm = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5374 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5375 soap->ntlm_challenge = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5376 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5377 soap->proxy_from = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5378 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5379 { soap->length = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5380 soap->http_content = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5381 soap->action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5382 soap->status = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5383 soap->body = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5384 if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5385 { if (soap->error == SOAP_EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5386 return SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5387 return soap->error = 414;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5388 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5389 if ((s = strchr(soap->msgbuf, ' ')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5390 { soap->status = (unsigned short)soap_strtoul(s, &s, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5391 if (!soap_blank((soap_wchar)*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5392 soap->status = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5393 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5394 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5395 soap->status = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5396 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5397 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5398 { if (soap_getline(soap, header, SOAP_HDRLEN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5399 { if (soap->error == SOAP_EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5400 { soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5401 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5402 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5403 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5404 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5405 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5406 if (!*header)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5407 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5408 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5409 s = strchr(header, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5410 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5411 { char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5412 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5413 do s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5414 while (*s && *s <= 32);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5415 if (*s == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5416 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5417 t = s + strlen(s) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5418 while (t > s && *t <= 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5419 t--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5420 if (t >= s && *t == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5421 t--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5422 t[1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5423 if ((soap->error = soap->fparsehdr(soap, header, s)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5424 { if (soap->error < SOAP_STOP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5425 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5426 status = soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5427 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5428 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5429 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5430 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5431 } while (soap->status == 100);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5432 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5433 s = strstr(soap->msgbuf, "HTTP/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5434 if (s && s[7] != '1')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5435 { if (soap->keep_alive == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5436 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5437 if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5438 soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5439 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5440 if (soap->keep_alive < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5441 soap->keep_alive = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5442 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5443 if (soap->status == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5444 { size_t l = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5445 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5446 { if (!strncmp(soap->msgbuf, "POST ", l = 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5447 httpcmd = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5448 else if (!strncmp(soap->msgbuf, "PUT ", l = 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5449 httpcmd = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5450 else if (!strncmp(soap->msgbuf, "GET ", l = 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5451 httpcmd = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5452 else if (!strncmp(soap->msgbuf, "DELETE ", l = 7))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5453 httpcmd = 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5454 else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5455 httpcmd = 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5456 else if (!strncmp(soap->msgbuf, "HEAD ", l = 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5457 httpcmd = 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5459 if (s && httpcmd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5460 { size_t m = strlen(soap->endpoint);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5461 size_t n = m + (s - soap->msgbuf) - l - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5462 size_t k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5463 if (n >= sizeof(soap->endpoint))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5464 n = sizeof(soap->endpoint) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5465 if (m > n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5466 m = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5467 k = n - m + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5468 if (k > sizeof(soap->path))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5469 k = sizeof(soap->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5470 strncpy(soap->path, soap->msgbuf + l, k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5471 soap->path[k - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5472 if (*soap->path && *soap->path != '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5473 *soap->endpoint = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5474 strcat(soap->endpoint, soap->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5475 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5476 if (httpcmd > 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5477 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP %s handler\n", soap->msgbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5478 switch (httpcmd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5479 { case 2: soap->error = soap->fput(soap); break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5480 case 3: soap->error = soap->fget(soap); break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5481 case 4: soap->error = soap->fdel(soap); break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5482 case 5: soap->error = soap->fopt(soap); break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5483 case 6: soap->error = soap->fhead(soap); break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5484 default: soap->error = 405; break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5486 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP handler return = %d\n", soap->error));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5487 if (soap->error == SOAP_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5488 soap->error = SOAP_STOP; /* prevents further processing */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5489 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5490 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5491 if (status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5492 return soap->error = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5493 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5494 else if (status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5495 return soap->error = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5496 else if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5497 return soap->error = 405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5498 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5499 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5500 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5501 if (soap->length > 0 || (soap->http_content && (!soap->keep_alive || soap->recv_timeout)) || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5502 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5503 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5504 { if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5505 || soap->status == 400 /* Bad Request */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5506 || soap->status == 500) /* Internal Server Error */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5507 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5508 /* force close afterwards in soap_closesock() */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5509 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5510 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5511 /* read HTTP body for error details */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5512 s = soap_get_http_body(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5513 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5514 return soap_set_receiver_error(soap, soap->msgbuf, s, soap->status);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5515 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5516 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5517 else if (soap->status >= 200 && soap->status <= 299)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5518 return soap->error = soap->status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5519 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", soap->status));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5520 return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, soap->status);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5521 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5522 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5523 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5524
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5525 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5526 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5527 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5528 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5529 http_parse_header(struct soap *soap, const char *key, const char *val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5530 { if (!soap_tag_cmp(key, "Host"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5531 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5532 #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5533 if (soap->imode & SOAP_ENC_SSL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5534 strcpy(soap->endpoint, "https://");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5535 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5536 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5537 strcpy(soap->endpoint, "http://");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5538 strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5539 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5540 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5541 else if (!soap_tag_cmp(key, "Content-Type"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5542 { const char *action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5543 soap->http_content = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5544 if (soap_get_header_attribute(soap, val, "application/dime"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5545 soap->imode |= SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5546 else if (soap_get_header_attribute(soap, val, "multipart/related")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5547 || soap_get_header_attribute(soap, val, "multipart/form-data"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5548 { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5549 soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5550 soap->imode |= SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5552 action = soap_get_header_attribute(soap, val, "action");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5553 if (action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5554 { if (*action == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5555 { soap->action = soap_strdup(soap, action + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5556 if (*soap->action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5557 soap->action[strlen(soap->action) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5558 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5559 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5560 soap->action = soap_strdup(soap, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5561 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5562 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5563 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5564 else if (!soap_tag_cmp(key, "Content-Length"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5565 { soap->length = soap_strtoul(val, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5566 if (!soap->length)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5567 soap->body = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5568 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5569 else if (!soap_tag_cmp(key, "Content-Encoding"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5570 { if (!soap_tag_cmp(val, "deflate"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5571 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5572 soap->zlib_in = SOAP_ZLIB_DEFLATE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5573 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5574 return SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5575 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5576 else if (!soap_tag_cmp(val, "gzip"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5577 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5578 soap->zlib_in = SOAP_ZLIB_GZIP;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5579 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5580 return SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5581 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5583 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5584 else if (!soap_tag_cmp(key, "Accept-Encoding"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5585 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5586 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5587 if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5588 soap->zlib_out = SOAP_ZLIB_GZIP;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5589 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5590 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5591 if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5592 soap->zlib_out = SOAP_ZLIB_DEFLATE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5593 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5594 soap->zlib_out = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5595 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5596 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5597 else if (!soap_tag_cmp(key, "Transfer-Encoding"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5598 { soap->imode &= ~SOAP_IO;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5599 if (!soap_tag_cmp(val, "chunked"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5600 soap->imode |= SOAP_IO_CHUNK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5601 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5602 else if (!soap_tag_cmp(key, "Connection"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5603 { if (!soap_tag_cmp(val, "keep-alive"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5604 soap->keep_alive = -soap->keep_alive;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5605 else if (!soap_tag_cmp(val, "close"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5606 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5608 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5609 else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5610 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5611 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5612 if (!soap_tag_cmp(val, "NTLM*"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5613 soap->ntlm_challenge = soap_strdup(soap, val + 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5614 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5615 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5616 if (!soap_tag_cmp(val, "Basic *"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5617 { int n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5618 char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5619 soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5620 soap->tmpbuf[n] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5621 if ((s = strchr(soap->tmpbuf, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5622 { *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5623 soap->userid = soap_strdup(soap, soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5624 soap->passwd = soap_strdup(soap, s + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5625 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5626 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5627 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5628 else if (!soap_tag_cmp(key, "WWW-Authenticate") || !soap_tag_cmp(key, "Proxy-Authenticate"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5629 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5630 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5631 if (!soap_tag_cmp(val, "NTLM*"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5632 soap->ntlm_challenge = soap_strdup(soap, val + 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5633 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5634 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5635 soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5636 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5637 else if (!soap_tag_cmp(key, "Expect"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5638 { if (!soap_tag_cmp(val, "100-continue"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5639 { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5640 || (soap->error = soap->fposthdr(soap, NULL, NULL)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5641 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5643 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5644 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5645 else if (!soap_tag_cmp(key, "SOAPAction"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5646 { if (*val == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5647 { soap->action = soap_strdup(soap, val + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5648 if (*soap->action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5649 soap->action[strlen(soap->action) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5650 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5651 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5652 soap->action = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5653 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5654 else if (!soap_tag_cmp(key, "Location"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5655 { strncpy(soap->endpoint, val, sizeof(soap->endpoint));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5656 soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5657 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5658 else if (!soap_tag_cmp(key, "X-Forwarded-For"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5659 { soap->proxy_from = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5661 #ifdef WITH_COOKIES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5662 else if (!soap_tag_cmp(key, "Cookie")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5663 || !soap_tag_cmp(key, "Cookie2")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5664 || !soap_tag_cmp(key, "Set-Cookie")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5665 || !soap_tag_cmp(key, "Set-Cookie2"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5666 { soap_getcookies(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5668 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5669 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5671 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5672 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5673
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5674 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5675 #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5676 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5677 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5678 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5679 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5680 soap_get_header_attribute(struct soap *soap, const char *line, const char *key)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5681 { register const char *s = line;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5682 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5683 { while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5684 { register short flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5685 s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5686 flag = soap_tag_cmp(soap->tmpbuf, key);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5687 s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5688 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5689 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5690 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5691 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5692 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5693 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5694 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5695 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5696
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5697 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5698 #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5699 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5700 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5701 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5702 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5703 soap_decode_key(char *buf, size_t len, const char *val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5704 { return soap_decode(buf, len, val, "=,;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5705 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5706 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5707 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5708
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5709 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5710 #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5711 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5712 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5713 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5714 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5715 soap_decode_val(char *buf, size_t len, const char *val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5716 { if (*val != '=')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5717 { *buf = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5718 return val;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5719 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5720 return soap_decode(buf, len, val + 1, ",;");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5721 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5722 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5723 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5724
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5725 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5726 #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5727 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5728 static const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5729 soap_decode(char *buf, size_t len, const char *val, const char *sep)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5730 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5731 char *t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5732 size_t i = len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5733 for (s = val; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5734 if (*s != ' ' && *s != '\t' && !strchr(sep, *s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5735 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5736 if (len > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5737 { if (*s == '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5738 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5739 while (*s && *s != '"' && --i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5740 *t++ = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5741 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5742 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5743 { while (*s && !soap_blank((soap_wchar)*s) && !strchr(sep, *s) && --i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5744 { if (*s == '%' && s[1] && s[2])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5745 { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5746 + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5747 s += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5748 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5749 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5750 *t++ = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5751 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5753 buf[len - 1] = '\0'; /* appease */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5754 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5755 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5756 while (*s && !strchr(sep, *s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5757 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5758 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5759 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5760 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5761 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5762
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5763 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5764 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5765 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5766 static const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5767 http_error(struct soap *soap, int status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5768 { register const char *msg = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5769 (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5770 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5771 msg = soap_code_str(h_http_error_codes, status);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5772 if (!msg)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5773 msg = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5774 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5775 return msg;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5776 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5777 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5778 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5779
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5780 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5781
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5782 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5783 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5784 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5785 http_get(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5786 { (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5787 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5788 return SOAP_GET_METHOD;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5789 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5790 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5791 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5792
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5793 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5794 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5795 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5796 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5797 http_405(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5798 { (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5799 return 405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5800 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5801 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5802 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5803
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5804 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5805 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5806 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5807 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5808 http_200(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5809 { return soap_send_empty_response(soap, 200);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5810 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5811 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5812 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5813
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5814 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5815 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5816 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5817 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5818 http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5819 { register const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5820 register int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5821 switch (soap->status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5822 { case SOAP_GET:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5823 s = "GET";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5824 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5825 case SOAP_PUT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5826 s = "PUT";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5827 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5828 case SOAP_DEL:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5829 s = "DELETE";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5830 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5831 case SOAP_CONNECT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5832 s = "CONNECT";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5833 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5834 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5835 s = "POST";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5836 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5837 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5838 #ifdef PALM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5839 if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5840 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5841 if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5842 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5843 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5844 if (strlen(endpoint) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5845 || strlen(host) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5846 return soap->error = SOAP_EOM; /* prevent overrun (note that 'host' and 'soap->host' are substrings of 'endpoint') */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5847 if (soap->status == SOAP_CONNECT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5848 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5849 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5850 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5851 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5852 sprintf(soap->tmpbuf, "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5853 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5854 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5855 else if (soap->proxy_host && endpoint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5856 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5857 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5858 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%s %s HTTP/%s", s, endpoint, soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5859 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5860 sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5861 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5863 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5864 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5865 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5866 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5867 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5868 sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5869 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5870 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5871 if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5872 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5873 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5874 if ((soap->ssl && port != 443) || (!soap->ssl && port != 80))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5875 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5876 if (port != 80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5877 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5878 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5879 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5880 if (*host != '[' && strchr(host, ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5881 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5882 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5883 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "[%s]:%d", host, port); /* RFC 2732 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5884 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5885 sprintf(soap->tmpbuf, "[%s]:%d", host, port); /* RFC 2732 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5886 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5888 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5889 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5890 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5891 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5892 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%s:%d", host, port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5893 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5894 sprintf(soap->tmpbuf, "%s:%d", host, port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5895 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5896 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5897 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5898 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5899 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5900 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5901 if (*host != '[' && strchr(host, ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5902 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5903 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5904 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "[%s]", host); /* RFC 2732 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5905 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5906 sprintf(soap->tmpbuf, "[%s]", host); /* RFC 2732 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5907 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5908 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5909 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5910 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5911 strcpy(soap->tmpbuf, host);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5912 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5913 if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5914 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5915 if ((err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5916 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5917 if ((err = soap_puthttphdr(soap, SOAP_OK, count)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5918 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5919 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5920 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5921 if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5922 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5923 if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5924 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5925 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5926 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5927 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5928 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5929 if (soap->ntlm_challenge && strlen(soap->ntlm_challenge) + 6 < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5930 { if (*soap->ntlm_challenge)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5931 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5932 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5933 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "NTLM %s", soap->ntlm_challenge);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5934 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5935 sprintf(soap->tmpbuf, "NTLM %s", soap->ntlm_challenge);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5936 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5937 if (soap->proxy_host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5938 { if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5939 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5940 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5941 else if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5942 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5943 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5944 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5945 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5946 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5947 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5948 if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5949 { strcpy(soap->tmpbuf, "Basic ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5950 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5951 soap_snprintf(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, "%s:%s", soap->userid, soap->passwd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5952 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5953 sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5954 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5955 soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5956 if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5957 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5959 if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5960 { strcpy(soap->tmpbuf, "Basic ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5961 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5962 soap_snprintf(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5963 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5964 sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5965 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5966 soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5967 if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5968 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5969 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5970 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5971 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5972 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5973 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5974 #ifdef WITH_COOKIES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5975 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5976 if (soap_putcookies(soap, host, path, soap->ssl != NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5977 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5978 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5979 if (soap_putcookies(soap, host, path, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5980 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5981 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5982 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5983 if (action && soap->status != SOAP_GET && soap->status != SOAP_DEL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5984 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5985 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5986 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "\"%s\"", action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5987 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5988 sprintf(soap->tmpbuf, "\"%s\"", strlen(action) < sizeof(soap->tmpbuf) - 3 ? action : SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5989 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5990 if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5991 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5992 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5993 return soap->fposthdr(soap, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5994 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5995 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5996 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5997
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5998 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
5999 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6000 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6001 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6002 http_send_header(struct soap *soap, const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6003 { register const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6004 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6005 { t = strchr(s, '\n'); /* disallow \n in HTTP headers */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6006 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6007 t = s + strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6008 if (soap_send_raw(soap, s, t - s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6009 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6010 s = t + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6011 } while (*t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6012 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6013 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6014 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6015 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6016
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6017 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6018 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6019 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6020 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6021 http_post_header(struct soap *soap, const char *key, const char *val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6022 { if (key)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6023 { if (http_send_header(soap, key))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6024 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6025 if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6026 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6027 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6028 return soap_send_raw(soap, "\r\n", 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6029 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6030 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6031 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6032
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6033 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6034 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6035 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6036 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6037 http_response(struct soap *soap, int status, size_t count)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6038 { register int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6039 char http[10];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6040 int code = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6041 const char *line;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6042 #ifdef WMW_RPM_IO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6043 if (soap->rpmreqid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6044 httpOutputEnable(soap->rpmreqid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6045 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6046 if (!soap->http_version || strlen(soap->http_version) > 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6047 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6048 #ifdef WMW_RPM_IO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6049 if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6050 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6051 if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application (socket) or CGI (stdin/out)? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6052 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6053 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6054 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6055 soap_snprintf(http, sizeof(http), "HTTP/%s", soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6056 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6057 sprintf(http, "HTTP/%s", soap->http_version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6058 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6059 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6060 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6061 strcpy(http, "Status:");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6062 if (!status || status == SOAP_HTML || status == SOAP_FILE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6063 { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6064 code = 200;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6065 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6066 code = 202;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6068 else if (status < 200 || status >= 600)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6069 { const char *s = *soap_faultcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6070 if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6071 code = 405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6072 else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6073 code = 400;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6074 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6075 code = 500;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6076 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6077 line = http_error(soap, code);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6078 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6079 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6080 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%s %d %s", http, code, line);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6081 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6082 sprintf(soap->tmpbuf, "%s %d %s", http, code, line);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6083 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6084 if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6085 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6086 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6087 if (status == 401)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6088 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6089 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6090 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14) ? soap->authrealm : "gSOAP Web Service");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6091 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6092 sprintf(soap->tmpbuf, "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14) ? soap->authrealm : "gSOAP Web Service");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6093 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6094 if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6095 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6096 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6097 else if ((status >= 301 && status <= 303) || status == 307)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6098 { if ((err = soap->fposthdr(soap, "Location", soap->endpoint)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6099 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6100 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6101 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6102 if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.8"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6103 || (err = soap_puthttphdr(soap, status, count)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6104 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6105 #ifdef WITH_COOKIES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6106 if (soap_putsetcookies(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6107 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6108 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6109 return soap->fposthdr(soap, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6110 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6111 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6112 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6113
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6114 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6115 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6116 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6117 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6118 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6119 soap_response(struct soap *soap, int status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6120 { register size_t count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6121 if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6122 && (status == SOAP_HTML || status == SOAP_FILE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6123 soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6124 soap->status = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6125 count = soap_count_attachments(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6126 if (soap_begin_send(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6127 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6128 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6129 if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6130 { register int n = soap->mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6131 soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6132 if ((n & SOAP_IO) != SOAP_IO_FLUSH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6133 soap->mode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6134 if ((soap->error = soap->fresponse(soap, status, count)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6135 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6136 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6137 if ((n & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6138 { if (soap_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6139 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6141 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6142 soap->mode = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6143 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6144 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6145 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6146 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6147 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6148
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6149 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6150 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6151 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6152 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6153 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6154 soap_url(struct soap *soap, const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6155 { if (!t || (*t != '/' && *t != '?') || strlen(s) + strlen(t) >= sizeof(soap->msgbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6156 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6157 strcpy(soap->msgbuf, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6158 strcat(soap->msgbuf, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6159 return soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6160 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6161 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6162
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6163 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6164 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6165 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6166 size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6167 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6168 soap_encode_url(const char *s, char *t, size_t len)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6169 { register int c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6170 register size_t n = len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6171 while ((c = *s++) && --n > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6172 { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}#!$&'*+", c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6173 *t++ = c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6174 else if (n > 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6175 { *t++ = '%';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6176 *t++ = (c >> 4) + (c > 159 ? '7' : '0');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6177 c &= 0xF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6178 *t++ = c + (c > 9 ? '7' : '0');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6179 n -= 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6180 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6181 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6182 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6183 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6184 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6185 return len - n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6186 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6187 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6188
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6189 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6190 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6191 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6192 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6193 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6194 soap_encode_url_string(struct soap *soap, const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6195 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6196 { size_t n = 3*strlen(s)+1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6197 char *t = (char*)soap_malloc(soap, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6198 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6199 { soap_encode_url(s, t, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6200 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6202 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6203 return SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6204 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6205 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6206
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6207 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6208 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6209 * HTTP Cookies
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6210 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6211 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6212
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6213 #ifdef WITH_COOKIES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6214 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6215 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6216 struct soap_cookie*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6217 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6218 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6219 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6220 if (!domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6221 domain = soap->cookie_domain;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6222 if (!path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6223 path = soap->cookie_path;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6224 if (!path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6225 path = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6226 else if (*path == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6227 path++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6228 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6229 for (p = soap->cookies; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6230 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie in database: %s='%s' domain='%s' path='%s' env=%hd\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->env));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6231 if (!strcmp(p->name, name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6232 && p->domain
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6233 && p->path
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6234 && !strcmp(p->domain, domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6235 && (!*p->path || !strncmp(p->path, path, strlen(p->path))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6236 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6238 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6239 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6240
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6241 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6242 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6243 struct soap_cookie*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6244 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6245 soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6246 { struct soap_cookie **p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6247 int n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6248 if (!domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6249 domain = soap->cookie_domain;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6250 if (!path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6251 path = soap->cookie_path;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6252 if (!path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6253 path = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6254 else if (*path == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6255 path++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6256 q = soap_cookie(soap, name, domain, path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6257 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set %scookie: %s='%s' domain='%s' path='%s'\n", q ? SOAP_STR_EOS : "new ", name, value ? value : "(null)", domain ? domain : "(null)", path ? path : "(null)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6258 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6259 { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6260 { if ((q->name = (char*)SOAP_MALLOC(soap, strlen(name)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6261 strcpy(q->name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6262 q->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6263 q->domain = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6264 q->path = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6265 q->expire = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6266 q->maxage = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6267 q->version = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6268 q->secure = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6269 q->modified = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6270 for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6271 if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6272 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6273 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6274 { q->next = *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6275 *p = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6276 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6277 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6278 { SOAP_FREE(soap, q->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6279 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6280 q = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6284 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6285 q->modified = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6286 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6287 { if (q->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6288 { if (!value || strcmp(value, q->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6289 { SOAP_FREE(soap, q->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6290 q->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6291 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6292 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6293 if (value && *value && !q->value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6294 strcpy(q->value, value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6295 if (q->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6296 { if (!domain || strcmp(domain, q->domain))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6297 { SOAP_FREE(soap, q->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6298 q->domain = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6299 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6300 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6301 if (domain && !q->domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6302 strcpy(q->domain, domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6303 if (q->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6304 { if (!path || strncmp(path, q->path, strlen(q->path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6305 { SOAP_FREE(soap, q->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6306 q->path = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6307 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6308 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6309 if (path && !q->path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6310 strcpy(q->path, path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6311 q->session = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6312 q->env = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6313 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6314 return q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6315 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6316
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6317 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6318 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6319 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6320 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6321 soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6322 { struct soap_cookie **p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6323 if (!domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6324 domain = soap->cookie_domain;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6325 if (!domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6326 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie domain not set\n", name ? name : "(null)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6327 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6328 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6329 if (!path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6330 path = soap->cookie_path;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6331 if (!path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6332 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie='%s': cookie path not set\n", name ? name : "(null)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6333 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6334 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6335 if (*path == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6336 path++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6337 for (p = &soap->cookies, q = *p; q; q = *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6338 { if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6339 { if (q->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6340 SOAP_FREE(soap, q->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6341 if (q->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6342 SOAP_FREE(soap, q->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6343 if (q->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6344 SOAP_FREE(soap, q->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6345 *p = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6346 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6347 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6348 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6349 p = &q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6350 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6351 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6352
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6353 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6354 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6355 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6356 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6357 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6358 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6359 if ((p = soap_cookie(soap, name, domain, path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6360 return p->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6361 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6362 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6363
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6364 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6365 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6366 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6367 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6368 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6369 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6370 if ((p = soap_cookie(soap, name, domain, path)) && p->env)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6371 return p->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6372 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6374
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6375 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6376 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6377 time_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6378 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6379 soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6380 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6381 if ((p = soap_cookie(soap, name, domain, path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6382 return p->expire;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6383 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6384 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6385
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6386 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6387 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6388 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6389 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6390 soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6391 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6392 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", expire, name, domain ? domain : "(null)", path ? path : "(null)"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6393 if ((p = soap_cookie(soap, name, domain, path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6394 { p->maxage = expire;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6395 p->modified = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6396 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6397 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6398 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6400
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6401 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6402 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6403 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6404 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6405 soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6406 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6407 if ((p = soap_cookie(soap, name, domain, path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6408 { p->session = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6409 p->modified = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6410 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6411 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6412 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6413 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6414
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6415 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6416 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6417 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6418 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6419 soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6420 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6421 if ((p = soap_cookie(soap, name, domain, path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6422 { p->session = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6423 p->modified = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6424 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6425 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6426 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6427 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6428
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6429 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6430 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6431 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6432 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6433 soap_putsetcookies(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6434 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6435 char *s, tmp[4096];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6436 const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6437 for (p = soap->cookies; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6438 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6439 if (p->modified
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6440 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6441 || (!p->env && !soap->ssl == !p->secure)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6442 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6443 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6444 { s = tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6445 if (p->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6446 s += soap_encode_url(p->name, s, tmp-s+4064);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6447 if (p->value && *p->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6448 { *s++ = '=';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6449 s += soap_encode_url(p->value, s, tmp-s+4064);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6450 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6451 if (p->domain && (int)strlen(p->domain) < tmp-s+4064)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6452 { strcpy(s, ";Domain=");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6453 strcat(s, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6454 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6455 else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6456 { strcpy(s, ";Domain=");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6457 strcat(s, soap->cookie_domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6458 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6459 strcat(s, ";Path=/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6460 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6461 if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6462 t = p->path;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6463 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6464 t = soap->cookie_path;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6465 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6466 { if (*t == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6467 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6468 if ((int)strlen(t) < tmp-s+4064)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6469 { if (strchr(t, '%')) /* already URL encoded? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6470 { strcpy(s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6471 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6472 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6473 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6474 s += soap_encode_url(t, s, tmp-s+4064);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6475 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6477 if (p->version > 0 && s-tmp < 4060)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6478 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6479 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6480 soap_snprintf(s, 4096 - (s-tmp), ";Version=%u", p->version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6481 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6482 sprintf(s, ";Version=%u", p->version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6483 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6484 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6486 if (p->maxage >= 0 && s-tmp < 4060)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6487 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6488 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6489 soap_snprintf(s, 4096 - (s-tmp), ";Max-Age=%ld", p->maxage);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6490 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6491 sprintf(s, ";Max-Age=%ld", p->maxage);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6492 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6493 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6494 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6495 if (s-tmp < 4073
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6496 && (p->secure
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6497 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6498 || soap->ssl
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6499 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6500 ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6501 strcpy(s, ";Secure");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6502 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6503 if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6504 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6505 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6507 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6508 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6509
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6510 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6511 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6512 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6513 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6514 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6515 { struct soap_cookie **p, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6516 unsigned int version = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6517 time_t now = time(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6518 char *s, tmp[4096];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6519 if (!domain || !path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6520 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6521 s = tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6522 p = &soap->cookies;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6523 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain='%s' path='%s'\n", domain, path));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6524 if (*path == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6525 path++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6526 while ((q = *p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6527 { if (q->expire && now > q->expire)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6528 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6529 SOAP_FREE(soap, q->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6530 if (q->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6531 SOAP_FREE(soap, q->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6532 if (q->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6533 SOAP_FREE(soap, q->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6534 if (q->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6535 SOAP_FREE(soap, q->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6536 *p = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6537 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6538 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6539 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6540 { int flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6541 char *t = q->domain;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6542 size_t n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6543 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6544 flag = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6545 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6546 { const char *r = strchr(t, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6547 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6548 n = r - t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6549 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6550 n = strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6551 flag = !strncmp(t, domain, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6552 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6553 /* domain-level cookies, cannot compile when WITH_NOIO set */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6554 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6555 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6556 { struct hostent *hostent = gethostbyname((char*)domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6557 if (hostent)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6558 { const char *r = strchr(hostent->h_name, '.');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6559 if (!r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6560 r = hostent->h_name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6561 flag = !strncmp(t, r, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6562 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6563 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6564 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6565 if (flag
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6566 && (!q->path || !strncmp(q->path, path, strlen(q->path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6567 && (!q->secure || secure))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6568 { size_t n = 12;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6569 if (q->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6570 n += 3*strlen(q->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6571 if (q->value && *q->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6572 n += 3*strlen(q->value) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6573 if (q->path && *q->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6574 n += strlen(q->path) + 9;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6575 if (q->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6576 n += strlen(q->domain) + 11;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6577 if (tmp - s + n > sizeof(tmp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6578 { if (s == tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6579 return SOAP_OK; /* HTTP header size overflow */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6580 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6581 if ((soap->error = soap->fposthdr(soap, "Cookie", tmp)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6582 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6583 s = tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6584 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6585 else if (s != tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6586 { strcat(s, " ");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6587 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6588 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6589 if (q->version != version && s-tmp < 4060)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6590 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6591 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6592 soap_snprintf(s, 4096 - (s-tmp), "$Version=%u;", q->version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6593 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6594 sprintf(s, "$Version=%u;", q->version);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6595 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6596 version = q->version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6597 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6598 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6599 if (q->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6600 s += soap_encode_url(q->name, s, tmp+sizeof(tmp)-s-16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6601 if (q->value && *q->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6602 { *s++ = '=';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6603 s += soap_encode_url(q->value, s, tmp+sizeof(tmp)-s-16);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6604 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6605 if (q->path && (s-tmp) + strlen(q->path) < 4060)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6606 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6607 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6608 soap_snprintf(s, 4096 - (s-tmp), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6609 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6610 sprintf(s, ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6611 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6612 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6613 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6614 if (q->domain && (s-tmp) + strlen(q->domain) < 4060)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6615 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6616 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6617 soap_snprintf(s, 4096 - (s-tmp), ";$Domain=\"%s\"", q->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6618 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6619 sprintf(s, ";$Domain=\"%s\"", q->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6620 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6621 s += strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6622 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6623 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6624 p = &q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6625 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6626 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6627 if (s != tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6628 if ((soap->error = soap->fposthdr(soap, "Cookie", tmp)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6629 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6630 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6631 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6632
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6633 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6634 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6635 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6636 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6637 soap_getcookies(struct soap *soap, const char *val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6638 { struct soap_cookie *p = NULL, *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6639 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6640 char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6641 char *domain = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6642 char *path = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6643 unsigned int version = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6644 time_t now = time(NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6645 if (!val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6646 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6647 s = val;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6648 while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6649 { s = soap_decode_key(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6650 if (!soap_tag_cmp(tmp, "$Version"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6651 { if ((s = soap_decode_val(tmp, sizeof(tmp), s)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6652 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6653 p->version = (int)soap_strtol(tmp, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6654 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6655 version = (int)soap_strtol(tmp, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6656 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6657 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6658 else if (!soap_tag_cmp(tmp, "$Path"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6659 { s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6660 if (*tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6661 { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6662 strcpy(t, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6663 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6664 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6665 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6666 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6667 { if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6668 SOAP_FREE(soap, p->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6669 p->path = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6671 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6672 { if (path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6673 SOAP_FREE(soap, path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6674 path = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6675 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6676 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6677 else if (!soap_tag_cmp(tmp, "$Domain"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6678 { s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6679 if (*tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6680 { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6681 strcpy(t, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6683 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6684 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6685 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6686 { if (p->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6687 SOAP_FREE(soap, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6688 p->domain = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6690 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6691 { if (domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6692 SOAP_FREE(soap, domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6693 domain = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6695 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6696 else if (p && !soap_tag_cmp(tmp, "Path"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6697 { if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6698 SOAP_FREE(soap, p->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6699 s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6700 if (*tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6701 { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6702 strcpy(p->path, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6703 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6704 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6705 p->path = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6706 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6707 else if (p && !soap_tag_cmp(tmp, "Domain"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6708 { if (p->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6709 SOAP_FREE(soap, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6710 s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6711 if (*tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6712 { if ((p->domain = (char*)SOAP_MALLOC(soap, strlen(tmp)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6713 strcpy(p->domain, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6714 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6715 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6716 p->domain = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6717 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6718 else if (p && !soap_tag_cmp(tmp, "Version"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6719 { s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6720 p->version = (unsigned int)soap_strtoul(tmp, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6721 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6722 else if (p && !soap_tag_cmp(tmp, "Max-Age"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6723 { s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6724 p->expire = now + soap_strtol(tmp, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6725 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6726 else if (p && !soap_tag_cmp(tmp, "Expires"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6727 { struct tm T;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6728 char a[3];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6729 static const char mns[] = "anebarprayunulugepctovec";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6730 s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6731 if (strlen(tmp) > 20)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6732 { memset((void*)&T, 0, sizeof(T));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6733 a[0] = tmp[4];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6734 a[1] = tmp[5];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6735 a[2] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6736 T.tm_mday = (int)soap_strtol(a, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6737 a[0] = tmp[8];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6738 a[1] = tmp[9];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6739 T.tm_mon = (int)(strstr(mns, a) - mns) / 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6740 a[0] = tmp[11];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6741 a[1] = tmp[12];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6742 T.tm_year = 100 + (int)soap_strtol(a, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6743 a[0] = tmp[13];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6744 a[1] = tmp[14];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6745 T.tm_hour = (int)soap_strtol(a, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6746 a[0] = tmp[16];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6747 a[1] = tmp[17];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6748 T.tm_min = (int)soap_strtol(a, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6749 a[0] = tmp[19];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6750 a[1] = tmp[20];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6751 T.tm_sec = (int)soap_strtol(a, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6752 p->expire = soap_timegm(&T);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6753 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6754 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6755 else if (p && !soap_tag_cmp(tmp, "Secure"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6756 p->secure = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6757 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6758 { if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6759 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6760 if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6761 { q->version = p->version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6762 q->expire = p->expire;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6763 q->secure = p->secure;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6764 q->env = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6766 if (p->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6767 SOAP_FREE(soap, p->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6768 if (p->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6769 SOAP_FREE(soap, p->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6770 if (p->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6771 SOAP_FREE(soap, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6772 if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6773 SOAP_FREE(soap, p->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6774 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6775 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6776 if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6777 { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6778 strcpy(p->name, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6779 s = soap_decode_val(tmp, sizeof(tmp), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6780 if (*tmp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6781 { p->value = (char*)SOAP_MALLOC(soap, strlen(tmp)+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6782 strcpy(p->value, tmp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6783 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6784 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6785 p->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6786 if (domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6787 p->domain = domain;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6788 else if (*soap->host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6789 { p->domain = (char*)SOAP_MALLOC(soap, strlen(soap->host)+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6790 strcpy(p->domain, soap->host);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6791 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6792 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6793 p->domain = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6794 if (path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6795 p->path = path;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6796 else if (soap->path && *soap->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6797 { p->path = (char*)SOAP_MALLOC(soap, strlen(soap->path)+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6798 strcpy(p->path, soap->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6799 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6800 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6801 { p->path = (char*)SOAP_MALLOC(soap, 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6802 strcpy(p->path, "/");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6803 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6804 p->expire = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6805 p->secure = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6806 p->version = version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6807 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6808 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6809 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6810 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6811 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=%ld secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6812 if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6813 { q->version = p->version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6814 q->expire = p->expire;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6815 q->secure = p->secure;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6816 q->env = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6817 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6818 if (p->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6819 SOAP_FREE(soap, p->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6820 if (p->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6821 SOAP_FREE(soap, p->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6822 if (p->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6823 SOAP_FREE(soap, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6824 if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6825 SOAP_FREE(soap, p->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6826 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6827 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6828 if (domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6829 SOAP_FREE(soap, domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6830 if (path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6831 SOAP_FREE(soap, path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6833
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6834 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6835 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6836 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6837 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6838 soap_getenv_cookies(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6839 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6840 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6841 char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6842 if (!(s = getenv("HTTP_COOKIE")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6843 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6844 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6845 { s = soap_decode_key(key, sizeof(key), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6846 s = soap_decode_val(val, sizeof(val), s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6847 p = soap_set_cookie(soap, key, val, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6848 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6849 p->env = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6850 } while (*s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6851 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6852 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6853
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6854 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6855 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6856 struct soap_cookie*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6857 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6858 soap_copy_cookies(struct soap *copy, const struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6859 { struct soap_cookie *p, **q, *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6860 q = &r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6861 for (p = soap->cookies; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6862 { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6863 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6864 **q = *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6865 if (p->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6866 { if (((*q)->name = (char*)SOAP_MALLOC(copy, strlen(p->name)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6867 strcpy((*q)->name, p->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6868 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6869 if (p->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6870 { if (((*q)->value = (char*)SOAP_MALLOC(copy, strlen(p->value)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6871 strcpy((*q)->value, p->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6872 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6873 if (p->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6874 { if (((*q)->domain = (char*)SOAP_MALLOC(copy, strlen(p->domain)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6875 strcpy((*q)->domain, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6876 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6877 if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6878 { if (((*q)->path = (char*)SOAP_MALLOC(copy, strlen(p->path)+1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6879 strcpy((*q)->path, p->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6880 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6881 q = &(*q)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6882 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6883 *q = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6884 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6885 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6886
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6887 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6888 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6889 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6890 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6891 soap_free_cookies(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6892 { struct soap_cookie *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6893 for (p = soap->cookies; p; p = soap->cookies)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6894 { soap->cookies = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6895 SOAP_FREE(soap, p->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6896 if (p->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6897 SOAP_FREE(soap, p->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6898 if (p->domain)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6899 SOAP_FREE(soap, p->domain);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6900 if (p->path)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6901 SOAP_FREE(soap, p->path);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6902 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6903 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6904 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6905
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6906 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6907 #endif /* WITH_COOKIES */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6908
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6909 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6910 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6911 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6912 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6913 size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6914 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6915 soap_hash(register const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6916 { register size_t h = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6917 while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6918 h = 65599*h + *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6919 return h % SOAP_IDHASH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6921 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6922 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6923
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6924 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6925 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6926 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6927 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6928 soap_init_pht(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6929 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6930 soap->pblk = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6931 soap->pidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6932 for (i = 0; i < (int)SOAP_PTRHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6933 soap->pht[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6934 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6935 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6936 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6937
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6938 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6939 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6940 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6941 struct soap*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6942 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6943 soap_versioning(soap_new)(soap_mode imode, soap_mode omode)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6944 { struct soap *soap = (struct soap*)malloc(sizeof(struct soap));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6945 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6946 soap_versioning(soap_init)(soap, imode, omode);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6947 return soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6948 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6949 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6950
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6951 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6952 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6953 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6954 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6955 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6956 soap_free(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6957 { soap_done(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6958 free(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6959 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6960 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6961
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6962 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6963 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6964 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6965 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6966 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6967 soap_del(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6968 { free(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6969 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6970 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6971
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6972 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6973 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6974 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6975 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6976 soap_free_pht(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6977 { register struct soap_pblk *pb, *next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6978 register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6979 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6980 for (pb = soap->pblk; pb; pb = next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6981 { next = pb->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6982 SOAP_FREE(soap, pb);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6983 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6984 soap->pblk = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6985 soap->pidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6986 for (i = 0; i < (int)SOAP_PTRHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6987 soap->pht[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6988 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6989 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6990 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6991
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6992 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6993 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6994 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6995 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6996 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6997 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6998 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
6999 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7000 struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7001 (void)soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7002 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7003 soap->encoding = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7004 if (a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7005 i = soap_array_pointer_lookup(soap, p, a, n, type, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7006 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7007 i = soap_pointer_lookup(soap, p, type, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7008 if (i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7009 { if (soap_is_embedded(soap, pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7010 || soap_is_single(soap, pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7011 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7012 soap_set_embedded(soap, pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7013 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7014 return i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7015 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7016 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7017 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7018
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7019 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7020 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7021 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7022 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7023 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7024 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7025 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7026 { register struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7027 *ppp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7028 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7029 { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7030 { if (pp->ptr == p && pp->type == type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7031 { *ppp = pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7032 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7033 return pp->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7034 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7035 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7037 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7038 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7039 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7040 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7041 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7042
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7043 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7044 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7045 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7046 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7047 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7048 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7049 soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7050 { register size_t h;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7051 register struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7052 (void)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7053 if (!soap->pblk || soap->pidx >= SOAP_PTRBLK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7054 { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7055 if (!pb)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7056 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7057 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7058 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7059 pb->next = soap->pblk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7060 soap->pblk = pb;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7061 soap->pidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7062 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7063 *ppp = pp = &soap->pblk->plist[soap->pidx++];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7064 if (a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7065 h = soap_hash_ptr(a->__ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7066 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7067 h = soap_hash_ptr(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7068 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%d\n", p, a ? a->__ptr : NULL, a ? a->__size : 0, n, type, soap->idnum+1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7069 pp->next = soap->pht[h];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7070 pp->type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7071 pp->mark1 = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7072 pp->mark2 = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7073 pp->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7074 pp->array = a;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7075 soap->pht[h] = pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7076 pp->id = ++soap->idnum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7077 return pp->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7078 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7079 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7080 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7081
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7082 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7083 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7084 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7085 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7086 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7087 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7088 soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7089 { register struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7090 *ppp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7091 if (!p || !a->__ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7092 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7093 for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7094 { if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7095 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7096 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7097 if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7098 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7099 if (i == n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7100 { *ppp = pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7101 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7102 return pp->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7103 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7104 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7105 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7106 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7107 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7108 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7109 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7110 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7111
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7112 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7113 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7114 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7115 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7116 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7117 soap_begin_count(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7118 { soap_free_ns(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7119 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7120 if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7121 soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7122 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7123 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7124 { soap->mode = soap->omode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7125 if ((soap->mode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7126 soap->mode |= SOAP_ENC_XML;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7127 if ((soap->mode & SOAP_IO) == SOAP_IO_STORE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7128 || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7129 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7130 && !soap->fpreparesend
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7131 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7132 ))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7133 soap->mode &= ~SOAP_IO_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7134 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7135 soap->mode |= SOAP_IO_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7136 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7137 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7138 if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7139 { if (!(soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7140 soap->mode &= ~SOAP_IO_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7141 if (soap->mode & SOAP_ENC_XML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7142 soap->mode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7143 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7144 soap->mode |= SOAP_IO_STORE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7146 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7147 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7148 if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7149 soap->mode |= SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7150 else if (!(soap->mode & SOAP_ENC_MIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7151 soap->mode &= ~SOAP_ENC_MTOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7152 if (soap->mode & SOAP_ENC_MIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7153 soap_select_mime_boundary(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7154 soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7155 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7156 soap->count = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7157 soap->ns = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7158 soap->null = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7159 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7160 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7161 soap->encoding = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7162 soap->part = SOAP_BEGIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7163 soap->event = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7164 soap->evlev = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7165 soap->idnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7166 soap_clr_attr(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7167 soap_set_local_namespaces(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7168 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7169 soap->dime.count = 0; /* count # of attachments */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7170 soap->dime.size = 0; /* accumulate total size of attachments */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7171 if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7172 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7173 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7174 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, (unsigned int)soap->mode, (unsigned long)soap->count));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7175 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7176 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7177 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7178
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7179 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7180 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7181 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7182 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7183 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7184 soap_end_count(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7185 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7186 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7187 if ((soap->mode & SOAP_IO_LENGTH))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7188 { if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7189 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7190 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7191 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7192 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7193 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7194 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7195
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7196 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7197 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7198 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7199 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7200 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7201 soap_begin_send(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7202 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", soap->socket, soap->sendfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7203 soap_free_ns(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7204 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7205 soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7206 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7207 if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7208 { if (soap->mode & SOAP_ENC_XML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7209 soap->mode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7210 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7211 soap->mode |= SOAP_IO_STORE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7213 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7214 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7215 if ((soap->mode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7216 { soap->mode |= SOAP_ENC_XML;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7217 if (soap->count > SOAP_BUFLEN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7218 return soap->error = SOAP_UDP_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7219 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7220 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7221 if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7222 { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7223 soap->mode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7224 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7225 soap->mode |= SOAP_IO_STORE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7226 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7227 soap->mode &= ~SOAP_IO_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7228 if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7229 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7230 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7231 if (!(soap->mode & SOAP_IO_KEEPALIVE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7232 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7233 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7234 if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7235 { soap->mode |= SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7236 soap->mode &= ~SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7238 else if (!(soap->mode & SOAP_ENC_MIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7239 soap->mode &= ~SOAP_ENC_MTOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7240 if (soap->mode & SOAP_ENC_MIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7241 soap_select_mime_boundary(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7242 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7243 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7244 #ifndef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7245 if (!soap_valid_socket(soap->socket) && !soap->os) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7246 #ifdef __BORLANDC__
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7247 setmode(soap->sendfd, _O_BINARY);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7248 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7249 _setmode(soap->sendfd, _O_BINARY);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7250 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7251 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7252 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7253 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7254 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7255 if (soap->mode & SOAP_IO)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7256 { soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7257 soap->buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7258 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7259 soap->chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7260 soap->ns = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7261 soap->null = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7262 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7263 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7264 soap->encoding = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7265 soap->idnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7266 soap->level = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7267 soap_clr_attr(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7268 soap_set_local_namespaces(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7269 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7270 soap->z_ratio_out = 1.0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7271 if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7272 { if (!soap->z_buf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7273 soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7274 soap->d_stream->next_out = (Byte*)soap->z_buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7275 soap->d_stream->avail_out = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7276 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7277 if (soap->zlib_out != SOAP_ZLIB_DEFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7278 { memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7279 soap->d_stream->next_out = (Byte*)soap->z_buf + 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7280 soap->d_stream->avail_out = SOAP_BUFLEN - 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7281 soap->z_crc = crc32(0L, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7282 soap->zlib_out = SOAP_ZLIB_GZIP;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7283 if (soap->z_dict)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7284 *((Byte*)soap->z_buf + 2) = 0xff;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7285 if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7286 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7287 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7288 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7289 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7290 if (deflateInit(soap->d_stream, soap->z_level) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7291 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7292 if (soap->z_dict)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7293 { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7294 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7295 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7296 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7297 soap->zlib_state = SOAP_ZLIB_DEFLATE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7298 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7299 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7300 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7301 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7302 ERR_clear_error();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7303 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7304 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7305 soap->part = SOAP_BEGIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7306 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7307 if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7308 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7309 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7310 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7312 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7313
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7314 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7315 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7316 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7317 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7318 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7319 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7320 soap_embedded(struct soap *soap, const void *p, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7321 { struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7322 if (soap_pointer_lookup(soap, p, t, &pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7323 { pp->mark1 = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7324 pp->mark2 = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7325 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7327 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7328 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7329 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7330
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7331 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7332 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7333 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7334 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7335 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7336 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7337 soap_reference(struct soap *soap, const void *p, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7338 { struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7339 if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7340 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7341 if (soap_pointer_lookup(soap, p, t, &pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7342 { if (pp->mark1 == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7343 { pp->mark1 = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7344 pp->mark2 = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7345 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7347 else if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7348 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7349 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7350 return pp->mark1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7351 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7352 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7353 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7354
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7355 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7356 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7357 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7358 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7359 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7360 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7361 soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7362 { struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7363 if (!p || !a->__ptr || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME|SOAP_ENC_MIME|SOAP_ENC_MTOM|SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7364 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7365 if (soap_array_pointer_lookup(soap, p, a, n, t, &pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7366 { if (pp->mark1 == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7367 { pp->mark1 = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7368 pp->mark2 = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7369 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7370 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7371 else if (!soap_pointer_enter(soap, p, a, n, t, &pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7372 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7373 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p dim=%d type=%d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7374 return pp->mark1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7375 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7376 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7377 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7378
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7379 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7380 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7381 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7382 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7383 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7384 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7385 soap_embedded_id(struct soap *soap, int id, const void *p, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7386 { struct soap_plist *pp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7387 if (!id || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7388 return id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7389 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7390 if (soap->version == 1 && soap->part != SOAP_IN_HEADER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7391 { if (id < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7392 { id = soap_pointer_lookup(soap, p, t, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7393 if (id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7394 { if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7395 pp->mark1 = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7396 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7397 pp->mark2 = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7398 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7400 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7401 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7402 return id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7403 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7404 if (id < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7405 id = soap_pointer_lookup(soap, p, t, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7406 else if (id && !soap_pointer_lookup(soap, p, t, &pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7407 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7408 if (id && pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7409 { if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7410 pp->mark1 = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7411 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7412 pp->mark2 = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7413 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7414 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7415 return id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7416 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7417 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7418 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7419
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7420 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7421 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7422 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7423 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7424 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7425 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7426 soap_is_embedded(struct soap *soap, struct soap_plist *pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7427 { if (!pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7428 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7429 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7430 if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7431 { if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7432 return pp->mark1 != 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7433 return pp->mark2 != 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7434 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7435 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7436 return pp->mark1 == 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7437 return pp->mark2 == 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7438 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7439 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7440 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7441
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7442 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7443 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7444 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7445 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7446 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7447 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7448 soap_is_single(struct soap *soap, struct soap_plist *pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7449 { if (soap->part == SOAP_IN_HEADER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7450 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7451 if (!pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7452 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7453 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7454 return pp->mark1 == 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7455 return pp->mark2 == 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7456 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7457 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7458 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7459
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7460 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7461 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7462 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7463 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7464 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7465 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7466 soap_set_embedded(struct soap *soap, struct soap_plist *pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7467 { if (!pp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7468 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7469 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7470 pp->mark1 = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7471 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7472 pp->mark2 = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7474 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7475 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7476
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7477 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7478 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7479 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7480 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7481 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7482 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7483 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7484 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7485 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7486 struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7487 int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7488 if (!p || !a->__ptr || (!aid && !atype))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7489 return soap_element_id(soap, tag, id, p, a, n, type, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7490 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid ? aid : SOAP_STR_EOS, id, atype ? atype : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7491 i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7492 if (!i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7493 { i = soap_pointer_enter(soap, p, a, n, t, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7494 if (!i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7495 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7496 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7497 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7498 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7499 if (id <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7500 id = i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7501 if (!aid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7502 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7503 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7504 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), soap->dime_id_format, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7505 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7506 sprintf(soap->tmpbuf, soap->dime_id_format, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7507 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7508 aid = soap_strdup(soap, soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7510 /* Add MTOM xop:Include element when necessary */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7511 /* TODO: this code to be obsoleted with new import/xop.h conventions */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7512 if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7513 { if (soap_element_begin_out(soap, tag, 0, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7514 || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" href", aid)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7515 || soap_element_end_out(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7516 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7517 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7518 else if (soap_element_href(soap, tag, 0, "href", aid))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7519 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7520 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7521 { if (pp->mark1 != 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7522 { struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7523 if (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7524 content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7525 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7526 content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7527 if (!content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7528 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7529 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7530 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7531 if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7532 { if (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7533 { char *s = (char*)soap_malloc(soap, strlen(aid) - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7534 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7535 { *s = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7536 strcpy(s + 1, aid + 4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7537 strcat(s, ">");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7538 content->id = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7539 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7540 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7541 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7542 content->id = aid + 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7543 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7544 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7545 content->id = aid;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7546 content->type = atype;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7547 content->options = aoptions;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7548 content->encoding = SOAP_MIME_BINARY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7549 pp->mark1 = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7550 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7552 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7553 pp->mark2 = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7554 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7555 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7556 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7557 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7558 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7559
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7560 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7561 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7562 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7563 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7564 soap_init_iht(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7565 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7566 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7567 soap->iht[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7568 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7569 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7570 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7571
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7572 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7573 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7574 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7575 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7576 soap_free_iht(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7577 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7578 register struct soap_ilist *ip = NULL, *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7579 register struct soap_flist *fp = NULL, *fq = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7580 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7581 for (i = 0; i < SOAP_IDHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7582 { for (ip = soap->iht[i]; ip; ip = p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7583 { for (fp = ip->flist; fp; fp = fq)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7584 { fq = fp->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7585 SOAP_FREE(soap, fp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7587 p = ip->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7588 SOAP_FREE(soap, ip);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7589 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7590 soap->iht[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7591 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7592 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7593 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7594 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7595
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7596 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7597 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7598 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7599 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7600 struct soap_ilist *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7601 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7602 soap_lookup(struct soap *soap, const char *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7603 { register struct soap_ilist *ip = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7604 for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7605 if (!strcmp(ip->id, id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7606 return ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7607 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7608 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7609 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7610 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7611
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7612 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7613 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7614 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7615 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7616 struct soap_ilist *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7617 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7618 soap_enter(struct soap *soap, const char *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7619 { register size_t h;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7620 register struct soap_ilist *ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7621 ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + strlen(id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7622 if (ip)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7623 { strcpy((char*)ip->id, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7624 h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7625 ip->next = soap->iht[h];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7626 soap->iht[h] = ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7627 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7628 return ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7629 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7630 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7631 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7632
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7633 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7634 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7635 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7636 void*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7637 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7638 soap_malloc(struct soap *soap, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7639 { register char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7640 if (!n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7641 return (void*)SOAP_NON_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7642 if (!soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7643 return SOAP_MALLOC(soap, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7644 if (soap->fmalloc)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7645 p = (char*)soap->fmalloc(soap, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7646 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7647 { n += sizeof(short);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7648 n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7649 if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7650 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7651 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7652 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7653 /* set the canary to detect corruption */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7654 *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7655 /* keep chain of alloced cells for destruction */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7656 *(void**)(p + n) = soap->alist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7657 *(size_t*)(p + n + sizeof(void*)) = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7658 soap->alist = p + n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7659 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7660 soap->alloced = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7661 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7662 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7663 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7664
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7665 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7666 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7667 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7668 soap_init_mht(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7669 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7670 for (i = 0; i < (int)SOAP_PTRHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7671 soap->mht[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7672 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7673 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7674
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7675 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7676 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7677 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7678 soap_free_mht(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7679 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7680 register struct soap_mlist *mp, *mq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7681 for (i = 0; i < (int)SOAP_PTRHASH; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7682 { for (mp = soap->mht[i]; mp; mp = mq)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7683 { mq = mp->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7684 if (mp->live)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7685 fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7686 free(mp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7687 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7688 soap->mht[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7690 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7691 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7692
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7693 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7694 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7695 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7696 void*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7697 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7698 soap_track_malloc(struct soap *soap, const char *file, int line, size_t size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7699 { register void *p = malloc(size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7700 if (soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7701 { register size_t h = soap_hash_ptr(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7702 register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7703 if (soap->fdebug[SOAP_INDEX_TEST])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7704 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7705 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7706 mp->next = soap->mht[h];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7707 mp->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7708 mp->file = file;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7709 mp->line = line;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7710 mp->live = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7711 soap->mht[h] = mp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7712 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7713 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7714 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7715 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7716
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7717 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7718 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7719 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7720 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7721 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7722 soap_track_free(struct soap *soap, const char *file, int line, void *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7723 { register size_t h = soap_hash_ptr(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7724 register struct soap_mlist *mp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7725 for (mp = soap->mht[h]; mp; mp = mp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7726 if (mp->ptr == p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7727 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7728 if (mp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7729 { if (mp->live)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7730 { free(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7731 if (soap->fdebug[SOAP_INDEX_TEST])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7732 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7733 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7734 mp->live = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7735 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7736 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7737 fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7738 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7739 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7740 fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7741 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7742 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7743
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7744 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7745 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7746 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7747 soap_track_unlink(struct soap *soap, const void *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7748 { register size_t h = soap_hash_ptr(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7749 register struct soap_mlist *mp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7750 for (mp = soap->mht[h]; mp; mp = mp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7751 if (mp->ptr == p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7752 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7753 if (mp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7754 mp->live = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7755 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7756 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7757
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7758 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7759 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7760 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7761 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7762 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7763 soap_dealloc(struct soap *soap, void *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7764 { if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7765 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7766 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7767 { register char **q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7768 for (q = (char**)&soap->alist; *q; q = *(char***)q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7769 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7770 if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7771 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7772 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7773 fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7774 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7775 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7776 DBGHEX(TEST, *q - 200, 200);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7777 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7778 soap->error = SOAP_MOE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7779 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7780 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7781 if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7782 { *q = **(char***)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7783 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7784 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7785 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7786 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7787 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7788 soap_delete(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7789 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7790 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7791 { register char *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7792 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7793 while (soap->alist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7794 { q = (char*)soap->alist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7795 if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7796 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7797 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7798 fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7799 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7800 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7801 DBGHEX(TEST, q - 200, 200);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7802 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7803 soap->error = SOAP_MOE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7804 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7805 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7806 soap->alist = *(void**)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7807 q -= *(size_t*)(q + sizeof(void*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7808 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7809 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7810 /* we must assume these were deallocated: */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7811 soap->http_content = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7812 soap->action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7813 soap->fault = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7814 soap->header = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7815 soap->userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7816 soap->passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7817 soap->authrealm = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7818 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7819 soap->ntlm_challenge = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7820 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7821 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7822 soap_clr_mime(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7823 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7824 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7825 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7826 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7827
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7828 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7829 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7830 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7831 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7832 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7833 soap_delete(struct soap *soap, void *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7834 { register struct soap_clist **cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7835 if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7836 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7837 cp = &soap->clist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7838 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7839 { while (*cp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7840 { if (p == (*cp)->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7841 { register struct soap_clist *q = *cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7842 *cp = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7843 if (q->fdelete(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7844 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7845 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7846 fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7847 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7848 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7849 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7850 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7851 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7852 cp = &(*cp)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7853 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7854 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7855 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7856 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7857 { while (*cp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7858 { register struct soap_clist *q = *cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7859 *cp = q->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7860 if (q->fdelete(q))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7861 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7862 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7863 fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7864 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7865 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7866 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7867 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7868 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7869 soap->fault = NULL; /* this was possibly deallocated */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7870 soap->header = NULL; /* this was possibly deallocated */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7872 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7873
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7874 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7875 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7876 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7877 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7878 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7879 soap_delegate_deletion(struct soap *soap, struct soap *soap_to)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7880 { register struct soap_clist *cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7881 register char **q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7882 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7883 register void *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7884 register struct soap_mlist **mp, *mq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7885 size_t h;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7886 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7887 for (q = (char**)&soap->alist; *q; q = *(char***)q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7888 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7889 if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7890 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7891 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7892 fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7893 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7894 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7895 DBGHEX(TEST, *q - 200, 200);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7896 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7897 soap->error = SOAP_MOE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7898 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7899 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7900 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7901 p = (void*)(*q - *(size_t*)(*q + sizeof(void*)));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7902 h = soap_hash_ptr(p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7903 for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7904 { if ((*mp)->ptr == p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7905 { mq = *mp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7906 *mp = mq->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7907 mq->next = soap_to->mht[h];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7908 soap_to->mht[h] = mq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7909 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7910 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7911 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7912 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7913 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7914 *q = (char*)soap_to->alist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7915 soap_to->alist = soap->alist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7916 soap->alist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7917 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7918 cp = soap->clist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7919 while (cp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7920 { h = soap_hash_ptr(cp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7921 for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7922 { if ((*mp)->ptr == cp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7923 { mq = *mp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7924 *mp = mq->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7925 mq->next = soap_to->mht[h];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7926 soap_to->mht[h] = mq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7927 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7928 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7929 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7930 cp = cp->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7931 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7932 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7933 cp = soap_to->clist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7934 if (cp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7935 { while (cp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7936 cp = cp->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7937 cp->next = soap->clist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7938 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7939 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7940 soap_to->clist = soap->clist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7941 soap->clist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7942 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7943 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7944
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7945 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7946 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7947 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7948 struct soap_clist *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7949 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7950 soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7951 { register struct soap_clist *cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7952 if ((cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7953 { cp->next = soap->clist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7954 cp->type = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7955 cp->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7956 cp->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7957 cp->fdelete = fdelete;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7958 soap->clist = cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7959 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7960 return cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7961 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7962 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7963
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7964 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7965 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7966 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7967 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7968 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7969 soap_unlink(struct soap *soap, const void *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7970 { register char **q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7971 register struct soap_clist **cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7972 if (soap && p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7973 { for (q = (char**)&soap->alist; *q; q = *(char***)q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7974 { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7975 { *q = **(char***)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7976 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7977 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7978 soap_track_unlink(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7979 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7980 return SOAP_OK; /* found and removed from dealloc chain */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7982 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7983 for (cp = &soap->clist; *cp; cp = &(*cp)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7984 { if (p == (*cp)->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7985 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7986 q = (char**)*cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7987 *cp = (*cp)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7988 SOAP_FREE(soap, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7989 return SOAP_OK; /* found and removed from dealloc chain */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7990 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7992 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7993 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7994 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7995 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7996
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7997 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7998 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
7999 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8000 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8001 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8002 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8003 soap_lookup_type(struct soap *soap, const char *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8004 { register struct soap_ilist *ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8005 if (id && *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8006 { ip = soap_lookup(soap, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8007 if (ip)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8008 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8009 return ip->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8010 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8011 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8012 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8013 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8014 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8015 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8016 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8017
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8018 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8019 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8020 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8021 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8022 void*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8023 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8024 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8025 { struct soap_ilist *ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8026 void **q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8027 if (!p || !id || !*id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8028 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8029 ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8030 if (!ip)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8031 { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8032 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8033 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8034 ip->type = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8035 ip->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8036 ip->link = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8037 ip->copy = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8038 ip->flist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8039 ip->ptr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8040 ip->level = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8041 *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8042 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8043 else if (ip->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8044 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes)\n", id, t, ip->ptr, (unsigned int)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8045 if (ip->type != t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8046 { strcpy(soap->id, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8047 soap->error = SOAP_HREF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8048 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: href='%s' id-type=%d href-type=%d\n", id, ip->type, t));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8049 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8050 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8051 while (ip->level < k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8052 { q = (void**)soap_malloc(soap, sizeof(void*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8053 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8054 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8055 *p = (void*)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8056 p = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8057 k--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8058 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8059 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8060 *p = ip->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8061 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8062 else if (ip->level > k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8063 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8064 while (ip->level > k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8065 { void *s, **r = &ip->link;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8066 q = (void**)ip->link;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8067 while (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8068 { *r = (void*)soap_malloc(soap, sizeof(void*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8069 if (!*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8070 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8071 s = *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8072 *q = *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8073 r = (void**)*r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8074 q = (void**)s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8075 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8076 *r = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8077 ip->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8078 ip->copy = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8079 ip->level = ip->level - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8080 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8081 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8082 q = (void**)ip->link;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8083 ip->link = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8084 *p = (void*)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8085 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8086 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8087 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes)\n", id, t, p, (unsigned int)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8088 while (ip->level < k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8089 { q = (void**)soap_malloc(soap, sizeof(void*));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8090 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8091 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8092 *p = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8093 p = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8094 k--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8095 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8096 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8097 q = (void**)ip->link;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8098 ip->link = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8099 *p = (void*)q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8100 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8101 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8102 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8103 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8104 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8105
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8106 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8107 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8108 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8109 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8110 void*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8111 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8112 soap_id_forward(struct soap *soap, const char *href, void *p, size_t len, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8113 { struct soap_ilist *ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8114 if (!p || !href || !*href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8115 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8116 ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8117 if (!ip)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8118 { if (!(ip = soap_enter(soap, href))) /* new hash table entry for string id */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8119 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8120 ip->type = st;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8121 ip->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8122 ip->link = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8123 ip->copy = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8124 ip->ptr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8125 ip->level = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8126 ip->flist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8127 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, st, (unsigned long)n, k, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8128 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8129 else if (ip->type != st || (ip->level == k && ip->size != n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8130 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, st, (unsigned long)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8131 strcpy(soap->id, href);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8132 soap->error = SOAP_HREF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8133 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8134 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8135 if (fcopy || n < sizeof(void*) || *href != '#')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8136 { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8137 if (!fp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8138 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8139 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8141 fp->next = ip->flist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8142 fp->type = tt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8143 fp->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8144 fp->level = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8145 fp->len = len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8146 if (fcopy)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8147 fp->fcopy = fcopy;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8148 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8149 fp->fcopy = soap_fcopy;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8150 ip->flist = fp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8151 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u len=%lu href='%s'\n", st, tt, (unsigned long)n, p, k, (unsigned long)len, href));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8152 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8153 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8154 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, st, href));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8155 *(void**)p = ip->copy;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8156 ip->copy = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8157 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8158 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8159 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8160 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8161 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8162
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8163 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8164 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8165 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8166 void*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8167 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8168 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8169 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8170 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8171 struct soap_ilist *ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8172 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8173 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8174 soap->alloced = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8175 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8176 { if (finstantiate)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8177 p = finstantiate(soap, t, type, arrayType, &n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8178 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8179 p = soap_malloc(soap, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8180 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8181 soap->alloced = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8182 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8183 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8184 if (!id || !*id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8185 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8186 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8187 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8188 ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8189 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8190 if (!ip)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8191 { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8192 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8193 ip->type = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8194 ip->link = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8195 ip->copy = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8196 ip->flist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8197 ip->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8198 ip->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8199 ip->level = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8200 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu level=%u location=%p\n", id, t, (unsigned long)n, k, p));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8202 else if ((ip->type != t || (ip->level == k && ip->size != n)) && (ip->copy || ip->flist))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8203 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8204 strcpy(soap->id, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8205 soap->error = SOAP_HREF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8206 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8207 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8208 else if (ip->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8209 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8210 strcpy(soap->id, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8211 soap->error = SOAP_DUPLICATE_ID;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8212 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8213 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8214 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8215 { ip->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8216 ip->ptr = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8217 ip->level = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8218 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update entry id='%s' type=%d location=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8219 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8220 return ip->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8221 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8222 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8223 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8224
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8225 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8226 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8227 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8228 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8229 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8230 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8231 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8232 memcpy(p, q, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8233 (void)soap; (void)st; (void)tt; (void)len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8234 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8235 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8236
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8237 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8238 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8239 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8240 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8241 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8242 soap_end_send(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8243 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8244 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8245 int err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8246 if (soap->dime.list)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8247 { /* SOAP body referenced attachments must appear first */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8248 soap->dime.last->next = soap->dime.first;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8249 soap->dime.first = soap->dime.list->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8250 soap->dime.list->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8251 soap->dime.last = soap->dime.list;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8252 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8253 if (!(err = soap_putdime(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8254 err = soap_putmime(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8255 soap->mime.list = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8256 soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8257 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8258 soap->dime.list = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8259 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8260 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8261 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8262 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8263 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8264 return soap_end_send_flush(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8265 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8266 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8267
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8268 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8269 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8270 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8271 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8272 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8273 soap_end_send_flush(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8274 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8275 if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8276 { if (soap_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8277 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8278 { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8279 { soap->zlib_state = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8280 deflateEnd(soap->d_stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8282 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8284 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8285 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8286 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8287 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8288 if (soap->mode & SOAP_ENC_ZLIB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8289 { int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8290 soap->d_stream->avail_in = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8291 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8292 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8293 r = deflate(soap->d_stream, Z_FINISH);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8294 if (soap->d_stream->avail_out != SOAP_BUFLEN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8295 { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream->avail_out))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8296 { soap->zlib_state = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8297 deflateEnd(soap->d_stream);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8298 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8299 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8300 soap->d_stream->next_out = (Byte*)soap->z_buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8301 soap->d_stream->avail_out = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8302 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8303 } while (r == Z_OK);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8304 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8305 soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8306 soap->mode &= ~SOAP_ENC_ZLIB;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8307 soap->zlib_state = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8308 if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8309 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8310 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8312 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8313 if (soap->zlib_out != SOAP_ZLIB_DEFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8314 { soap->z_buf[0] = soap->z_crc & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8315 soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8316 soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8317 soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8318 soap->z_buf[4] = soap->d_stream->total_in & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8319 soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8320 soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8321 soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8322 if (soap_flush_raw(soap, soap->z_buf, 8))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8323 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8324 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8326 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8327 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8328 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8329 if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8330 { char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8331 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8332 if (!(soap->mode & SOAP_ENC_XML))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8333 { soap->mode--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8334 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8335 if (soap->status >= SOAP_POST)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8336 soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8337 else if (soap->status != SOAP_STOP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8338 soap->error = soap->fresponse(soap, soap->status, soap->blist->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8339 if (soap->error || soap_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8340 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8341 soap->mode++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8342 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8343 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8344 for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8345 { DBGMSG(SENT, p, soap_block_size(soap, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8346 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), soap->socket, soap->sendfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8347 if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8348 { soap_end_block(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8349 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8350 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8351 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8352 soap_end_block(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8353 if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8354 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8355 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8356 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8357 else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8358 { DBGMSG(SENT, "\r\n0\r\n\r\n", 7);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8359 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", soap->socket, soap->sendfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8360 if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8361 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8362 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8363 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8364 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8365 #ifdef WITH_TCPFIN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8366 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8367 if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8368 soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8369 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8370 if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8371 soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8372 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8373 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8374 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8375 soap->omode &= ~SOAP_SEC_WSUID;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8376 soap->count = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8377 soap->part = SOAP_END;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8378 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8379 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8380 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8381
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8382 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8383 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8384 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8385 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8386 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8387 soap_end_recv(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8388 { soap->part = SOAP_END;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8389 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8390 soap->wsuid = NULL; /* reset before next send */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8391 soap->c14nexclude = NULL; /* reset before next send */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8392 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8393 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8394 soap->ffilterrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8395 if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8396 { soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8397 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8398 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8400 soap->dime.list = soap->dime.first;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8401 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8402 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8403 /* Check if MIME attachments and mime-post-check flag is set, if so call soap_resolve() and return */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8404 if (soap->mode & SOAP_ENC_MIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8405 { if (soap->mode & SOAP_MIME_POSTCHECK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8406 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8407 if (!soap->keep_alive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8408 soap->keep_alive = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8409 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8410 soap_resolve(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8411 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8412 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8413 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8414 if (soap_getmime(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8415 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8416 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8417 soap->mime.list = soap->mime.first;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8418 soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8419 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8420 soap->mime.boundary = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8421 if (soap->xlist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8422 { struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8423 for (content = soap->mime.list; content; content = content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8424 soap_resolve_attachment(soap, content);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8425 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8426 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8427 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8428 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8429 if (soap->mode & SOAP_ENC_ZLIB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8430 { /* Make sure end of compressed content is reached */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8431 while (soap->d_stream->next_out != Z_NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8432 if ((int)soap_get1(soap) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8433 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8434 soap->mode &= ~SOAP_ENC_ZLIB;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8435 memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8436 soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8437 soap->buflen = soap->z_buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8438 soap->zlib_state = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8439 if (inflateEnd(soap->d_stream) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8440 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8441 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate end ok\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8442 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8443 if (soap->zlib_in == SOAP_ZLIB_GZIP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8444 { soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8445 short i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8446 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8447 for (i = 0; i < 8; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8448 { if ((int)(c = soap_get1(soap)) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8449 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8450 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8451 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8452 soap->z_buf[i] = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8453 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8454 if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8455 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip inflate error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8456 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8458 if (soap->d_stream->total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8459 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip inflate error: incorrect message length\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8460 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8461 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8462 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8463 soap->zlib_in = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8464 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8465 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8466 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8467 if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8468 while (soap->ahead != EOF && !soap_recv_raw(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8469 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8470 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8471 if (soap_resolve(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8472 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8473 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8474 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8475 if (soap->xlist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8476 { if (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8477 return soap->error = SOAP_MIME_HREF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8478 return soap->error = SOAP_DIME_HREF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8480 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8481 soap_free_ns(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8482 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8483 if (soap->fpreparefinalrecv)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8484 return soap->error = soap->fpreparefinalrecv(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8485 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8486 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8487 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8488 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8489
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8490 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8491 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8492 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8493 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8494 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8495 soap_free_temp(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8496 { register struct soap_attribute *tp, *tq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8497 register struct Namespace *ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8498 soap_free_ns(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8499 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8500 while (soap->blist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8501 soap_end_block(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8502 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8503 for (tp = soap->attributes; tp; tp = tq)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8504 { tq = tp->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8505 if (tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8506 SOAP_FREE(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8507 SOAP_FREE(soap, tp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8508 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8509 soap->attributes = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8510 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8511 if (soap->labbuf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8512 SOAP_FREE(soap, soap->labbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8513 soap->labbuf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8514 soap->lablen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8515 soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8516 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8517 ns = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8518 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8519 { for (; ns->id; ns++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8520 { if (ns->out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8521 { SOAP_FREE(soap, ns->out);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8522 ns->out = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8523 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8524 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8525 SOAP_FREE(soap, soap->local_namespaces);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8526 soap->local_namespaces = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8527 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8528 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8529 while (soap->xlist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8530 { struct soap_xlist *xp = soap->xlist->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8531 SOAP_FREE(soap, soap->xlist);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8532 soap->xlist = xp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8533 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8534 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8535 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8536 soap_free_pht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8537 soap_free_iht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8538 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8539 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8540 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8541
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8542 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8543 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8544 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8545 soap_free_ns(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8546 { register struct soap_nlist *np, *nq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8547 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8548 for (np = soap->nlist; np; np = nq)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8549 { nq = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8550 SOAP_FREE(soap, np);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8552 soap->nlist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8553 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8554 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8555
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8556 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8557 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8558 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8559 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8560 soap_init_logs(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8561 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8562 for (i = 0; i < SOAP_MAXLOGS; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8563 { soap->logfile[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8564 soap->fdebug[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8565 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8566 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8567 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8568 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8569
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8570 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8571 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8572 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8573 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8574 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8575 soap_open_logfile(struct soap *soap, int i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8576 { if (soap->logfile[i])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8577 soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8578 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8579 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8580
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8581 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8582 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8583 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8584 soap_close_logfile(struct soap *soap, int i)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8585 { if (soap->fdebug[i])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8586 { fclose(soap->fdebug[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8587 soap->fdebug[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8588 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8589 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8590 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8591
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8592 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8593 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8594 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8595 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8596 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8597 soap_close_logfiles(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8598 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8599 for (i = 0; i < SOAP_MAXLOGS; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8600 soap_close_logfile(soap, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8601 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8602 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8603
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8604 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8605 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8606 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8607 soap_set_logfile(struct soap *soap, int i, const char *logfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8608 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8609 char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8610 soap_close_logfile(soap, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8611 s = soap->logfile[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8612 soap->logfile[i] = logfile;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8613 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8614 SOAP_FREE(soap, (void*)s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8615 if (logfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8616 if ((t = (char*)SOAP_MALLOC(soap, strlen(logfile) + 1)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8617 strcpy(t, logfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8618 soap->logfile[i] = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8619 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8620 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8621
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8622 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8623 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8624 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8625 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8626 soap_set_recv_logfile(struct soap *soap, const char *logfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8627 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8628 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8629 soap_set_logfile(soap, SOAP_INDEX_RECV, logfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8630 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8631 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8632
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8633 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8634 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8635 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8636 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8637 soap_set_sent_logfile(struct soap *soap, const char *logfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8638 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8639 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8640 soap_set_logfile(soap, SOAP_INDEX_SENT, logfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8641 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8643
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8644 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8645 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8646 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8647 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8648 soap_set_test_logfile(struct soap *soap, const char *logfile)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8649 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8650 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8651 soap_set_logfile(soap, SOAP_INDEX_TEST, logfile);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8652 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8653 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8654
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8655 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8656 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8657 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8658 struct soap*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8659 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8660 soap_copy(const struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8661 { return soap_copy_context((struct soap*)malloc(sizeof(struct soap)), soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8662 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8663 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8664
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8665 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8666 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8667 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8668 struct soap*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8669 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8670 soap_copy_context(struct soap *copy, const struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8671 { if (copy == soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8672 return copy;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8673 if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8674 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8675 if (copy)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8676 { register struct soap_plugin *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8677 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8678 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8679 *copy = *soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8680 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8681 memcpy(copy, soap, sizeof(struct soap));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8682 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8683 copy->state = SOAP_COPY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8684 copy->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8685 copy->userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8686 copy->passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8687 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8688 copy->ntlm_challenge = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8689 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8690 copy->nlist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8691 copy->blist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8692 copy->clist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8693 copy->alist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8694 copy->attributes = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8695 copy->labbuf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8696 copy->lablen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8697 copy->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8698 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8699 soap_init_mht(copy);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8700 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8701 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8702 soap_init_logs(copy);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8703 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8704 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8705 soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8706 soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8707 soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8708 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8709 copy->namespaces = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8710 copy->local_namespaces = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8711 soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8712 copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8713 #ifdef WITH_C_LOCALE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8714 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8715 copy->c_locale = _create_locale(LC_ALL, "C");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8716 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8717 copy->c_locale = duplocale(soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8718 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8719 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8720 copy->c_locale = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8721 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8722 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8723 copy->bio = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8724 copy->ssl = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8725 copy->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8726 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8727 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8728 copy->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8729 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8730 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8731 copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8732 copy->d_stream->zalloc = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8733 copy->d_stream->zfree = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8734 copy->d_stream->opaque = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8735 copy->z_buf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8736 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8737 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8738 soap_init_iht(copy);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8739 soap_init_pht(copy);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8740 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8741 copy->header = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8742 copy->fault = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8743 copy->action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8744 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8745 #ifdef WITH_COOKIES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8746 copy->cookies = soap_copy_cookies(copy, soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8747 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8748 copy->cookies = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8749 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8750 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8751 copy->plugins = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8752 for (p = soap->plugins; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8753 { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8754 if (!q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8755 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8756 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8757 *q = *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8758 if (p->fcopy && p->fcopy(copy, q, p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8759 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s'\n", p->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8760 SOAP_FREE(copy, q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8761 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8762 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8763 q->next = copy->plugins;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8764 copy->plugins = q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8766 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8767 return copy;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8768 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8769 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8770
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8771 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8772 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8773 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8774 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8775 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8776 soap_copy_stream(struct soap *copy, struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8777 { struct soap_attribute *tp = NULL, *tq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8778 if (copy == soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8779 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8780 copy->header = soap->header;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8781 copy->mode = soap->mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8782 copy->imode = soap->imode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8783 copy->omode = soap->omode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8784 copy->master = soap->master;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8785 copy->socket = soap->socket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8786 copy->sendsk = soap->sendsk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8787 copy->recvsk = soap->recvsk;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8788 copy->recv_timeout = soap->recv_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8789 copy->send_timeout = soap->send_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8790 #if defined(__cplusplus) && !defined(WITH_LEAN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8791 copy->os = soap->os;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8792 copy->is = soap->is;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8793 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8794 copy->sendfd = soap->sendfd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8795 copy->recvfd = soap->recvfd;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8796 copy->bufidx = soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8797 copy->buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8798 copy->ahead = soap->ahead;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8799 copy->cdata = soap->cdata;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8800 copy->chunksize = soap->chunksize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8801 copy->chunkbuflen = soap->chunkbuflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8802 copy->keep_alive = soap->keep_alive;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8803 copy->tcp_keep_alive = soap->tcp_keep_alive;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8804 copy->tcp_keep_idle = soap->tcp_keep_idle;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8805 copy->tcp_keep_intvl = soap->tcp_keep_intvl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8806 copy->tcp_keep_cnt = soap->tcp_keep_cnt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8807 copy->max_keep_alive = soap->max_keep_alive;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8808 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8809 copy->peer = soap->peer;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8810 copy->peerlen = soap->peerlen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8811 copy->ip = soap->ip;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8812 copy->port = soap->port;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8813 memcpy(copy->host, soap->host, sizeof(soap->host));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8814 memcpy(copy->endpoint, soap->endpoint, sizeof(soap->endpoint));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8815 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8816 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8817 copy->bio = soap->bio;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8818 copy->ctx = soap->ctx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8819 copy->ssl = soap->ssl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8820 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8821 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8822 copy->session = soap->session;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8823 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8824 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8825 copy->zlib_state = soap->zlib_state;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8826 copy->zlib_in = soap->zlib_in;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8827 copy->zlib_out = soap->zlib_out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8828 if (!copy->d_stream)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8829 copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8830 if (copy->d_stream)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8831 memcpy(copy->d_stream, soap->d_stream, sizeof(z_stream));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8832 copy->z_crc = soap->z_crc;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8833 copy->z_ratio_in = soap->z_ratio_in;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8834 copy->z_ratio_out = soap->z_ratio_out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8835 copy->z_buf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8836 copy->z_buflen = soap->z_buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8837 copy->z_level = soap->z_level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8838 if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8839 { copy->z_buf = (char*)SOAP_MALLOC(copy, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8840 if (copy->z_buf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8841 memcpy(copy->z_buf, soap->z_buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8842 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8843 copy->z_dict = soap->z_dict;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8844 copy->z_dict_len = soap->z_dict_len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8845 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8846 memcpy(copy->buf, soap->buf, sizeof(soap->buf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8847 /* copy XML parser state */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8848 soap_free_ns(copy);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8849 soap_set_local_namespaces(copy);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8850 copy->version = soap->version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8851 if (soap->nlist && soap->local_namespaces)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8852 { register struct soap_nlist *np = NULL, *nq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8853 /* copy reversed nlist */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8854 for (nq = soap->nlist; nq; nq = nq->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8855 { register struct soap_nlist *nr = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8856 size_t n = sizeof(struct soap_nlist) + strlen(nq->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8857 np = (struct soap_nlist*)SOAP_MALLOC(copy, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8858 if (!np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8859 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8860 memcpy(np, nq, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8861 np->next = nr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8863 while (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8864 { register const char *s = np->ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8865 copy->level = np->level; /* preserve element nesting level */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8866 if (!s && np->index >= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8867 { s = soap->local_namespaces[np->index].out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8868 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8869 s = soap->local_namespaces[np->index].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8870 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8871 if (s && soap_push_namespace(copy, np->id, s) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8872 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8873 nq = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8874 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8875 SOAP_FREE(copy, nq);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8876 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8878 memcpy(copy->tag, soap->tag, sizeof(copy->tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8879 memcpy(copy->id, soap->id, sizeof(copy->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8880 memcpy(copy->href, soap->href, sizeof(copy->href));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8881 memcpy(copy->type, soap->type, sizeof(copy->type));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8882 copy->other = soap->other;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8883 copy->root = soap->root;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8884 copy->null = soap->null;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8885 copy->body = soap->body;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8886 copy->part = soap->part;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8887 copy->mustUnderstand = soap->mustUnderstand;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8888 copy->level = soap->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8889 copy->peeked = soap->peeked;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8890 /* copy attributes */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8891 for (tq = soap->attributes; tq; tq = tq->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8892 { struct soap_attribute *tr = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8893 size_t n = sizeof(struct soap_attribute) + strlen(tq->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8894 tp = (struct soap_attribute*)SOAP_MALLOC(copy, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8895 memcpy(tp, tq, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8896 if (tp->size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8897 { tp->value = (char*)SOAP_MALLOC(copy, tp->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8898 if (tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8899 strcpy(tp->value, tq->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8900 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8901 tp->ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8902 tp->next = tr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8903 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8904 copy->attributes = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8905 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8906 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8907
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8908 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8909 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8910 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8911 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8912 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8913 soap_free_stream(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8914 { soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8915 soap->sendsk = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8916 soap->recvsk = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8917 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8918 soap->bio = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8919 soap->ctx = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8920 soap->ssl = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8921 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8922 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8923 soap->xcred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8924 soap->acred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8925 soap->cache = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8926 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8927 soap->dh_params = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8928 soap->rsa_params = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8929 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8930 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8931 if (soap->z_buf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8932 SOAP_FREE(soap, soap->z_buf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8933 soap->z_buf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8934 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8935 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8936 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8937
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8938 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8939 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8940 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8941 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8942 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8943 soap_initialize(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8944 { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8945 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8946 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8947
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8948 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8949 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8950 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8951 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8952 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8953 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8954 { size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8955 soap->state = SOAP_INIT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8956 #ifdef SOAP_MEM_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8957 soap_init_mht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8958 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8959 #if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8960 soap_init_logs(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8961 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8962 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8963 #ifdef TANDEM_NONSTOP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8964 soap_set_test_logfile(soap, "TESTLOG");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8965 soap_set_sent_logfile(soap, "SENTLOG");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8966 soap_set_recv_logfile(soap, "RECVLOG");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8967 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8968 soap_set_test_logfile(soap, "TEST.log");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8969 soap_set_sent_logfile(soap, "SENT.log");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8970 soap_set_recv_logfile(soap, "RECV.log");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8971 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8972 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8973 soap->version = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8974 soap_mode(soap, imode);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8975 soap_imode(soap, imode);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8976 soap_omode(soap, omode);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8977 soap->plugins = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8978 soap->user = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8979 for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8980 soap->data[i] = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8981 soap->userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8982 soap->passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8983 soap->authrealm = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8984 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8985 soap->ntlm_challenge = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8986 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8987 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8988 soap->fpost = http_post;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8989 soap->fget = http_get;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8990 soap->fput = http_405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8991 soap->fdel = http_405;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8992 soap->fopt = http_200;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8993 soap->fhead = http_200;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8994 soap->fform = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8995 soap->fposthdr = http_post_header;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8996 soap->fresponse = http_response;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8997 soap->fparse = http_parse;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8998 soap->fparsehdr = http_parse_header;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
8999 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9000 soap->fheader = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9001 soap->fconnect = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9002 soap->fdisconnect = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9003 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9004 soap->ipv6_multicast_if = 0; /* in_addr_t value */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9005 soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9006 soap->ipv4_multicast_ttl = 0; /* 0: use default */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9007 #ifndef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9008 soap->fresolve = tcp_gethost;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9009 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9010 soap->fresolve = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9011 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9012 soap->faccept = tcp_accept;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9013 soap->fopen = tcp_connect;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9014 soap->fclose = tcp_disconnect;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9015 soap->fclosesocket = tcp_closesocket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9016 soap->fshutdownsocket = tcp_shutdownsocket;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9017 soap->fsend = fsend;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9018 soap->frecv = frecv;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9019 soap->fpoll = soap_poll;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9020 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9021 soap->fopen = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9022 soap->fclose = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9023 soap->fpoll = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9024 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9025 soap->fseterror = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9026 soap->fignore = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9027 soap->fserveloop = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9028 soap->fplugin = fplugin;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9029 soap->fmalloc = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9030 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9031 soap->feltbegin = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9032 soap->feltendin = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9033 soap->feltbegout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9034 soap->feltendout = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9035 soap->fprepareinitsend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9036 soap->fprepareinitrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9037 soap->fpreparesend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9038 soap->fpreparerecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9039 soap->fpreparefinalsend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9040 soap->fpreparefinalrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9041 soap->ffiltersend = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9042 soap->ffilterrecv = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9043 soap->fdimereadopen = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9044 soap->fdimewriteopen = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9045 soap->fdimereadclose = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9046 soap->fdimewriteclose = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9047 soap->fdimeread = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9048 soap->fdimewrite = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9049 soap->fmimereadopen = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9050 soap->fmimewriteopen = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9051 soap->fmimereadclose = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9052 soap->fmimewriteclose = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9053 soap->fmimeread = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9054 soap->fmimewrite = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9055 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9056 soap->float_format = "%.9G"; /* Alternative: use "%G" */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9057 soap->double_format = "%.17lG"; /* Alternative: use "%lG" */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9058 soap->dime_id_format = "cid:id%d"; /* default DIME id format */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9059 soap->http_version = "1.1";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9060 soap->proxy_http_version = "1.0";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9061 soap->http_content = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9062 soap->actor = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9063 soap->lang = "en";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9064 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9065 soap->tcp_keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9066 soap->tcp_keep_idle = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9067 soap->tcp_keep_intvl = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9068 soap->tcp_keep_cnt = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9069 soap->max_keep_alive = SOAP_MAXKEEPALIVE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9070 soap->recv_timeout = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9071 soap->send_timeout = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9072 soap->connect_timeout = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9073 soap->accept_timeout = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9074 soap->socket_flags = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9075 soap->connect_flags = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9076 soap->bind_flags = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9077 soap->accept_flags = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9078 soap->linger_time = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9079 soap->ip = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9080 soap->labbuf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9081 soap->lablen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9082 soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9083 soap->encodingStyle = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9084 #ifndef WITH_NONAMESPACES
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9085 soap->namespaces = namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9086 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9087 soap->namespaces = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9088 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9089 soap->local_namespaces = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9090 soap->nlist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9091 soap->blist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9092 soap->clist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9093 soap->alist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9094 soap->attributes = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9095 soap->header = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9096 soap->fault = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9097 soap->master = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9098 soap->socket = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9099 soap->sendsk = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9100 soap->recvsk = SOAP_INVALID_SOCKET;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9101 soap->os = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9102 soap->is = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9103 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9104 soap->dom = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9105 soap->dime.list = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9106 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9107 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9108 soap->mime.list = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9109 soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9110 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9111 soap->mime.boundary = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9112 soap->mime.start = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9113 soap->xlist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9114 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9115 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9116 soap->recvfd = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9117 soap->sendfd = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9118 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9119 soap->recvfd = stdin;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9120 soap->sendfd = stdout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9121 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9122 soap->host[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9123 soap->port = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9124 soap->action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9125 soap->proxy_host = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9126 soap->proxy_port = 8080;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9127 soap->proxy_userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9128 soap->proxy_passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9129 soap->prolog = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9130 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9131 soap->zlib_state = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9132 soap->zlib_in = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9133 soap->zlib_out = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9134 soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9135 soap->d_stream->zalloc = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9136 soap->d_stream->zfree = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9137 soap->d_stream->opaque = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9138 soap->z_buf = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9139 soap->z_level = 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9140 soap->z_dict = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9141 soap->z_dict_len = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9142 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9143 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9144 soap->wsuid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9145 soap->c14nexclude = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9146 soap->cookies = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9147 soap->cookie_domain = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9148 soap->cookie_path = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9149 soap->cookie_max = 32;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9150 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9151 #ifdef WMW_RPM_IO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9152 soap->rpmreqid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9153 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9154 #ifdef PALM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9155 palmNetLibOpen();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9156 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9157 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9158 soap_init_iht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9159 soap_init_pht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9160 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9161 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9162 if (!soap_ssl_init_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9163 soap_ssl_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9164 soap->fsslauth = ssl_auth_init;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9165 soap->fsslverify = ssl_verify_callback;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9166 soap->bio = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9167 soap->ssl = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9168 soap->ctx = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9169 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9170 soap->ssl_flags = SOAP_SSL_DEFAULT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9171 soap->keyfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9172 soap->keyid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9173 soap->password = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9174 soap->cafile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9175 soap->capath = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9176 soap->crlfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9177 soap->dhfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9178 soap->randfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9179 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9180 #ifdef WITH_GNUTLS
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9181 if (!soap_ssl_init_done)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9182 soap_ssl_init();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9183 soap->fsslauth = ssl_auth_init;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9184 soap->fsslverify = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9185 soap->xcred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9186 soap->acred = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9187 soap->cache = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9188 soap->session = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9189 soap->ssl_flags = SOAP_SSL_DEFAULT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9190 soap->keyfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9191 soap->keyid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9192 soap->password = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9193 soap->cafile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9194 soap->capath = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9195 soap->crlfile = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9196 soap->dh_params = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9197 soap->rsa_params = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9198 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9199 #ifdef WITH_C_LOCALE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9200 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9201 soap->c_locale = _create_locale(LC_ALL, "C");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9202 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9203 soap->c_locale = newlocale(LC_ALL_MASK, "C", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9204 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9205 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9206 soap->c_locale = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9207 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9208 soap->buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9209 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9210 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9211 soap->dime.chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9212 soap->dime.buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9213 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9214 soap->null = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9215 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9216 soap->encoding = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9217 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9218 soap->ns = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9219 soap->part = SOAP_END;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9220 soap->event = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9221 soap->evlev = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9222 soap->alloced = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9223 soap->count = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9224 soap->length = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9225 soap->cdata = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9226 soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9227 soap->ahead = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9228 soap->idnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9229 soap->level = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9230 soap->endpoint[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9231 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9232 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9233 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9234
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9235 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9236 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9237 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9238 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9239 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9240 soap_begin(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9241 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9242 if (!soap->keep_alive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9243 { soap->buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9244 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9245 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9246 soap->null = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9247 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9248 soap->encoding = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9249 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9250 soap->mode = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9251 soap->ns = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9252 soap->part = SOAP_END;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9253 soap->event = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9254 soap->evlev = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9255 soap->alloced = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9256 soap->count = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9257 soap->length = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9258 soap->cdata = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9259 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9260 soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9261 soap->ahead = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9262 soap->idnum = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9263 soap->level = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9264 soap->endpoint[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9265 soap->encodingStyle = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9266 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9267 soap->dime.chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9268 soap->dime.buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9269 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9270 soap_free_temp(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9271 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9272 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9273
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9274 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9275 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9276 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9277 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9278 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9279 soap_end(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9280 { if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9281 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9282 soap_free_temp(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9283 soap_dealloc(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9284 while (soap->clist)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9285 { register struct soap_clist *cp = soap->clist->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9286 SOAP_FREE(soap, soap->clist);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9287 soap->clist = cp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9288 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9289 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9290 #ifdef SOAP_DEBUG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9291 soap_close_logfiles(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9292 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9293 #ifdef PALM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9294 palmNetLibClose();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9295 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9296 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9297 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9298
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9299 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9300 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9301 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9302 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9303 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9304 soap_set_version(struct soap *soap, short version)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9305 { soap_set_local_namespaces(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9306 if (soap->version != version)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9307 { if (version == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9308 { soap->local_namespaces[0].ns = soap_env1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9309 soap->local_namespaces[1].ns = soap_enc1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9310 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9311 else if (version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9312 { soap->local_namespaces[0].ns = soap_env2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9313 soap->local_namespaces[1].ns = soap_enc2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9314 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9315 soap->version = version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9317 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9318 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9319
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9320 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9321 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9322 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9323 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9324 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9325 soap_set_namespaces(struct soap *soap, const struct Namespace *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9326 { register struct Namespace *ns = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9327 register struct soap_nlist *np, *nq, *nr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9328 register unsigned int level = soap->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9329 soap->namespaces = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9330 soap->local_namespaces = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9331 soap_set_local_namespaces(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9332 /* reverse the namespace list */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9333 np = soap->nlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9334 soap->nlist = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9335 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9336 { nq = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9337 np->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9338 while (nq)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9339 { nr = nq->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9340 nq->next = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9341 np = nq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9342 nq = nr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9343 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9345 /* then push on new stack */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9346 while (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9347 { register const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9348 soap->level = np->level; /* preserve element nesting level */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9349 s = np->ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9350 if (!s && np->index >= 0 && ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9351 { s = ns[np->index].out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9352 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9353 s = ns[np->index].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9354 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9355 if (s && soap_push_namespace(soap, np->id, s) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9356 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9357 nq = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9358 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9359 SOAP_FREE(soap, nq);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9360 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9361 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9362 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9363 for (i = 0; ns[i].id; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9364 { if (ns[i].out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9365 { SOAP_FREE(soap, ns[i].out);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9366 ns[i].out = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9367 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9368 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9369 SOAP_FREE(soap, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9370 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9371 soap->level = level; /* restore level */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9372 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9373 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9374 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9375
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9376 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9377 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9378 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9379 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9380 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9381 soap_set_local_namespaces(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9382 { if (soap->namespaces && !soap->local_namespaces)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9383 { register const struct Namespace *ns1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9384 register struct Namespace *ns2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9385 register size_t n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9386 for (ns1 = soap->namespaces; ns1->id; ns1++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9387 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9388 n *= sizeof(struct Namespace);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9389 ns2 = (struct Namespace*)SOAP_MALLOC(soap, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9390 if (ns2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9391 { memcpy(ns2, soap->namespaces, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9392 if (ns2[0].ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9393 { if (!strcmp(ns2[0].ns, soap_env1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9394 soap->version = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9395 else if (!strcmp(ns2[0].ns, soap_env2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9396 soap->version = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9397 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9398 soap->local_namespaces = ns2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9399 for (; ns2->id; ns2++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9400 ns2->out = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9401 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9402 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9403 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9404 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9405
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9406 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9407 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9408 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9409 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9410 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9411 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9412 soap_tagsearch(const char *big, const char *little)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9413 { if (little)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9414 { register size_t n = strlen(little);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9415 register const char *s = big;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9416 while (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9417 { register const char *t = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9418 register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9419 for (i = 0; i < n; i++, t++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9420 { if (*t != little[i])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9421 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9422 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9423 if (*t == '\0' || *t == ' ')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9424 { if (i == n || (i && little[i-1] == ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9425 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9426 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9427 s = strchr(t, ' ');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9428 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9429 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9430 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9431 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9432 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9433 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9434 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9435 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9436
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9437 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9438 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9439 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9440 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9441 struct soap_nlist *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9442 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9443 soap_lookup_ns(struct soap *soap, const char *tag, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9444 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9445 for (np = soap->nlist; np; np = np->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9446 { if (!strncmp(np->id, tag, n) && !np->id[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9447 return np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9448 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9449 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9450 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9451 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9452 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9453
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9454 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9455 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9456 static struct soap_nlist *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9457 soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9458 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9459 size_t n, k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9460 if (soap_tagsearch(soap->c14nexclude, id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9461 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9462 if (!utilized)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9463 { for (np = soap->nlist; np; np = np->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9464 { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9465 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9466 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9467 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9468 { if ((np->level < soap->level || !np->ns) && np->index == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9469 utilized = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9470 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9471 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9472 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9474 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns ? ns : "(null)", utilized));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9475 n = strlen(id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9476 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9477 k = strlen(ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9478 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9479 k = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9480 np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9481 if (!np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9482 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9483 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9484 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9485 np->next = soap->nlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9486 soap->nlist = np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9487 strcpy((char*)np->id, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9488 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9489 np->ns = strcpy((char*)np->id + n + 1, ns);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9490 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9491 np->ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9492 np->level = soap->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9493 np->index = utilized;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9494 return np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9495 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9496 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9497
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9498 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9499 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9500 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9501 soap_utilize_ns(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9502 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9503 size_t n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9504 const char *t = strchr(tag, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9505 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9506 { n = t - tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9507 if (n >= sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9508 n = sizeof(soap->tmpbuf) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9510 np = soap_lookup_ns(soap, tag, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9511 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9512 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9513 { if (np->index <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9514 soap_push_ns(soap, np->id, np->ns, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9516 else if (strncmp(tag, "xml", 3))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9517 { strncpy(soap->tmpbuf, tag, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9518 soap->tmpbuf[n] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9519 soap_push_ns(soap, soap->tmpbuf, NULL, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9520 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9521 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9522 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9523
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9524 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9525 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9526 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9527 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9528 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9529 soap_element(struct soap *soap, const char *tag, int id, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9530 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9531 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9532 register const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9533 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9534 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9535 soap->level++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9536 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9537 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9538 if (soap->wsuid && soap_tagsearch(soap->wsuid, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9539 { size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9540 for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9541 soap->tag[i] = *s == ':' ? '-' : *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9542 soap->tag[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9543 if (soap_set_attr(soap, "wsu:Id", soap->tag, 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9544 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9546 if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9547 { if (soap->evlev >= soap->level)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9548 soap->evlev = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9549 if (soap->event == SOAP_SEC_BEGIN && !soap->evlev)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9550 { register struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9551 /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9552 for (np = soap->nlist; np; np = np->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9553 { if (np->index == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9554 { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9555 if (np1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9556 np1->index = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9557 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9558 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9559 soap->evlev = soap->level;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9560 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9561 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9562 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9563 if (soap->mode & SOAP_XML_DOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9564 { register struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9565 if (!elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9566 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9567 elt->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9568 elt->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9569 elt->prnt = soap->dom;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9570 elt->name = soap_strdup(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9571 elt->elts = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9572 elt->atts = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9573 elt->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9574 elt->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9575 elt->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9576 elt->node = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9577 elt->type = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9578 elt->head = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9579 elt->tail = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9580 if (soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9581 { struct soap_dom_element *p = soap->dom->elts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9582 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9583 { while (p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9584 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9585 p->next = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9587 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9588 soap->dom->elts = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9589 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9590 soap->dom = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9591 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9592 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9593 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9594 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9595 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9596 if (!soap->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9597 { if (!(soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9598 && soap_send(soap, soap->prolog ? soap->prolog : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9599 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9600 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9601 else if (soap->mode & SOAP_XML_INDENT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9602 { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9603 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9604 soap->body = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9605 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9606 if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9607 { struct Namespace *ns = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9608 size_t n = s - tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9609 if (soap_send_raw(soap, "<", 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9610 || soap_send(soap, s + 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9611 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9612 if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9613 ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9614 for (; ns && ns->id; ns++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9615 { if (*ns->id && (ns->out || ns->ns) && !strncmp(ns->id, tag, n) && !ns->id[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9616 { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9617 if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9618 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9619 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9620 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9621 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9622 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9623 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9624 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9625 if (soap_send_raw(soap, "<", 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9626 || soap_send(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9627 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9628 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9629 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9630 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9631 if (!soap->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9632 { struct Namespace *ns = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9633 int k = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9634 if (ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9635 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9636 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9637 if ((soap->mode & SOAP_XML_DEFAULTNS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9638 { if (soap->version)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9639 k = 4; /* first four required entries */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9640 else if (!(soap->mode & SOAP_XML_NOTYPE) || (soap->mode & SOAP_XML_NIL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9641 { ns += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9642 k = 2; /* next two entries */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9643 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9644 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9645 k = 0; /* no entries */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9646 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9647 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9648 while (k-- && ns->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9649 { if (*ns->id && (ns->out || ns->ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9650 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9651 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9652 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns:%s", ns->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9653 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9654 sprintf(soap->tmpbuf, "xmlns:%s", ns->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9655 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9656 if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9657 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9658 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9659 ns++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9662 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9663 soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9664 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9665 if (soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9666 soap_utilize_ns(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9667 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9668 if (id > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9669 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9670 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9671 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "_%d", id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9672 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9673 sprintf(soap->tmpbuf, "_%d", id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9674 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9675 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9676 { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9677 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9678 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9679 else if (soap_attribute(soap, "id", soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9680 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9682 if (type && *type && !(soap->mode & SOAP_XML_NOTYPE) && soap->part != SOAP_IN_HEADER)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9683 { const char *t = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9684 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9685 if (soap->mode & SOAP_XML_DEFAULTNS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9686 { t = strchr(type, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9687 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9688 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9689 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9690 t = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9691 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9692 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9693 if (soap->attributes ? soap_set_attr(soap, "xsi:type", t, 1) : soap_attribute(soap, "xsi:type", t))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9694 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9695 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9696 if (soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9697 soap_utilize_ns(soap, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9698 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9699 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9700 if (soap->null && soap->position > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9701 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9702 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9703 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, "[%d", soap->positions[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9704 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9705 sprintf(soap->tmpbuf, "[%d", soap->positions[0]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9706 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9707 for (i = 1; i < soap->position; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9708 { register size_t l = strlen(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9709 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9710 soap_snprintf(soap->tmpbuf + l, sizeof(soap->tmpbuf)-l-1, ",%d", soap->positions[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9711 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9712 if (l + 13 < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9713 sprintf(soap->tmpbuf + l, ",%d", soap->positions[i]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9714 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9715 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9716 strcat(soap->tmpbuf, "]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9717 if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9718 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9719 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9720 if (soap->mustUnderstand)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9721 { if (soap->actor && *soap->actor)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9722 { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9723 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9724 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9725 if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9726 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9727 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9728 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9729 if (soap->encoding)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9730 { if (soap->encodingStyle && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9731 { if (!*soap->encodingStyle)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9732 { if (soap->local_namespaces[1].out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9733 soap->encodingStyle = soap->local_namespaces[1].out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9734 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9735 soap->encodingStyle = soap->local_namespaces[1].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9736 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9737 if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9738 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9739 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9740 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9741 soap->encodingStyle = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9742 soap->encoding = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9743 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9744 soap->null = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9745 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9746 if (soap->event == SOAP_SEC_BEGIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9747 soap->event = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9748 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9749 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9750 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9751
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9752 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9753 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9754 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9755 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9756 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9757 soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9758 { if (*tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9759 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9760 if (soap_element(soap, tag, id, type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9761 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9762 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9763 if (soap_element_start_end_out(soap, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9764 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9765 if (soap->feltbegout)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9766 return soap->error = soap->feltbegout(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9767 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9768 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9769 return soap_element_start_end_out(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9770 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9771 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9772 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9773
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9774 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9775 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9776 #ifndef HAVE_STRRCHR
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9777 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9778 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9779 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9780 soap_strrchr(const char *s, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9781 { register char *r = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9782 while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9783 if (*s++ == t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9784 r = (char*)s - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9785 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9786 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9787 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9788 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9789
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9790 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9791 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9792 #ifndef HAVE_STRTOL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9793 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9794 long
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9795 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9796 soap_strtol(const char *s, char **t, int b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9797 { register long n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9798 register int c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9799 while (*s > 0 && *s <= 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9800 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9801 if (b == 10)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9802 { short neg = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9803 if (*s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9804 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9805 neg = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9806 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9807 else if (*s == '+')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9808 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9809 while ((c = *s) && c >= '0' && c <= '9')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9810 { if (n >= 214748364 && (n > 214748364 || c >= '8'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9811 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9812 n *= 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9813 n += c - '0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9814 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9816 if (neg)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9817 n = -n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9818 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9819 else /* assume b == 16 and value is always positive */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9820 { while ((c = *s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9821 { if (c >= '0' && c <= '9')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9822 c -= '0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9823 else if (c >= 'A' && c <= 'F')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9824 c -= 'A' - 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9825 else if (c >= 'a' && c <= 'f')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9826 c -= 'a' - 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9827 if (n > 0x07FFFFFF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9828 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9829 n <<= 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9830 n += c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9831 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9832 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9833 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9834 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9835 *t = (char*)s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9836 return n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9837 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9838 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9839 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9840
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9841 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9842 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9843 #ifndef HAVE_STRTOUL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9844 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9845 unsigned long
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9846 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9847 soap_strtoul(const char *s, char **t, int b)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9848 { unsigned long n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9849 register int c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9850 while (*s > 0 && *s <= 32)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9851 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9852 if (b == 10)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9853 { if (*s == '+')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9854 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9855 while ((c = *s) && c >= '0' && c <= '9')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9856 { if (n >= 429496729 && (n > 429496729 || c >= '6'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9857 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9858 n *= 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9859 n += c - '0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9860 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9861 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9863 else /* b == 16 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9864 { while ((c = *s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9865 { if (c >= '0' && c <= '9')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9866 c -= '0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9867 else if (c >= 'A' && c <= 'F')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9868 c -= 'A' - 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9869 else if (c >= 'a' && c <= 'f')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9870 c -= 'a' - 10;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9871 if (n > 0x0FFFFFFF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9872 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9873 n <<= 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9874 n += c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9875 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9876 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9878 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9879 *t = (char*)s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9880 return n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9881 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9882 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9883 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9884
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9885 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9886 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9887 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9888 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9889 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9890 soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9891 { if (!type || !*type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9892 return soap_element_begin_out(soap, tag, id, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9893 if (soap_element(soap, tag, id, "SOAP-ENC:Array"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9894 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9895 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9896 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9897 s = soap_strrchr(type, '[');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9898 if (s && (size_t)(s - type) < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9899 { strncpy(soap->tmpbuf, type, s - type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9900 soap->tmpbuf[s - type] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9901 if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9902 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9903 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9904 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9905 { strncpy(soap->tmpbuf, s, sizeof(soap->tmpbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9906 soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9907 soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9908 if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9909 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9910 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9911 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9912 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9913 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9914 { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9915 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9916 if (soap_attribute(soap, "SOAP-ENC:arrayType", type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9917 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9918 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9919 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9920 if ((soap->mode & SOAP_XML_CANONICAL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9921 soap_utilize_ns(soap, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9922 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9923 return soap_element_start_end_out(soap, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9924 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9925 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9926
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9927 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9928 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9929 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9930 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9931 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9932 soap_element_start_end_out(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9933 { register struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9934 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9935 if (soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9936 { struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9937 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9938 { if (tp->visible && tp->name)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9939 soap_utilize_ns(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9940 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9941 for (np = soap->nlist; np; np = np->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9942 { if (np->index == 1 && np->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9943 { if (*(np->id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9944 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9945 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9946 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns:%s", np->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9947 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9948 sprintf(soap->tmpbuf, "xmlns:%s", np->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9949 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9951 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9952 strcpy(soap->tmpbuf, "xmlns");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9953 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s'\n", np->level, soap->tmpbuf, np->ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9954 soap_set_attr(soap, soap->tmpbuf, np->ns, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9955 np->index = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9956 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9957 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9959 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9960 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9961 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9962 { register struct soap_dom_attribute **att;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9963 att = &soap->dom->atts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9964 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9965 { if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9966 { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9967 if (!*att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9968 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9969 (*att)->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9970 (*att)->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9971 (*att)->name = soap_strdup(soap, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9972 (*att)->data = soap_strdup(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9973 (*att)->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9974 (*att)->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9975 att = &(*att)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9976 tp->visible = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9977 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9978 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9979 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9980 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9981 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9982 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9983 { if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9984 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9985 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9986 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9987 if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tp->name, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9988 { size_t n = s - tp->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9989 if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9990 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9991 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9992 s = tp->name;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9993 if (soap_send(soap, " ") || soap_send(soap, s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9994 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9995 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9996 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9997 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9998 if (soap_send(soap, " ") || soap_send(soap, tp->name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
9999 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10000 if (tp->visible == 2 && tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10001 if (soap_send_raw(soap, "=\"", 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10002 || soap_string_out(soap, tp->value, tp->flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10003 || soap_send_raw(soap, "\"", 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10004 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10005 tp->visible = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10006 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10007 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10008 if (tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10009 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10010 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10011 if (soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10012 { if (soap_send_raw(soap, ">", 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10013 || soap_element_end_out(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10014 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10015 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10016 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10017 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10018 soap->level--; /* decrement level just before /> */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10019 return soap_send_raw(soap, "/>", 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10020 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10021 return soap_send_raw(soap, ">", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10022 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10023 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10024
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10025 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10026 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10027 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10028 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10029 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10030 soap_element_end_out(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10031 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10032 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10033 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10034 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10035 if (*tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10036 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10037 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10038 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10039 if (soap->feltendout && (soap->error = soap->feltendout(soap, tag)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10040 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10041 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10042 { if (soap->dom->prnt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10043 soap->dom = soap->dom->prnt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10044 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10045 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10046 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10047 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10048 if (soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10049 soap_pop_namespace(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10050 if (soap->mode & SOAP_XML_INDENT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10051 { if (!soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10052 { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10053 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10054 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10055 soap->body = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10056 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10057 if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10058 { soap_pop_namespace(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10059 tag = s + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10060 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10061 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10062 if (soap_send_raw(soap, "</", 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10063 || soap_send(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10064 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10065 soap->level--; /* decrement level just before > */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10066 return soap_send_raw(soap, ">", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10068 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10069
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10070 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10071 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10072 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10073 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10074 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10075 soap_element_ref(struct soap *soap, const char *tag, int id, int href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10076 { register const char *s = "ref";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10077 register int n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10078 if (soap->version == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10079 { s = "href";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10080 n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10081 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10082 else if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10083 s = "SOAP-ENC:ref";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10084 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10085 soap_snprintf(soap->href, sizeof(soap->href), "#_%d", href);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10086 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10087 sprintf(soap->href, "#_%d", href);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10088 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10089 return soap_element_href(soap, tag, id, s, soap->href + n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10090 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10091 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10092
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10093 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10094 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10095 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10096 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10097 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10098 soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10099 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10100 if (soap_element(soap, tag, id, NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10101 || soap_attribute(soap, ref, val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10102 || soap_element_start_end_out(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10103 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10104 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10105 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10106 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10107
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10108 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10109 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10110 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10111 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10112 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10113 soap_element_null(struct soap *soap, const char *tag, int id, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10114 { struct soap_attribute *tp = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10115 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10116 if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10117 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10118 if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10119 { if (soap_element(soap, tag, id, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10120 || (!tp && soap_attribute(soap, "xsi:nil", "true")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10121 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10122 return soap_element_start_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10124 soap->null = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10125 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10126 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10127 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10128 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10129 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10130
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10131 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10132 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10133 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10134 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10135 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10136 soap_element_nil(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10137 { if (soap_element(soap, tag, -1, NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10138 || ((soap->mode & SOAP_XML_NIL) && soap_attribute(soap, "xsi:nil", "true")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10139 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10140 return soap_element_start_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10141 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10142 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10143
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10144 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10145 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10146 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10147 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10148 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10149 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, int n, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10150 { if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10151 { soap->error = soap_element_null(soap, tag, id, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10152 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10153 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10154 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10155 if ((!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10156 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10157 if (id < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10158 { struct soap_plist *pp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10159 if (a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10160 id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10161 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10162 id = soap_pointer_lookup(soap, p, t, &pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10163 if (id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10164 { if (soap_is_embedded(soap, pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10165 { soap_element_ref(soap, tag, 0, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10166 return -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10167 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10168 if (soap_is_single(soap, pp))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10169 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10170 soap_set_embedded(soap, pp);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10171 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10172 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10173 return id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10174 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10175 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10176 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10177 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10178 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10179
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10180 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10181 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10182 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10183 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10184 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10185 soap_element_result(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10186 { if (soap->version == 2 && soap->encodingStyle)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10187 { if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10188 || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10189 || soap_element_start_end_out(soap, NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10190 || soap_string_out(soap, tag, 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10191 || soap_element_end_out(soap, "SOAP-RPC:result"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10192 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10193 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10194 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10195 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10196 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10197
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10198 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10199 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10200 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10201 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10202 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10203 soap_check_result(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10204 { if (soap->version == 2 && soap->encodingStyle)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10205 { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10206 /* just ignore content for compliance reasons, but should compare tag to element's QName value? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10207 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10208 (void)tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10209 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10210 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10211
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10212 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10213 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10214 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10215 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10216 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10217 soap_attribute(struct soap *soap, const char *name, const char *value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10218 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10219 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10220 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10221 if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10222 { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10223 if (!a)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10224 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10225 a->next = soap->dom->atts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10226 a->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10227 a->name = soap_strdup(soap, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10228 a->data = soap_strdup(soap, value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10229 a->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10230 a->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10231 soap->dom->atts = a;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10232 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10233 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10234 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10235 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10236 if (soap->mode & SOAP_XML_CANONICAL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10237 { /* push namespace */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10238 if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10239 soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10240 else if (soap_set_attr(soap, name, value, 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10241 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10242 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10243 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10244 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10245 { if (soap_send(soap, " ") || soap_send(soap, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10246 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10247 if (value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10248 if (soap_send_raw(soap, "=\"", 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10249 || soap_string_out(soap, value, 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10250 || soap_send_raw(soap, "\"", 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10251 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10252 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10253 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10254 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10255 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10256
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10257 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10258 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10259 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10260 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10261 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10262 soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10263 { if (!soap_peek_element(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10264 { if (soap->other)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10265 return soap->error = SOAP_TAG_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10266 if (tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10267 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10268 if (!(soap->error = soap_match_tag(soap, soap->tag, tag)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10269 { soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10270 if (type && *soap->type && soap_match_tag(soap, soap->type, type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10271 return soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10272 if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10273 return soap->error = SOAP_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10274 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10275 soap->level++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10276 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS ));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10277 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10278 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10280 else if (soap->error == SOAP_NO_TAG && tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10281 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10282 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10284 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10285
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10286 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10287 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10288 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10289 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10290 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10291 soap_element_end_in(struct soap *soap, const char *tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10292 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10293 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10294 register int n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10295 if (tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10296 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10297 if (soap->error == SOAP_NO_TAG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10298 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10299 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10300 /* this whitespace or mixed content is significant for DOM */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10301 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10302 { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10303 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10304 if (soap->dom->prnt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10305 soap->dom = soap->dom->prnt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10306 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10307 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10308 if (soap->peeked)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10309 { if (*soap->tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10310 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10311 soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10312 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10313 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10314 { while (((c = soap_get(soap)) != SOAP_TT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10315 { if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10316 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10317 if (c == SOAP_LT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10318 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10319 else if (c == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10320 { c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10321 if (c == SOAP_GT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10322 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10323 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10324 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10326 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10327 } while (n--);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10328 s = soap->tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10329 n = sizeof(soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10330 while (soap_notblank(c = soap_get(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10331 { if (--n > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10332 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10334 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10335 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10336 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10337 while (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10338 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10339 if (c != SOAP_GT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10340 return soap->error = SOAP_SYNTAX_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10341 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10342 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10343 if (soap->feltendin)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10344 { soap->level--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10345 return soap->error = soap->feltendin(soap, soap->tag, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10346 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10347 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10348 if (tag && (soap->mode & SOAP_XML_STRICT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10349 { soap_pop_namespace(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10350 if (soap_match_tag(soap, soap->tag, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10351 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10352 return soap->error = SOAP_SYNTAX_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10353 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10354 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10355 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10356 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10357 soap->level--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10358 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10359 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10360 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10361
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10362 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10363 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10364 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10365 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10366 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10367 soap_attr_value(struct soap *soap, const char *name, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10368 { register struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10369 if (*name == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10370 return SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10371 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10372 { if (tp->visible && !soap_match_tag(soap, tp->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10373 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10374 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10375 if (tp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10376 { if (flag == 2 && (soap->mode & SOAP_XML_STRICT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10377 soap->error = SOAP_PROHIBITED;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10378 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10379 return tp->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10380 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10381 else if (flag == 1 && (soap->mode & SOAP_XML_STRICT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10382 soap->error = SOAP_REQUIRED;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10383 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10384 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10385 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10386 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10387 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10388
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10389 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10390 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10391 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10392 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10393 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10394 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10395 { register struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10396 if (*name == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10397 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10398 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10399 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10400 { if (!strcmp(tp->name, name))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10401 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10402 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10403 if (!tp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10404 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10405 if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(name))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10406 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10407 tp->ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10408 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10409 if ((soap->mode & SOAP_XML_CANONICAL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10410 { struct soap_attribute **tpp = &soap->attributes;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10411 const char *s = strchr(name, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10412 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10413 if (!strncmp(name, "xmlns", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10414 { for (; *tpp; tpp = &(*tpp)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10415 if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10416 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10417 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10418 else if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10419 { for (; *tpp; tpp = &(*tpp)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10420 if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10421 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10422 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10423 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10424 { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10425 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10426 tp->ns = np->ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10427 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10428 { struct soap_attribute *tq;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10429 for (tq = soap->attributes; tq; tq = tq->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10430 { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10431 { tp->ns = tq->ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10432 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10433 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10434 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10435 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10436 for (; *tpp; tpp = &(*tpp)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10437 { int k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10438 if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10439 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10440 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10442 tp->next = *tpp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10443 *tpp = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10444 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10445 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10446 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10447 { tp->next = soap->attributes;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10448 soap->attributes = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10449 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10450 strcpy((char*)tp->name, name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10451 tp->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10452 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10453 else if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10454 { return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10455 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10456 else if (value && tp->value && tp->size <= strlen(value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10457 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10458 SOAP_FREE(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10459 tp->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10460 tp->ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10461 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10462 if (value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10463 { if (!tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10464 { tp->size = strlen(value) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10465 if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10466 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10467 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10468 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10469 strcpy(tp->value, value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10470 if (!strncmp(tp->name, "xmlns:", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10471 tp->ns = tp->value;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10472 tp->visible = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10473 tp->flag = (short)flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10474 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10475 if (!strcmp(name, "wsu:Id"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10476 { soap->event = SOAP_SEC_BEGIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10477 strncpy(soap->id, value, sizeof(soap->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10478 soap->id[sizeof(soap->id) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10479 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10480 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10481 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10482 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10483 tp->visible = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10484 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10485 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10486 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10487
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10488 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10489 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10490 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10491 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10492 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10493 soap_clr_attr(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10494 { register struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10495 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10496 if ((soap->mode & SOAP_XML_CANONICAL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10497 { while (soap->attributes)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10498 { tp = soap->attributes->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10499 if (soap->attributes->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10500 SOAP_FREE(soap, soap->attributes->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10501 SOAP_FREE(soap, soap->attributes);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10502 soap->attributes = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10503 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10504 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10505 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10506 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10507 { for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10508 tp->visible = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10509 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10510 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10511 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10512
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10513 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10514 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10515 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10516 soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10517 { register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10518 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10519 { register soap_wchar c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10520 switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10521 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10522 case SOAP_TT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10523 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10524 soap_unget(soap, '/');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10525 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10526 case SOAP_LT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10527 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10528 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10529 case SOAP_GT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10530 if (d == ' ')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10531 { soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10532 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10533 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10534 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10535 *s++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10536 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10537 case SOAP_QT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10538 if (c == d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10539 { *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10540 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10541 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10542 *s++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10543 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10544 case SOAP_AP:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10545 if (c == d)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10546 { *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10547 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10548 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10549 *s++ = '\'';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10550 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10551 case '\t':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10552 case '\n':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10553 case '\r':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10554 case ' ':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10555 case '/':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10556 if (d == ' ')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10557 { soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10558 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10559 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10560 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10561 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10562 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10563 { *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10564 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10565 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10566 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10567 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10568 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10569 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10570 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10571 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10572
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10573 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10574 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10575 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10576 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10577 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10578 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10579 soap_store_lab(struct soap *soap, const char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10580 { soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10581 return soap_append_lab(soap, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10583 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10584 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10585
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10586 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10587 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10588 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10589 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10590 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10591 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10592 soap_append_lab(struct soap *soap, const char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10593 { if (soap->labidx + n >= soap->lablen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10594 { register char *t = soap->labbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10595 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10596 if (soap->lablen == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10597 soap->lablen = SOAP_LABLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10598 while (soap->labidx + n >= soap->lablen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10599 soap->lablen <<= 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10600 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10601 soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10602 if (!soap->labbuf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10603 { if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10604 SOAP_FREE(soap, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10605 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10606 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10607 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10608 { memcpy(soap->labbuf, t, soap->labidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10609 SOAP_FREE(soap, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10611 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10612 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10613 { memcpy(soap->labbuf + soap->labidx, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10614 soap->labidx += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10615 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10616 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10617 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10618 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10619 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10620
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10621 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10622 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10623 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10624 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10625 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10626 soap_peek_element(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10627 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10628 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10629 register struct soap_dom_attribute **att = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10630 register char *lead = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10631 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10632 register struct soap_attribute *tp, *tq = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10633 register const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10634 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10635 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10636 register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10637 if (soap->peeked)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10638 { if (!*soap->tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10639 return soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10640 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10641 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10642 soap->peeked = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10643 soap->id[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10644 soap->href[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10645 soap->type[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10646 soap->arrayType[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10647 soap->arraySize[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10648 soap->arrayOffset[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10649 soap->other = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10650 soap->root = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10651 soap->position = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10652 soap->null = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10653 soap->mustUnderstand = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10654 /* UTF-8 BOM? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10655 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10656 if (c == 0xEF && soap_get0(soap) == 0xBB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10657 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10658 if ((c = soap_get1(soap)) == 0xBF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10659 soap->mode &= ~SOAP_ENC_LATIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10660 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10661 soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10662 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10663 else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10664 || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10665 return soap->error = SOAP_UTF_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10666 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10667 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10668 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10669 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10670 /* whitespace leading to tag is not insignificant for DOM */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10671 if (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10672 { soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10673 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10674 { if (soap_append_lab(soap, NULL, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10675 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10676 s = soap->labbuf + soap->labidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10677 i = soap->lablen - soap->labidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10678 soap->labidx = soap->lablen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10679 while (soap_blank(c) && i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10680 { *s++ = c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10681 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10683 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10684 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10685 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10686 lead = soap->labbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10687 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10688 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10689 /* skip space */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10690 while (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10691 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10692 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10693 if (c != SOAP_LT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10694 { *soap->tag = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10695 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10696 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10697 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10698 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10699 /* whitespace leading to end tag is significant for DOM */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10700 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10701 { if (lead && *lead)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10702 soap->dom->tail = soap_strdup(soap, lead);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10703 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10704 soap->dom->tail = (char*)SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10705 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10706 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10707 return soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10708 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10709 do c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10710 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10711 s = soap->tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10712 i = sizeof(soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10713 while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10714 { if (--i > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10715 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10716 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10717 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10718 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10719 while (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10720 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10721 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10722 if (soap->mode & SOAP_XML_DOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10723 { register struct soap_dom_element *elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10724 elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10725 if (!elt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10726 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10727 elt->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10728 elt->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10729 elt->name = soap_strdup(soap, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10730 elt->prnt = soap->dom;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10731 elt->elts = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10732 elt->atts = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10733 elt->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10734 elt->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10735 elt->type = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10736 elt->node = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10737 elt->head = soap_strdup(soap, lead);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10738 elt->tail = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10739 elt->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10740 if (soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10741 { struct soap_dom_element *p = soap->dom->elts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10742 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10743 { while (p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10744 p = p->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10745 p->next = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10746 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10747 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10748 soap->dom->elts = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10749 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10750 soap->dom = elt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10751 att = &elt->atts;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10753 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10754 soap_pop_namespace(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10755 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10756 tp->visible = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10757 while ((int)c != EOF && c != '>' && c != '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10758 { s = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10759 i = sizeof(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10760 while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10761 { if (--i > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10762 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10763 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10764 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10765 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10766 if (i == sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10767 return soap->error = SOAP_SYNTAX_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10768 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10769 /* add attribute name to dom */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10770 if (att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10771 { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10772 if (!*att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10773 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10774 (*att)->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10775 (*att)->nstr = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10776 (*att)->name = soap_strdup(soap, soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10777 (*att)->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10778 (*att)->wide = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10779 (*att)->soap = soap;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10780 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10781 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10782 if (!strncmp(soap->tmpbuf, "xmlns", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10783 { if (soap->tmpbuf[5] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10784 t = soap->tmpbuf + 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10785 else if (soap->tmpbuf[5])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10786 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10787 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10788 t = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10789 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10790 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10791 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10792 tq = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10793 for (tp = soap->attributes; tp; tq = tp, tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10794 { if (!SOAP_STRCMP(tp->name, soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10795 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10796 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10797 if (!tp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10798 { tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10799 if (!tp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10800 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10801 strcpy((char*)tp->name, soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10802 tp->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10803 tp->size = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10804 tp->ns = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10805 /* if attribute name is qualified, append it to the end of the list */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10806 if (tq && strchr(soap->tmpbuf, ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10807 { tq->next = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10808 tp->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10809 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10810 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10811 { tp->next = soap->attributes;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10812 soap->attributes = tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10813 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10814 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10815 while (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10816 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10817 if (c == '=')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10818 { do c = soap_getutf8(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10819 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10820 if (c != SOAP_QT && c != SOAP_AP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10821 { soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10822 c = ' '; /* blank delimiter */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10823 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10824 if (soap_getattrval(soap, tp->value, tp->size, c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10825 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10826 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10827 if (soap->error != SOAP_EOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10828 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10829 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10830 if (soap_store_lab(soap, tp->value, tp->size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10831 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10832 if (tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10833 SOAP_FREE(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10834 tp->value = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10835 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10836 { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10837 { if (soap->error != SOAP_EOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10838 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10839 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10840 soap->labidx = soap->lablen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10841 if (soap_append_lab(soap, NULL, 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10842 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10843 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10844 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10845 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10846 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10847 if (soap->labidx)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10848 tp->size = soap->lablen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10849 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10850 { tp->size = strlen(soap->labbuf) + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10851 if (tp->size < SOAP_LABLEN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10852 tp->size = SOAP_LABLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10853 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10854 if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10855 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10856 strcpy(tp->value, soap->labbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10857 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10858 size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10859 if (soap->error != SOAP_EOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10860 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10861 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10862 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10863 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10864 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10865 { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10866 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10867 if (soap_getattrval(soap, s, SOAP_BLKLEN, c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10868 { if (soap->error != SOAP_EOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10869 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10870 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10872 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10873 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10874 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10875 n = tp->size + soap->blist->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10876 if (!(s = (char*)SOAP_MALLOC(soap, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10877 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10878 if (tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10879 { memcpy(s, tp->value, tp->size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10880 SOAP_FREE(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10881 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10882 soap_save_block(soap, NULL, s + tp->size, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10883 tp->value = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10884 tp->size = n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10885 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10886 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10887 do c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10888 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10889 tp->visible = 2; /* seen this attribute w/ value */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10890 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10891 if (att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10892 (*att)->data = soap_strdup(soap, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10893 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10894 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10895 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10896 tp->visible = 1; /* seen this attribute w/o value */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10897 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10898 if (att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10899 att = &(*att)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10900 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10901 if (t && tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10902 { if (soap_push_namespace(soap, t, tp->value) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10903 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10904 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10905 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10906 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10907 if (att)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10908 { soap->dom->nstr = soap_current_namespace(soap, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10909 for (att = &soap->dom->atts; *att; att = &(*att)->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10910 (*att)->nstr = soap_current_namespace(soap, (*att)->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10911 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10912 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10913 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10914 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10915 if (!(soap->body = (c != '/')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10916 do c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10917 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10918 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10919 if (soap->mode & SOAP_XML_DOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10920 { if (!soap->body && soap->dom->prnt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10921 soap->dom = soap->dom->prnt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10922 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10923 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10924 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10925 { if (tp->visible && tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10926 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10927 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10928 if (!strcmp(tp->name, "id"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10929 { if ((soap->version > 0 && !(soap->imode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10930 || (soap->mode & SOAP_XML_GRAPH))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10931 { *soap->id = '#';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10932 strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10933 soap->id[sizeof(soap->id) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10934 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10935 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10936 else if (!strcmp(tp->name, "href"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10937 { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10938 || (soap->mode & SOAP_XML_GRAPH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10939 || (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10940 || (soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10941 { strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10942 soap->href[sizeof(soap->href) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10943 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10944 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10945 else if (!strcmp(tp->name, "ref"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10946 { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10947 || (soap->mode & SOAP_XML_GRAPH))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10948 { *soap->href = '#';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10949 strncpy(soap->href + (*tp->value != '#'), tp->value, sizeof(soap->href) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10950 soap->href[sizeof(soap->href) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10951 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10952 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10953 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10954 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10955 if (!soap_match_tag(soap, tp->name, "xsi:type"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10956 { strncpy(soap->type, tp->value, sizeof(soap->type) - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10957 soap->type[sizeof(soap->type) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10959 else if ((!soap_match_tag(soap, tp->name, "xsi:null")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10960 || !soap_match_tag(soap, tp->name, "xsi:nil"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10961 && (!strcmp(tp->value, "1")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10962 || !strcmp(tp->value, "true")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10963 { soap->null = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10964 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10965 else if (soap->version == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10966 { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10967 { s = soap_strrchr(tp->value, '[');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10968 if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10969 { strncpy(soap->arrayType, tp->value, s - tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10970 soap->arrayType[s - tp->value] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10971 strncpy(soap->arraySize, s, sizeof(soap->arraySize));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10972 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10973 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10974 strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10975 soap->arraySize[sizeof(soap->arraySize) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10976 soap->arrayType[sizeof(soap->arrayType) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10977 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10978 else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10979 strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10980 else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10981 soap->position = soap_getposition(tp->value, soap->positions);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10982 else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10983 soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10984 else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10985 && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10986 soap->mustUnderstand = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10987 else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10988 { if ((!soap->actor || strcmp(soap->actor, tp->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10989 && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10990 soap->other = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10992 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10993 else if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10994 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10995 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10996 if (!soap_match_tag(soap, tp->name, "SOAP-ENC:id"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10997 { *soap->id = '#';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10998 strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
10999 soap->id[sizeof(soap->id) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11000 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11001 else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11002 { *soap->href = '#';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11003 strncpy(soap->href + (*tp->value != '#'), tp->value, sizeof(soap->href) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11004 soap->href[sizeof(soap->href) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11005 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11006 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11007 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11008 if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11009 strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11010 else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11011 strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11012 else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11013 && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11014 soap->mustUnderstand = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11015 else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11016 { if ((!soap->actor || strcmp(soap->actor, tp->value))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11017 && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11018 soap->other = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11019 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11020 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11021 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11022 { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11023 soap->mustUnderstand = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11024 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11026 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11027 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11028 if (soap->feltbegin)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11029 return soap->error = soap->feltbegin(soap, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11030 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11031 return soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11032 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11033 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11034
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11035 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11036 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11037 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11038 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11039 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11040 soap_retry(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11041 { soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11042 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11043 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11044 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11045
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11046 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11047 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11048 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11049 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11050 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11051 soap_revert(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11052 { if (!soap->peeked)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11053 { soap->peeked = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11054 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11055 soap->level--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11056 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11057 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting to last element '%s' (level=%u)\n", soap->tag, soap->level));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11058 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11059 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11060
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11061 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11062 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11063 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11064 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11065 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11066 soap_string_out(struct soap *soap, const char *s, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11067 { register const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11068 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11069 register soap_wchar mask = (soap_wchar)0xFFFFFF80UL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11070 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11071 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11072 { soap->dom->data = soap_strdup(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11073 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11074 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11075 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11076 if (flag == 2 || soap->mode & SOAP_C_UTFSTRING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11077 mask = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11078 t = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11079 while ((c = *t++))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11080 { switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11081 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11082 case 0x09:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11083 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11084 { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#x9;", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11085 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11086 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11087 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11088 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11089 case 0x0A:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11090 if (flag || !(soap->mode & SOAP_XML_CANONICAL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11091 { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xA;", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11092 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11093 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11094 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11095 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11096 case 0x0D:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11097 if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xD;", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11098 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11099 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11100 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11101 case '&':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11102 if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&amp;", 5))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11103 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11104 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11105 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11106 case '<':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11107 if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&lt;", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11108 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11109 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11110 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11111 case '>':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11112 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11113 { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&gt;", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11114 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11115 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11116 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11117 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11118 case '"':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11119 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11120 { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&quot;", 6))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11121 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11122 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11123 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11124 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11125 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11126 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11127 #ifdef HAVE_MBTOWC
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11128 if (soap->mode & SOAP_C_MBSTRING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11129 { wchar_t wc;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11130 register int m = mbtowc(&wc, t - 1, MB_CUR_MAX);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11131 if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11132 { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)wc))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11133 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11134 s = t += m - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11135 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11136 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11137 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11138 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11139 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11140 #ifndef WITH_NOSTRINGTOUTF8
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11141 if ((c & mask) || !(c & 0xFFFFFFE0UL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11142 { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11143 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11144 s = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11146 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11147 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11148 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11149 return soap_send_raw(soap, s, t - s - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11150 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11151 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11152
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11153 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11154 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11155 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11156 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11157 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11158 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11159 { register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11160 char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11161 register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11162 register long l = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11163 register int n = 0, f = 0, m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11164 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11165 #if !defined(WITH_LEANER) && defined(HAVE_WCTOMB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11166 char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11167 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11168 char buf[8];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11169 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11170 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11171 if (soap->peeked && *soap->tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11172 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11173 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11174 struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11175 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11176 t = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11177 *t = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11178 strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11179 t[sizeof(soap->tmpbuf) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11180 t += strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11181 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11182 { if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11183 { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11184 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11185 *t++ = ' ';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11186 strcpy(t, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11187 t += strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11188 if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11189 break; /* too many or large attribute values */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11190 if (tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11191 { *t++ = '=';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11192 *t++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11193 strcpy(t, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11194 t += strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11195 *t++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11196 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11197 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11198 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11199 if (!soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11200 *t++ = '/';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11201 *t++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11202 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11203 t = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11204 m = (int)strlen(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11205 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11206 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11207 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11208 f = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11209 soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11210 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11211 #ifdef WITH_CDATA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11212 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11213 { register int state = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11214 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11215 soap->labidx = 0; /* use look-aside buffer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11216 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11217 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11218 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11219 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11220 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11221 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11222 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11223 register size_t k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11224 if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11225 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11226 s = soap->labbuf + soap->labidx; /* space to populate */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11227 k = soap->lablen - soap->labidx; /* number of bytes available */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11228 soap->labidx = soap->lablen; /* claim this space */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11229 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11230 register size_t k = SOAP_BLKLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11231 if (!(s = (char*)soap_push_block(soap, NULL, k)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11232 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11233 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11234 for (i = 0; i < k; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11235 { if (m > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11236 { *s++ = *t++; /* copy multibyte characters */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11237 m--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11238 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11239 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11240 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11241 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11242 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11243 if ((c >= 0x80 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11244 { if ((c & 0x7FFFFFFF) >= 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11245 { soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11246 c = soap_getutf8(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11247 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11248 if ((c & 0x7FFFFFFF) >= 0x80 && (!flag || (soap->mode & SOAP_C_UTFSTRING)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11249 { c &= 0x7FFFFFFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11250 t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11251 if (c < 0x0800)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11252 *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11253 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11254 { if (c < 0x010000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11255 *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11256 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11257 { if (c < 0x200000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11258 *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11259 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11260 { if (c < 0x04000000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11261 *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11262 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11263 { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11264 *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11265 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11266 *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11267 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11268 *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11269 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11270 *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11271 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11272 *t++ = (char)(0x80 | (c & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11273 m = (int)(t - buf) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11274 t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11275 *s++ = *t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11276 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11277 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11278 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11279 switch (state)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11280 { case 1:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11281 if (c == ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11282 state = 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11283 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11284 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11285 case 2:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11286 if (c == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11287 state = 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11288 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11289 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11290 case 3:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11291 if (c == '?')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11292 state = 8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11293 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11294 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11295 /* CDATA */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11296 case 4:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11297 if (c == ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11298 state = 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11299 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11300 state = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11301 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11302 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11303 case 5:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11304 if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11305 state = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11306 else if (c != ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11307 state = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11308 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11309 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11310 /* comment */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11311 case 6:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11312 if (c == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11313 state = 7;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11314 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11315 state = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11316 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11317 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11318 case 7:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11319 if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11320 state = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11321 else if (c != '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11322 state = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11323 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11324 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11325 /* PI */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11326 case 8:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11327 if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11328 state = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11329 else if (c != '?')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11330 state = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11331 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11332 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11334 switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11335 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11336 case SOAP_TT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11337 if (n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11338 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11339 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11340 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11341 t = (char*)"/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11342 m = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11343 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11344 case SOAP_LT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11345 if (f && n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11346 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11347 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11348 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11349 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11350 case SOAP_GT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11351 *s++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11352 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11353 case SOAP_QT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11354 *s++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11355 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11356 case SOAP_AP:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11357 *s++ = '\'';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11358 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11359 case '/':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11360 if (n > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11361 { c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11362 if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11363 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11364 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11365 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11366 *s++ = '/';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11367 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11368 case '<':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11369 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11370 if (c == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11371 { if (n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11372 { c = SOAP_TT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11373 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11374 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11375 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11376 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11377 else if (c == '!')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11378 { c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11379 if (c == '[')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11380 { do c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11381 while ((int)c != EOF && c != '[');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11382 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11383 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11384 t = (char*)"![CDATA[";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11385 m = 8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11386 state = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11387 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11388 else if (c == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11389 { if ((c = soap_getchar(soap)) == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11390 state = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11391 t = (char*)"!-";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11392 m = 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11393 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11394 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11395 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11396 { t = (char*)"!";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11397 m = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11398 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11400 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11401 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11402 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11403 else if (c == '?')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11404 state = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11405 else if (f && n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11406 { soap_revget1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11407 c = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11408 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11409 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11410 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11411 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11412 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11413 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11414 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11415 case '>':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11416 *s++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11417 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11418 case '"':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11419 *s++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11420 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11421 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11422 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11423 #ifdef HAVE_WCTOMB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11424 if (soap->mode & SOAP_C_MBSTRING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11425 { m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11426 if (m >= 1 && m <= (int)MB_CUR_MAX)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11427 { t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11428 *s++ = *t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11429 m--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11430 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11431 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11432 { *s++ = SOAP_UNKNOWN_CHAR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11433 m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11434 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11435 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11436 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11437 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11438 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11439 *s++ = (char)(c & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11440 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11441 l++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11442 if (maxlen >= 0 && l > maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11443 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11444 soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11445 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11446 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11447 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11448 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11449 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11450 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11451 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11452 soap->labidx = 0; /* use look-aside buffer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11453 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11454 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11455 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11456 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11457 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11458 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11459 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11460 register size_t k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11461 if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11462 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11463 s = soap->labbuf + soap->labidx; /* space to populate */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11464 k = soap->lablen - soap->labidx; /* number of bytes available */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11465 soap->labidx = soap->lablen; /* claim this space */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11466 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11467 register size_t k = SOAP_BLKLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11468 if (!(s = (char*)soap_push_block(soap, NULL, k)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11469 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11470 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11471 for (i = 0; i < k; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11472 { if (m > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11473 { *s++ = *t++; /* copy multibyte characters */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11474 m--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11475 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11477 #ifndef WITH_CDATA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11478 if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11479 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11480 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11481 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11482 if ((soap->mode & SOAP_C_UTFSTRING))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11483 { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11484 { c &= 0x7FFFFFFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11485 t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11486 if (c < 0x0800)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11487 *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11488 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11489 { if (c < 0x010000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11490 *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11491 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11492 { if (c < 0x200000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11493 *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11494 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11495 { if (c < 0x04000000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11496 *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11497 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11498 { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11499 *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11500 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11501 *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11503 *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11504 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11505 *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11507 *t++ = (char)(0x80 | (c & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11508 m = (int)(t - buf) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11509 t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11510 *s++ = *t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11511 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11512 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11513 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11514 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11515 c = soap_getutf8(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11516 switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11517 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11518 case SOAP_TT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11519 if (n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11520 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11521 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11522 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11523 t = (char*)"/";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11524 m = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11525 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11526 case SOAP_LT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11527 if (f && n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11528 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11529 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11530 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11531 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11532 case SOAP_GT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11533 *s++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11534 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11535 case SOAP_QT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11536 *s++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11537 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11538 case SOAP_AP:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11539 *s++ = '\'';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11540 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11541 case '/':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11542 if (n > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11543 { if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11544 { c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11545 if (c == '>')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11546 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11547 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11548 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11549 { c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11550 if (c == SOAP_GT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11551 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11552 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11553 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11554 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11555 *s++ = '/';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11556 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11557 case (soap_wchar)('<' | 0x80000000):
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11558 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11559 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11560 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11561 { *s++ = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11562 t = (char*)"lt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11563 m = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11564 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11565 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11566 case (soap_wchar)('>' | 0x80000000):
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11567 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11568 *s++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11569 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11570 { *s++ = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11571 t = (char*)"gt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11572 m = 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11573 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11574 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11575 case (soap_wchar)('&' | 0x80000000):
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11576 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11577 *s++ = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11578 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11579 { *s++ = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11580 t = (char*)"amp;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11581 m = 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11583 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11584 case (soap_wchar)('"' | 0x80000000):
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11585 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11586 *s++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11587 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11588 { *s++ = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11589 t = (char*)"quot;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11590 m = 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11591 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11592 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11593 case (soap_wchar)('\'' | 0x80000000):
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11594 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11595 *s++ = '\'';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11596 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11597 { *s++ = '&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11598 t = (char*)"apos;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11599 m = 5;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11600 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11601 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11602 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11603 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11604 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11605 #ifndef WITH_CDATA
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11606 if (c == '<' && !flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11607 { if (f && n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11608 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11609 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11610 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11611 if (c == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11612 { c = SOAP_TT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11613 if (n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11614 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11615 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11616 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11617 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11618 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11619 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11620 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11621 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11622 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11623 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11624 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11625 #ifdef HAVE_WCTOMB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11626 if (soap->mode & SOAP_C_MBSTRING)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11627 { m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11628 if (m >= 1 && m <= (int)MB_CUR_MAX)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11629 { t = buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11630 *s++ = *t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11631 m--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11632 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11633 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11634 { *s++ = SOAP_UNKNOWN_CHAR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11635 m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11636 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11637 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11638 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11639 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11640 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11641 *s++ = (char)(c & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11642 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11643 l++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11644 if (maxlen >= 0 && l > maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11645 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11646 soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11647 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11648 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11649 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11650 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11651 end:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11652 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11653 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11654 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11655 t = soap_strdup(soap, soap->labbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11656 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11657 soap_size_block(soap, NULL, i + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11658 t = soap_save_block(soap, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11659 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11660 if (l < minlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11661 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11662 soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11663 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11664 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11665 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11666 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11667 { if (flag == 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11668 soap->dom->tail = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11669 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11670 soap->dom->data = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11671 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11672 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11673 if (flag == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11674 if (soap_s2QName(soap, t, &t, minlen, maxlen))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11675 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11676 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11677 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11678 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11679
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11680 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11681 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11682 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11683 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11684 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11685 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11686 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11687 { const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11688 char tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11689 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11690 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11691 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11692 { wchar_t *r = (wchar_t*)s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11693 int n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11694 while (*r++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11695 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11696 soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11697 while (n--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11698 *r++ = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11699 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11700 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11701 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11702 while ((c = *s++))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11703 { switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11704 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11705 case 0x09:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11706 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11707 t = "&#x9;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11708 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11709 t = "\t";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11710 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11711 case 0x0A:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11712 if (flag || !(soap->mode & SOAP_XML_CANONICAL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11713 t = "&#xA;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11714 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11715 t = "\n";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11716 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11717 case 0x0D:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11718 t = "&#xD;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11719 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11720 case '&':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11721 t = "&amp;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11722 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11723 case '<':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11724 t = "&lt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11725 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11726 case '>':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11727 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11728 t = ">";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11729 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11730 t = "&gt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11731 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11732 case '"':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11733 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11734 t = "&quot;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11735 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11736 t = "\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11737 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11738 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11739 if (c >= 0x20 && c < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11740 { tmp = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11741 if (soap_send_raw(soap, &tmp, 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11742 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11743 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11744 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11745 { /* check for UTF16 encoding when wchar_t is too small to hold UCS */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11746 if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11747 { register soap_wchar d = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11748 if ((d & 0xFC00) == 0xDC00)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11749 c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11750 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11751 c = 0xFFFD; /* Malformed */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11753 if (soap_pututf8(soap, (unsigned long)c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11754 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11755 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11756 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11757 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11758 if (soap_send(soap, t))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11759 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11760 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11761 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11762 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11763 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11764 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11765
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11766 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11767 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11768 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11769 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11770 wchar_t *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11771 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11772 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11773 { wchar_t *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11774 register int i, n = 0, f = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11775 register long l = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11776 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11777 char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11778 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11779 if (soap->peeked)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11780 { if (*soap->tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11781 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11782 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11783 struct soap_attribute *tp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11784 t = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11785 *t = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11786 strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11787 t[sizeof(soap->tmpbuf) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11788 t += strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11789 for (tp = soap->attributes; tp; tp = tp->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11790 { if (tp->visible)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11791 { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11792 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11793 *t++ = ' ';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11794 strcpy(t, tp->name);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11795 t += strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11796 if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11797 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11798 if (tp->value)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11799 { *t++ = '=';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11800 *t++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11801 strcpy(t, tp->value);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11802 t += strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11803 *t++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11804 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11805 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11806 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11807 if (!soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11808 *t++ = '/';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11809 *t++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11810 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11811 t = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11812 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11813 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11814 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11815 f = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11816 soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11817 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11818 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11819 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11820 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11821 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11822 { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11823 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11824 for (i = 0; i < SOAP_BLKLEN; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11825 { if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11826 { *s++ = (wchar_t)*t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11827 if (!*t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11828 t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11829 continue;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11830 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11831 c = soap_getutf8(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11832 switch (c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11833 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11834 case SOAP_TT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11835 if (n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11836 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11837 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11838 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11839 soap_unget(soap, '/');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11840 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11841 case SOAP_LT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11842 if (f && n == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11843 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11844 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11845 *s++ = '<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11846 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11847 case SOAP_GT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11848 *s++ = '>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11849 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11850 case SOAP_QT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11851 *s++ = '"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11852 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11853 case SOAP_AP:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11854 *s++ = '\'';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11855 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11856 case '/':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11857 if (n > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11858 { c = soap_getutf8(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11859 if (c == SOAP_GT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11860 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11861 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11862 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11863 *s++ = '/';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11864 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11865 case '<':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11866 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11867 *s++ = (soap_wchar)'<';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11868 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11869 { *s++ = (soap_wchar)'&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11870 t = (char*)"lt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11872 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11873 case '>':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11874 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11875 *s++ = (soap_wchar)'>';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11876 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11877 { *s++ = (soap_wchar)'&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11878 t = (char*)"gt;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11879 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11880 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11881 case '"':
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11882 if (flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11883 *s++ = (soap_wchar)'"';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11884 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11885 { *s++ = (soap_wchar)'&';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11886 t = (char*)"quot;";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11887 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11888 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11889 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11890 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11891 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11892 /* use UTF16 encoding when wchar_t is too small to hold UCS */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11893 if (sizeof(wchar_t) < 4 && c > 0xFFFF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11894 { register soap_wchar c1, c2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11895 c1 = 0xD800 - (0x10000 >> 10) + (c >> 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11896 c2 = 0xDC00 + (c & 0x3FF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11897 c = c1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11898 soap_unget(soap, c2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11899 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11900 *s++ = (wchar_t)c & 0x7FFFFFFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11901 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11902 l++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11903 if (maxlen >= 0 && l > maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11904 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11905 soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11906 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11907 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11908 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11909 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11910 end:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11911 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11912 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11913 soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11914 if (l < minlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11915 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11916 soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11917 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11918 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11919 s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11920 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11921 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11922 soap->dom->wide = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11923 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11924 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11925 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11926 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11927 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11928
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11929 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11930 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11931 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11932 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11933 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11934 soap_int2s(struct soap *soap, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11935 { return soap_long2s(soap, (long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11936 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11937 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11938
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11939 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11940 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11941 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11942 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11943 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11944 soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11945 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11946 || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11947 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11948 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11949 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11950 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11951
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11952 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11953 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11954 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11955 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11956 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11957 soap_s2int(struct soap *soap, const char *s, int *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11958 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11959 { long n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11960 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11961 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11962 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11963 soap_reset_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11964 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11965 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11966 n = soap_strtol(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11967 if (s == r || *r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11968 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11969 || n != (int)n
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11970 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11971 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11972 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11973 || soap_errno == SOAP_ERANGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11974 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11975 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11976 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11977 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11978 *p = (int)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11980 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11982 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11983
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11984 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11985 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11986 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11987 int *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11988 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11989 soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11990 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11991 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11992 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11993 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11994 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11995 && soap_match_tag(soap, soap->type, ":int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11996 && soap_match_tag(soap, soap->type, ":short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11997 && soap_match_tag(soap, soap->type, ":byte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11998 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
11999 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12000 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12001 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12002 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12003 p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12004 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12005 p = (int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(int), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12006 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12007 { if (soap_s2int(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12008 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12009 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12010 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12011 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12012 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12013 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12014 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12015
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12016 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12017 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12018 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12019 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12020 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12021 soap_long2s(struct soap *soap, long n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12022 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12023 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12024 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%ld", n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12025 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12026 sprintf(soap->tmpbuf, "%ld", n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12027 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12028 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12029 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12030 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12031
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12032 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12033 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12034 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12035 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12036 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12037 soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12038 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12039 || soap_string_out(soap, soap_long2s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12040 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12041 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12042 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12043 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12044
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12045 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12046 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12047 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12048 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12049 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12050 soap_s2long(struct soap *soap, const char *s, long *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12051 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12052 { char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12053 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12054 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12055 soap_reset_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12056 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12057 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12058 *p = soap_strtol(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12059 if (s == r || *r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12060 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12061 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12062 || soap_errno == SOAP_ERANGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12063 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12064 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12065 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12066 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12067 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12068 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12069 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12070 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12071
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12072 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12073 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12074 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12075 long *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12076 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12077 soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12078 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12079 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12080 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12081 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12082 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12083 && soap_match_tag(soap, soap->type, ":int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12084 && soap_match_tag(soap, soap->type, ":short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12085 && soap_match_tag(soap, soap->type, ":byte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12086 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12087 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12088 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12089 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12090 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12091 p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12092 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12093 p = (long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12094 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12095 { if (soap_s2long(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12096 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12097 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12098 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12099 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12100 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12101 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12102 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12103
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12104 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12105 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12106 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12107 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12108 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12109 soap_LONG642s(struct soap *soap, LONG64 n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12110 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12111 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12112 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), SOAP_LONG_FORMAT, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12113 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12114 sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12115 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12116 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12117 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12118 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12119
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12120 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12121 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12122 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12123 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12124 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12125 soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12126 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12127 || soap_string_out(soap, soap_LONG642s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12128 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12129 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12130 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12131 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12132
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12133 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12134 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12135 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12136 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12137 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12138 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12139 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12140 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12141 #ifdef HAVE_STRTOLL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12142 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12143 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12144 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12145 soap_reset_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12146 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12147 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12148 *p = soap_strtoll(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12149 if (s == r || *r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12150 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12151 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12152 || soap_errno == SOAP_ERANGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12153 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12154 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12155 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12156 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12157 # ifdef HAVE_SSCANF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12158 if (sscanf(s, SOAP_LONG_FORMAT, p) != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12159 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12160 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12161 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12162 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12163 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12164 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12165 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12166
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12167 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12168 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12169 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12170 LONG64 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12171 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12172 soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12173 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12174 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12175 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12176 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12177 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12178 && soap_match_tag(soap, soap->type, ":integer")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12179 && soap_match_tag(soap, soap->type, ":positiveInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12180 && soap_match_tag(soap, soap->type, ":negativeInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12181 && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12182 && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12183 && soap_match_tag(soap, soap->type, ":long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12184 && soap_match_tag(soap, soap->type, ":int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12185 && soap_match_tag(soap, soap->type, ":short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12186 && soap_match_tag(soap, soap->type, ":byte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12187 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12188 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12189 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12190 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12191 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12192 p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12193 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12194 p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(LONG64), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12195 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12196 { if (soap_s2LONG64(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12197 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12198 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12199 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12200 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12201 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12202 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12203 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12204
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12205 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12206 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12207 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12208 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12209 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12210 soap_byte2s(struct soap *soap, char n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12211 { return soap_long2s(soap, (long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12212 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12213 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12214
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12215 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12216 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12217 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12218 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12219 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12220 soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12221 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12222 || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12223 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12224 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12225 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12226 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12227
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12228 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12229 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12230 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12231 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12232 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12233 soap_s2byte(struct soap *soap, const char *s, char *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12234 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12235 { long n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12236 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12237 n = soap_strtol(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12238 if (s == r || *r || n < -128 || n > 127)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12239 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12240 *p = (char)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12241 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12242 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12243 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12244 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12245
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12246 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12247 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12248 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12249 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12250 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12251 soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12252 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12253 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12254 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12255 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12256 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12257 && soap_match_tag(soap, soap->type, ":byte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12258 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12259 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12260 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12261 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12262 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12263 p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12264 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12265 p = (char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(char), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12266 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12267 { if (soap_s2byte(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12268 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12269 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12270 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12271 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12272 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12273 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12274 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12275
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12276 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12277 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12278 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12279 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12280 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12281 soap_short2s(struct soap *soap, short n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12282 { return soap_long2s(soap, (long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12284 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12285
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12286 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12287 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12288 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12289 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12290 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12291 soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12292 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12293 || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12294 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12295 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12296 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12297 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12298
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12299 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12300 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12301 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12302 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12303 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12304 soap_s2short(struct soap *soap, const char *s, short *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12305 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12306 { long n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12307 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12308 n = soap_strtol(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12309 if (s == r || *r || n < -32768 || n > 32767)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12310 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12311 *p = (short)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12312 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12313 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12314 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12315 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12316
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12317 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12318 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12319 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12320 short *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12321 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12322 soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12323 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12324 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12325 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12326 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12327 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12328 && soap_match_tag(soap, soap->type, ":short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12329 && soap_match_tag(soap, soap->type, ":byte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12330 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12331 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12332 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12334 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12335 p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12336 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12337 p = (short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(short), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12338 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12339 { if (soap_s2short(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12340 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12341 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12342 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12343 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12344 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12345 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12346 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12347
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12348 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12349 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12350 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12351 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12352 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12353 soap_float2s(struct soap *soap, float n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12354 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12355 if (soap_isnan((double)n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12356 return "NaN";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12357 if (soap_ispinff(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12358 return "INF";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12359 if (soap_isninff(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12360 return "-INF";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12361 #if defined(HAVE_SPRINTF_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12362 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12363 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, soap->c_locale, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12364 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12365 sprintf_l(soap->tmpbuf, soap->c_locale, soap->float_format, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12366 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12367 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12368 # ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12369 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), soap->float_format, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12370 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12371 sprintf(soap->tmpbuf, soap->float_format, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12372 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12373 s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12374 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12375 *s = '.';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12376 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12377 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12378 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12379 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12380
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12381 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12382 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12383 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12384 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12385 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12386 soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12387 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12388 || soap_string_out(soap, soap_float2s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12389 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12390 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12391 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12392 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12393
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12394 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12395 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12396 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12397 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12398 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12399 soap_s2float(struct soap *soap, const char *s, float *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12400 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12401 { if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12402 return soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12403 if (!soap_tag_cmp(s, "INF"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12404 *p = FLT_PINFTY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12405 else if (!soap_tag_cmp(s, "+INF"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12406 *p = FLT_PINFTY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12407 else if (!soap_tag_cmp(s, "-INF"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12408 *p = FLT_NINFTY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12409 else if (!soap_tag_cmp(s, "NaN"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12410 *p = FLT_NAN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12411 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12412 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12413 /* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12414 #if defined(HAVE_STRTOD_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12415 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12416 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12417 *p = (float)_strtod_l(s, &r, soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12418 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12419 *p = (float)strtod_l(s, &r, soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12420 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12421 if (*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12422 #elif defined(HAVE_STRTOD)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12423 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12424 *p = (float)strtod(s, &r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12425 if (*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12426 #elif defined(HAVE_STRTOF_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12427 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12428 *p = strtof_l((char*)s, &r, soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12429 if (*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12430 #elif defined(HAVE_STRTOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12431 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12432 *p = strtof((char*)s, &r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12433 if (*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12434 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12435 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12436 #if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12437 if (sscanf_l(s, soap->c_locale, "%f", p) != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12438 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12439 #elif defined(HAVE_SSCANF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12440 if (sscanf(s, "%f", p) != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12441 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12442 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12443 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12444 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12446 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12447 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12448 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12449 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12450 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12451
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12452 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12453 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12454 static int soap_isnumeric(struct soap *soap, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12455 { if (soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12456 && soap_match_tag(soap, soap->type, ":float")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12457 && soap_match_tag(soap, soap->type, ":double")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12458 && soap_match_tag(soap, soap->type, ":decimal")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12459 && soap_match_tag(soap, soap->type, ":integer")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12460 && soap_match_tag(soap, soap->type, ":positiveInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12461 && soap_match_tag(soap, soap->type, ":negativeInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12462 && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12463 && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12464 && soap_match_tag(soap, soap->type, ":long")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12465 && soap_match_tag(soap, soap->type, ":int")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12466 && soap_match_tag(soap, soap->type, ":short")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12467 && soap_match_tag(soap, soap->type, ":byte")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12468 && soap_match_tag(soap, soap->type, ":unsignedLong")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12469 && soap_match_tag(soap, soap->type, ":unsignedInt")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12470 && soap_match_tag(soap, soap->type, ":unsignedShort")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12471 && soap_match_tag(soap, soap->type, ":unsignedByte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12472 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12473 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12474 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12475 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12476 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12477 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12478 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12479
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12480 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12481 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12482 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12483 float *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12484 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12485 soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12486 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12487 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12488 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12489 if (*soap->type != '\0' && soap_isnumeric(soap, type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12490 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12491 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12492 p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12493 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12494 p = (float*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(float), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12495 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12496 { if (soap_s2float(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12497 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12498 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12499 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12500 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12501 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12503 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12504
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12505 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12506 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12507 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12508 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12509 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12510 soap_double2s(struct soap *soap, double n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12511 { char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12512 if (soap_isnan(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12513 return "NaN";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12514 if (soap_ispinfd(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12515 return "INF";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12516 if (soap_isninfd(n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12517 return "-INF";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12518 #if defined(HAVE_SPRINTF_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12519 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12520 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, soap->c_locale, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12521 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12522 sprintf_l(soap->tmpbuf, soap->c_locale, soap->double_format, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12523 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12524 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12525 # ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12526 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), soap->double_format, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12527 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12528 sprintf(soap->tmpbuf, soap->double_format, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12529 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12530 s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12531 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12532 *s = '.';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12533 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12534 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12535 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12536 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12537
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12538 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12539 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12540 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12541 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12542 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12543 soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12544 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12545 || soap_string_out(soap, soap_double2s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12546 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12547 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12548 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12549 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12550
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12551 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12552 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12553 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12554 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12555 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12556 soap_s2double(struct soap *soap, const char *s, double *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12557 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12558 { if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12559 return soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12560 if (!soap_tag_cmp(s, "INF"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12561 *p = DBL_PINFTY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12562 else if (!soap_tag_cmp(s, "+INF"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12563 *p = DBL_PINFTY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12564 else if (!soap_tag_cmp(s, "-INF"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12565 *p = DBL_NINFTY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12566 else if (!soap_tag_cmp(s, "NaN"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12567 *p = DBL_NAN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12568 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12569 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12570 #if defined(HAVE_STRTOD_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12571 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12572 # ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12573 *p = _strtod_l(s, &r, soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12574 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12575 *p = strtod_l(s, &r, soap->c_locale);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12576 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12577 if (*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12578 #elif defined(HAVE_STRTOD)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12579 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12580 *p = strtod(s, &r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12581 if (*r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12582 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12583 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12584 #if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12585 if (sscanf_l(s, soap->c_locale, "%lf", p) != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12586 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12587 #elif defined(HAVE_SSCANF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12588 if (sscanf(s, "%lf", p) != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12589 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12590 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12591 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12592 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12593 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12594 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12595 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12596 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12597 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12598 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12599
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12600 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12601 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12602 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12603 double *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12604 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12605 soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12606 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12607 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12608 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12609 if (*soap->type != '\0' && soap_isnumeric(soap, type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12610 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12611 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12612 p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12613 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12614 p = (double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(double), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12615 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12616 { if (soap_s2double(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12617 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12618 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12619 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12620 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12621 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12622 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12623 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12624
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12625 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12626 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12627 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12628 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12629 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12630 soap_unsignedByte2s(struct soap *soap, unsigned char n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12631 { return soap_unsignedLong2s(soap, (unsigned long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12632 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12633 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12634
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12635 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12636 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12637 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12638 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12639 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12640 soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12641 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12642 || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12643 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12644 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12645 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12646 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12647
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12648 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12649 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12650 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12651 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12652 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12653 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12654 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12655 { unsigned long n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12656 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12657 n = soap_strtoul(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12658 if (s == r || *r || n > 255)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12659 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12660 *p = (unsigned char)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12662 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12663 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12664 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12665
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12666 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12667 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12668 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12669 unsigned char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12670 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12671 soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12672 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12673 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12674 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12675 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12676 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12677 && soap_match_tag(soap, soap->type, ":unsignedByte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12678 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12679 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12680 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12681 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12682 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12683 p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12684 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12685 p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned char), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12686 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12687 { if (soap_s2unsignedByte(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12688 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12690 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12691 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12692 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12693 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12694 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12695
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12696 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12697 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12698 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12699 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12700 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12701 soap_unsignedShort2s(struct soap *soap, unsigned short n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12702 { return soap_unsignedLong2s(soap, (unsigned long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12703 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12704 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12705
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12706 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12707 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12708 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12709 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12710 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12711 soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12712 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12713 || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12714 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12715 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12716 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12717 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12718
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12719 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12720 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12721 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12722 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12723 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12724 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12725 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12726 { unsigned long n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12727 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12728 n = soap_strtoul(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12729 if (s == r || *r || n > 65535)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12730 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12731 *p = (unsigned short)n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12732 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12733 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12734 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12735 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12736
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12737 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12738 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12739 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12740 unsigned short *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12741 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12742 soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12743 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12744 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12745 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12746 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12747 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12748 && soap_match_tag(soap, soap->type, ":unsignedShort")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12749 && soap_match_tag(soap, soap->type, ":unsignedByte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12750 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12751 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12752 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12753 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12754 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12755 p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12756 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12757 p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned short), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12758 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12759 { if (soap_s2unsignedShort(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12760 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12761 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12762 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12763 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12764 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12766 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12767
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12768 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12769 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12770 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12771 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12772 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12773 soap_unsignedInt2s(struct soap *soap, unsigned int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12774 { return soap_unsignedLong2s(soap, (unsigned long)n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12775 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12776 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12777
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12778 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12779 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12780 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12781 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12782 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12783 soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12784 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12785 || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12786 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12787 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12788 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12789 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12790
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12791 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12792 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12793 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12794 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12795 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12796 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12797 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12798 { char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12799 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12800 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12801 soap_reset_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12802 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12803 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12804 *p = (unsigned int)soap_strtoul(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12805 if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12806 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12807 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12808 || soap_errno == SOAP_ERANGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12809 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12810 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12811 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12812 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12813 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12814 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12815 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12816 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12817
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12818 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12819 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12820 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12821 unsigned int *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12822 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12823 soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12824 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12825 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12826 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12827 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12828 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12829 && soap_match_tag(soap, soap->type, ":unsignedInt")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12830 && soap_match_tag(soap, soap->type, ":unsignedShort")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12831 && soap_match_tag(soap, soap->type, ":unsignedByte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12832 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12833 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12834 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12835 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12836 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12837 p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12838 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12839 p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned int), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12840 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12841 { if (soap_s2unsignedInt(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12842 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12843 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12844 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12845 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12846 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12847 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12848 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12849
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12850 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12851 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12852 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12853 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12854 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12855 soap_unsignedLong2s(struct soap *soap, unsigned long n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12856 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12857 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12858 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%lu", n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12859 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12860 sprintf(soap->tmpbuf, "%lu", n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12861 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12862 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12863 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12864 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12865
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12866 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12867 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12868 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12869 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12870 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12871 soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12872 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12873 || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12874 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12875 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12876 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12877 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12878
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12879 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12880 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12881 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12882 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12883 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12884 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12885 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12886 { char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12887 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12888 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12889 soap_reset_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12890 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12891 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12892 *p = soap_strtoul(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12893 if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12894 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12895 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12896 || soap_errno == SOAP_ERANGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12897 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12898 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12899 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12900 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12901 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12902 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12903 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12904 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12905
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12906 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12907 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12908 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12909 unsigned long *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12910 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12911 soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12912 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12913 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12914 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12915 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12916 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12917 && soap_match_tag(soap, soap->type, ":unsignedInt")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12918 && soap_match_tag(soap, soap->type, ":unsignedShort")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12919 && soap_match_tag(soap, soap->type, ":unsignedByte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12920 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12921 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12922 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12923 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12924 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12925 p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12926 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12927 p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned long), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12928 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12929 { if (soap_s2unsignedLong(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12930 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12931 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12932 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12933 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12934 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12935 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12936 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12937
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12938 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12939 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12940 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12941 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12942 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12943 soap_ULONG642s(struct soap *soap, ULONG64 n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12944 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12945 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12946 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), SOAP_ULONG_FORMAT, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12947 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12948 sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12949 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12950 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12951 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12952 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12953
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12954 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12955 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12956 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12957 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12958 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12959 soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12960 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12961 || soap_string_out(soap, soap_ULONG642s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12962 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12963 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12964 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12965 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12966
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12967 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12968 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12969 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12970 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12971 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12972 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12973 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12974 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12975 #ifdef HAVE_STRTOULL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12976 char *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12977 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12978 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12979 soap_reset_errno;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12980 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12981 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12982 *p = soap_strtoull(s, &r, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12983 if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12984 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12985 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12986 || soap_errno == SOAP_ERANGE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12987 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12988 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12989 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12990 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12991 #ifdef HAVE_SSCANF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12992 if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12993 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12994 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12995 soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12996 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12997 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12998 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
12999 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13000
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13001 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13002 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13003 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13004 ULONG64 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13005 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13006 soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13007 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13008 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13009 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13010 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13011 && soap_match_tag(soap, soap->type, ":positiveInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13012 && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13013 && soap_match_tag(soap, soap->type, ":unsignedLong")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13014 && soap_match_tag(soap, soap->type, ":unsignedInt")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13015 && soap_match_tag(soap, soap->type, ":unsignedShort")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13016 && soap_match_tag(soap, soap->type, ":unsignedByte"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13017 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13018 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13019 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13020 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13021 p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13022 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13023 p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(ULONG64), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13024 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13025 { if (soap_s2ULONG64(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13026 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13027 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13028 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13029 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13030 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13031 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13032 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13033
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13034 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13035 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13036 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13037 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13038 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13039 soap_s2string(struct soap *soap, const char *s, char **t, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13040 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13041 { long l = (long)strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13042 if ((maxlen >= 0 && l > maxlen) || l < minlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13043 return soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13044 if (!(*t = soap_strdup(soap, s)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13045 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13046 if (!(soap->mode & (SOAP_ENC_LATIN | SOAP_C_UTFSTRING)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13047 { char *r = *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13048 /* remove non-ASCII chars */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13049 for (s = *t; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13050 if (!(*s & 0x80))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13051 *r++ = *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13052 *r = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13053 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13054 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13055 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13056 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13057 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13058
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13059 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13060 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13061 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13062 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13063 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13064 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13065 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13066 { long l = (long)strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13067 if ((maxlen >= 0 && l > maxlen) || l < minlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13068 return soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13069 soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13070 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13071 /* convert (by prefix normalize prefix) all QNames in s */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13072 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13073 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13074 struct soap_nlist *np;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13075 register const char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13076 /* skip blanks */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13077 while (*s && soap_blank((soap_wchar)*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13078 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13079 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13080 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13081 /* find next QName */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13082 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13083 while (s[n] && !soap_blank((soap_wchar)s[n]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13084 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13085 np = soap->nlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13086 /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13087 if (!np || *s == '#' || !strncmp(s, "xml:", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13088 { soap_append_lab(soap, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13089 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13090 else /* we normalize the QName by replacing its prefix */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13091 { const char *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13092 for (p = s; *p && p < s + n; p++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13093 if (*p == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13094 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13095 if (*p == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13096 { size_t k = p - s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13097 while (np && (strncmp(np->id, s, k) || np->id[k]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13098 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13099 p++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13100 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13101 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13102 { while (np && *np->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13103 np = np->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13104 p = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13105 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13106 /* replace prefix */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13107 if (np)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13108 { if (np->index >= 0 && soap->local_namespaces && (q = soap->local_namespaces[np->index].id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13109 { size_t k = strlen(q);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13110 if (q[k-1] != '_')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13111 soap_append_lab(soap, q, k);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13112 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13113 { soap_append_lab(soap, "\"", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13114 soap_append_lab(soap, soap->local_namespaces[np->index].ns, strlen(soap->local_namespaces[np->index].ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13115 soap_append_lab(soap, "\"", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13116 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13117 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13118 else if (np->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13119 { soap_append_lab(soap, "\"", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13120 soap_append_lab(soap, np->ns, strlen(np->ns));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13121 soap_append_lab(soap, "\"", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13122 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13123 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13124 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nNamespace prefix of '%s' not defined (index=%d, URI='%s')\n", s, np->index, np->ns ? np->ns : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13125 return soap->error = SOAP_NAMESPACE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13126 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13127 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13128 else if (s[n]) /* no namespace, part of string */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13129 { soap_append_lab(soap, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13130 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13131 else /* no namespace: assume "" namespace */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13132 { soap_append_lab(soap, "\"\"", 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13134 soap_append_lab(soap, ":", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13135 soap_append_lab(soap, p, n - (p-s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13136 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13137 /* advance to next and add spacing */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13138 s += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13139 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13140 soap_append_lab(soap, " ", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13141 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13142 soap_append_lab(soap, SOAP_STR_EOS, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13143 *t = soap_strdup(soap, soap->labbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13144 DBGLOG(TEST, SOAP_MESSAGE(fdebug, " into '%s'\n", *t));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13145 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13146 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13147 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13148 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13149
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13150 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13151 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13152 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13153 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13154 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13155 soap_QName2s(struct soap *soap, const char *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13156 { const char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13157 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13158 { soap->labidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13159 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13160 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13161 /* skip blanks */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13162 while (*s && soap_blank((soap_wchar)*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13163 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13164 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13165 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13166 /* find next QName */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13167 n = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13168 while (s[n] && !soap_blank((soap_wchar)s[n]))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13169 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13170 /* normal prefix: pass string as is */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13171 if (*s != '"')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13172 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13173 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13174 if ((soap->mode & SOAP_XML_CANONICAL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13175 soap_utilize_ns(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13176 if ((soap->mode & SOAP_XML_DEFAULTNS))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13177 { const char *r = strchr(s, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13178 if (r && soap->nlist && !strncmp(soap->nlist->id, s, r-s) && !soap->nlist->id[r-s])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13179 { n -= r-s + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13180 s = r + 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13181 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13182 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13183 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13184 soap_append_lab(soap, s, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13185 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13186 else /* URL-based string prefix */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13187 { const char *q;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13188 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13189 q = strchr(s, '"');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13190 if (q)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13191 { struct Namespace *p = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13192 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13193 { for (; p->id; p++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13194 { if (p->ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13195 if (!soap_tag_cmp(s, p->ns))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13196 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13197 if (p->in)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13198 if (!soap_tag_cmp(s, p->in))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13199 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13200 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13201 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13202 /* URL is in the namespace table? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13203 if (p && p->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13204 { const char *r = p->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13205 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13206 if ((soap->mode & SOAP_XML_DEFAULTNS) && soap->nlist && !strcmp(soap->nlist->id, r))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13207 q++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13208 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13209 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13210 soap_append_lab(soap, r, strlen(r));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13211 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13212 else /* not in namespace table: create xmlns binding */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13213 { char *r = soap_strdup(soap, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13214 r[q-s] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13215 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13216 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns:_%d", soap->idnum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13217 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13218 sprintf(soap->tmpbuf, "xmlns:_%d", soap->idnum++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13219 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13220 soap_set_attr(soap, soap->tmpbuf, r, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13221 soap_append_lab(soap, soap->tmpbuf + 6, strlen(soap->tmpbuf + 6));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13222 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13223 soap_append_lab(soap, q + 1, n - (q-s) - 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13224 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13225 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13226 /* advance to next and add spacing */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13227 s += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13228 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13229 soap_append_lab(soap, " ", 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13230 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13231 soap_append_lab(soap, SOAP_STR_EOS, 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13232 t = soap_strdup(soap, soap->labbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13233 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13234 return t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13235 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13236 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13237
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13238 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13239 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13240 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13241 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13242 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13243 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13244 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13245 { long l;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13246 wchar_t *r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13247 *t = r = (wchar_t*)soap_malloc(soap, sizeof(wchar_t) * (strlen(s) + 1));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13248 if (!r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13249 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13250 if (soap->mode & SOAP_ENC_LATIN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13251 { while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13252 *r++ = (wchar_t)*s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13253 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13254 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13255 { /* Convert UTF8 to wchar */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13256 while (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13257 { register soap_wchar c, c1, c2, c3, c4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13258 c = (unsigned char)*s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13259 if (c < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13260 *r++ = (wchar_t)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13261 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13262 { c1 = (soap_wchar)*s++ & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13263 if (c < 0xE0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13264 *r++ = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13265 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13266 { c2 = (soap_wchar)*s++ & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13267 if (c < 0xF0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13268 *r++ = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13269 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13270 { c3 = (soap_wchar)*s++ & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13271 if (c < 0xF8)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13272 *r++ = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13273 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13274 { c4 = (soap_wchar)*s++ & 0x3F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13275 if (c < 0xFC)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13276 *r++ = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13277 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13278 *r++ = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13281 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13282 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13283 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13284 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13285 *r = L'\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13286 l = (long)(r - *t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13287 if ((maxlen >= 0 && l > maxlen) || l < minlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13288 return soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13289 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13290 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13291 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13292 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13293
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13294 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13295 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13296 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13297 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13298 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13299 soap_wchar2s(struct soap *soap, const wchar_t *s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13300 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13301 register char *r, *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13302 const wchar_t *q = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13303 size_t n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13304 while ((c = *q++))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13305 { if (c > 0 && c < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13306 n++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13307 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13308 n += 6;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13309 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13310 r = t = (char*)soap_malloc(soap, n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13311 if (r)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13312 { /* Convert wchar to UTF8 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13313 while ((c = *s++))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13314 { if (c > 0 && c < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13315 *t++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13316 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13317 { if (c < 0x0800)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13318 *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13319 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13320 { if (c < 0x010000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13321 *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13322 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13323 { if (c < 0x200000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13324 *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13325 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13326 { if (c < 0x04000000)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13327 *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13328 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13329 { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13330 *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13331 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13332 *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13334 *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13335 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13336 *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13337 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13338 *t++ = (char)(0x80 | (c & 0x3F));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13339 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13340 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13341 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13342 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13343 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13344 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13345 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13346
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13347 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13348 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13349 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13350 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13351 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13352 soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13353 { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13354 if (id < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13355 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13356 if (!**p && (soap->mode & SOAP_C_NILSTRING))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13357 return soap_element_null(soap, tag, id, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13358 if (soap_element_begin_out(soap, tag, id, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13359 || soap_string_out(soap, *p, 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13360 || soap_element_end_out(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13361 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13362 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13363 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13364 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13365
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13366 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13367 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13368 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13369 char **
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13370 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13371 soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13372 { (void)type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13373 if (soap_element_begin_in(soap, tag, 1, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13374 { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13375 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13376 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13377 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13378 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13379 { if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13380 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13381 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13382 if (soap->null)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13383 *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13384 else if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13385 { *p = soap_string_in(soap, flag, minlen, maxlen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13386 if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13387 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13388 if (!**p && tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13389 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13390 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13391 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13392 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13393 else if (tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13394 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13395 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13396 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13397 else if (!*soap->href && minlen > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13398 { soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13399 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13400 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13401 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13402 *p = soap_strdup(soap, SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13403 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13404 p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13405 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13406 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13407 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13408 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13409 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13410
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13411 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13412 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13413 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13414 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13415 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13416 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13417 soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13418 { id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13419 if (id < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13420 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13421 if (!**p && (soap->mode & SOAP_C_NILSTRING))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13422 return soap_element_null(soap, tag, id, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13423 if (soap_element_begin_out(soap, tag, id, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13424 || soap_wstring_out(soap, *p, 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13425 || soap_element_end_out(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13426 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13427 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13428 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13429 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13430 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13431
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13432 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13433 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13434 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13435 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13436 wchar_t **
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13437 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13438 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13439 { (void)type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13440 if (soap_element_begin_in(soap, tag, 1, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13441 { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13442 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13443 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13444 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13445 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13446 { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13447 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13448 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13449 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13450 { *p = soap_wstring_in(soap, 1, minlen, maxlen);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13451 if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13452 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13453 if (!**p && tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13454 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13455 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13456 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13458 else if (tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13459 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13460 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13461 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13462 else if (soap->null)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13463 *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13464 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13465 *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13466 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13467 p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13468 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13469 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13470 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13471 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13472 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13473 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13474
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13475 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13476 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13477 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13478 time_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13479 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13480 soap_timegm(struct tm *T)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13481 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13482 #if defined(HAVE_TIMEGM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13483 return timegm(T);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13484 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13485 time_t t, g, z;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13486 struct tm tm;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13487 t = mktime(T);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13488 if (t == (time_t)-1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13489 return (time_t)-1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13490 #ifdef HAVE_GMTIME_R
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13491 gmtime_r(&t, &tm);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13492 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13493 tm = *gmtime(&t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13494 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13495 tm.tm_isdst = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13496 g = mktime(&tm);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13497 if (g == (time_t)-1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13498 return (time_t)-1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13499 z = g - t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13500 return t - z;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13501 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13503 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13504
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13505 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13506 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13507 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13508 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13509 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13510 soap_dateTime2s(struct soap *soap, time_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13511 { struct tm T, *pT = &T;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13512 #if defined(HAVE_GMTIME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13513 if (gmtime_r(&n, pT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13514 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13515 #elif defined(HAVE_GMTIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13516 if ((pT = gmtime(&n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13517 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13518 #elif defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13519 #if defined(HAVE_LOCALTIME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13520 if (localtime_r(&n, pT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13521 { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13522 memmove(soap->tmpbuf + 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13523 soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13524 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13525 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13526 if ((pT = localtime(&n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13527 { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13528 memmove(soap->tmpbuf + 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13529 soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13530 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13531 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13532 #elif defined(HAVE_GETTIMEOFDAY)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13533 struct timezone tz;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13534 memset((void*)&tz, 0, sizeof(tz));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13535 #if defined(HAVE_LOCALTIME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13536 if (localtime_r(&n, pT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13537 { struct timeval tv;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13538 gettimeofday(&tv, &tz);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13539 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13540 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13541 soap_snprintf(soap->tmpbuf + strlen(soap->tmpbuf), sizeof(soap->tmpbuf) - strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13542 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13543 sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13544 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13546 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13547 if ((pT = localtime(&n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13548 { struct timeval tv;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13549 gettimeofday(&tv, &tz);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13550 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13551 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13552 soap_snprintf(soap->tmpbuf + strlen(soap->tmpbuf), sizeof(soap->tmpbuf) - strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13553 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13554 sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13555 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13556 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13557 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13558 #elif defined(HAVE_FTIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13559 struct timeb t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13560 memset((void*)&t, 0, sizeof(t));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13561 #if defined(HAVE_LOCALTIME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13562 if (localtime_r(&n, pT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13563 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13564 #ifdef __BORLANDC__
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13565 ::ftime(&t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13566 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13567 ftime(&t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13568 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13569 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13570 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13571 soap_snprintf(soap->tmpbuf + strlen(soap->tmpbuf), sizeof(soap->tmpbuf) - strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13572 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13573 sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13574 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13576 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13577 if ((pT = localtime(&n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13578 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13579 #ifdef __BORLANDC__
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13580 ::ftime(&t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13581 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13582 ftime(&t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13583 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13584 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13585 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13586 soap_snprintf(soap->tmpbuf + strlen(soap->tmpbuf), sizeof(soap->tmpbuf) - strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13587 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13588 sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13589 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13590 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13591 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13592 #elif defined(HAVE_LOCALTIME_R)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13593 if (localtime_r(&n, pT))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13594 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13595 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13596 if ((pT = localtime(&n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13597 strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13598 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13599 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13600 strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13601 return soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13602 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13603 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13604
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13605 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13606 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13607 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13608 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13609 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13610 soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13611 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13612 || soap_string_out(soap, soap_dateTime2s(soap, *p), 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13613 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13614 return soap_element_end_out(soap, tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13615 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13616 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13617
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13618 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13619 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13620 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13621 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13622 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13623 soap_s2dateTime(struct soap *soap, const char *s, time_t *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13624 { if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13625 { char zone[32];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13626 struct tm T;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13627 const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13628 *zone = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13629 memset((void*)&T, 0, sizeof(T));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13630 if (strchr(s, '-'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13631 t = "%d-%d-%dT%d:%d:%d%31s";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13632 else if (strchr(s, ':'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13633 t = "%4d%2d%2dT%d:%d:%d%31s";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13634 else /* parse non-XSD-standard alternative ISO 8601 format */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13635 t = "%4d%2d%2dT%2d%2d%2d%31s";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13636 if (sscanf(s, t, &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone) < 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13637 return soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13638 if (T.tm_year == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13639 T.tm_year = 70;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13640 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13641 T.tm_year -= 1900;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13642 T.tm_mon--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13643 if (*zone == '.')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13644 { for (s = zone + 1; *s; s++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13645 if (*s < '0' || *s > '9')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13646 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13647 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13648 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13649 s = zone;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13650 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13651 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13652 #ifndef WITH_NOZONE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13653 if (*s == '+' || *s == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13654 { int h = 0, m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13655 if (s[3] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13656 { /* +hh:mm */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13657 sscanf(s, "%d:%d", &h, &m);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13658 if (h < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13659 m = -m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13661 else /* +hhmm */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13662 { m = (int)soap_strtol(s, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13663 h = m / 100;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13664 m = m % 100;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13665 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13666 T.tm_min -= m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13667 T.tm_hour -= h;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13668 /* put hour and min in range */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13669 T.tm_hour += T.tm_min / 60;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13670 T.tm_min %= 60;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13671 if (T.tm_min < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13672 { T.tm_min += 60;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13673 T.tm_hour--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13674 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13675 T.tm_mday += T.tm_hour / 24;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13676 T.tm_hour %= 24;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13677 if (T.tm_hour < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13678 { T.tm_hour += 24;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13679 T.tm_mday--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13680 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13681 /* note: day of the month may be out of range, timegm() handles it */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13682 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13683 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13684 *p = soap_timegm(&T);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13685 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13686 else /* no UTC or timezone, so assume we got a localtime */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13687 { T.tm_isdst = -1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13688 *p = mktime(&T);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13689 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13690 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13691 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13692 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13693 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13694
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13695 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13696 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13697 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13698 time_t *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13699 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13700 soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13701 { if (soap_element_begin_in(soap, tag, 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13702 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13703 if (*soap->type
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13704 && soap_match_tag(soap, soap->type, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13705 && soap_match_tag(soap, soap->type, ":dateTime"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13706 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13707 soap_revert(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13708 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13709 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13710 p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13711 if (*soap->href)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13712 p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(time_t), 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13713 else if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13714 { if (soap_s2dateTime(soap, soap_value(soap), p))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13715 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13716 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13717 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13718 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13719 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13720 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13721 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13722
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13723 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13724 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13725 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13726 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13727 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13728 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13729 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13730 const char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13731 if (tag && *tag != '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13732 { if (soap->local_namespaces && (t = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13733 { size_t n = t - tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13734 if (n >= sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13735 n = sizeof(soap->tmpbuf) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13736 strncpy(soap->tmpbuf, tag, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13737 soap->tmpbuf[n] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13738 for (i = 0; soap->local_namespaces[i].id; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13739 if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13740 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13741 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13742 if (soap_element(soap, t, 0, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13743 || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13744 || soap_element_start_end_out(soap, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13745 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13746 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13747 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13748 { t = tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13749 if (soap_element_begin_out(soap, t, 0, type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13750 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13751 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13752 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13753 if (p && *p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13754 { if (soap_send(soap, *p)) /* send as-is */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13755 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13756 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13757 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13758 return soap_element_end_out(soap, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13759 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13760 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13761 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13762
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13763 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13764 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13765 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13766 char **
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13767 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13768 soap_inliteral(struct soap *soap, const char *tag, char **p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13769 { if (soap_element_begin_in(soap, tag, 1, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13770 { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13771 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13772 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13773 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13774 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13775 { if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13776 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13777 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13778 if (soap->body || (tag && *tag == '-'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13779 { *p = soap_string_in(soap, 0, -1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13780 if (!*p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13781 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13782 if (!**p && tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13783 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13784 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13785 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13786 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13787 else if (soap->null)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13788 *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13789 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13790 *p = soap_strdup(soap, SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13791 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13792 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13793 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13795 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13796
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13797 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13798 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13799 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13800 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13801 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13802 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13803 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13804 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13805 const char *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13806 if (tag && *tag != '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13807 { if (soap->local_namespaces && (t = strchr(tag, ':')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13808 { size_t n = t - tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13809 if (n >= sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13810 n = sizeof(soap->tmpbuf) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13811 strncpy(soap->tmpbuf, tag, n);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13812 soap->tmpbuf[n] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13813 for (i = 0; soap->local_namespaces[i].id; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13814 if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13815 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13816 t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13817 if (soap_element(soap, t, 0, type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13818 || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13819 || soap_element_start_end_out(soap, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13820 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13821 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13822 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13823 { t = tag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13824 if (soap_element_begin_out(soap, t, 0, type))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13825 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13826 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13827 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13828 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13829 { wchar_t c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13830 const wchar_t *s = *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13831 while ((c = *s++))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13832 { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13833 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13834 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13835 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13836 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13837 return soap_element_end_out(soap, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13838 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13839 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13840 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13841 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13842
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13843 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13844 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13845 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13846 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13847 wchar_t **
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13848 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13849 soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13850 { if (soap_element_begin_in(soap, tag, 1, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13851 { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13852 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13853 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13854 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13855 if (!p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13856 { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13857 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13858 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13859 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13860 { *p = soap_wstring_in(soap, 0, -1, -1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13861 if (!*p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13862 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13863 if (!**p && tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13864 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13865 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13866 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13867 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13868 else if (tag && *tag == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13869 { soap->error = SOAP_NO_TAG;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13870 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13871 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13872 else if (soap->null)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13873 *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13874 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13875 *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13876 if (soap->body && soap_element_end_in(soap, tag))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13877 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13878 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13879 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13880 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13881 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13882
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13883 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13884 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13885 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13886 const char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13887 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13888 soap_value(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13889 { register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13890 register soap_wchar c = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13891 register char *s = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13892 if (!soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13893 return SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13894 do c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13895 while (soap_blank(c));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13896 for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13897 { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13898 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13899 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13900 c = soap_get(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13901 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13902 for (s--; i > 0; i--, s--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13903 { if (!soap_blank((soap_wchar)*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13904 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13905 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13906 s[1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13907 soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13908 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13909 if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13910 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13911 else if (soap->mode & SOAP_XML_STRICT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13912 { soap->error = SOAP_LENGTH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13913 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13914 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13915 #ifdef WITH_DOM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13916 if ((soap->mode & SOAP_XML_DOM) && soap->dom)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13917 soap->dom->data = soap_strdup(soap, soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13918 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13919 return soap->tmpbuf; /* return non-null pointer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13921 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13922
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13923 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13924 #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13925 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13926 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13927 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13928 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13929 soap_getline(struct soap *soap, char *s, int len)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13930 { int i = len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13931 soap_wchar c = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13932 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13933 { while (--i > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13934 { c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13935 if (c == '\r' || c == '\n')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13936 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13937 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13938 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13939 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13940 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13941 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13942 if (c != '\n')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13943 c = soap_getchar(soap); /* got \r or something else, now get \n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13944 if (c == '\n')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13945 { if (i + 1 == len) /* empty line: end of HTTP/MIME header */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13946 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13947 c = soap_get0(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13948 if (c != ' ' && c != '\t') /* HTTP line continuation? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13949 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13950 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13951 else if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13952 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13953 if (i <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13954 return soap->error = SOAP_HDR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13955 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13956 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13957 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13958 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13959 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13960
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13961 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13962 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13963 static size_t
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13964 soap_count_attachments(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13965 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13966 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13967 register struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13968 register size_t count = soap->count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13969 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13970 if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13971 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13972 for (content = soap->dime.first; content; content = content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13973 { count += 12 + ((content->size+3)&(~3));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13974 if (content->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13975 count += ((strlen(content->id)+3)&(~3));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13976 if (content->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13977 count += ((strlen(content->type)+3)&(~3));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13978 if (content->options)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13979 count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13980 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13981 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13982 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13983 if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13984 { register size_t n = strlen(soap->mime.boundary);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13985 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13986 for (content = soap->mime.first; content; content = content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13987 { register const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13988 /* count \r\n--boundary\r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13989 count += 6 + n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13990 /* count Content-Type: ...\r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13991 if (content->type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13992 count += 16 + strlen(content->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13993 /* count Content-Transfer-Encoding: ...\r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13994 s = soap_code_str(mime_codes, content->encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13995 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13996 count += 29 + strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13997 /* count Content-ID: ...\r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13998 if (content->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
13999 count += 14 + strlen(content->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14000 /* count Content-Location: ...\r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14001 if (content->location)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14002 count += 20 + strlen(content->location);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14003 /* count Content-Description: ...\r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14004 if (content->description)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14005 count += 23 + strlen(content->description);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14006 /* count \r\n...content */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14007 count += 2 + content->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14008 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14009 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14010 /* count \r\n--boundary-- */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14011 count += 6 + n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14012 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14013 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count=%lu\n", (unsigned long)count));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14014 return count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14015 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14016 return soap->count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14017 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14019 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14020
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14021 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14022 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14023 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14024 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14025 soap_putdimefield(struct soap *soap, const char *s, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14026 { if (soap_send_raw(soap, s, n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14027 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14028 return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14029 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14030 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14031 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14032
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14033 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14034 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14035 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14036 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14037 char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14038 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14039 soap_dime_option(struct soap *soap, unsigned short optype, const char *option)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14040 { size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14041 char *s = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14042 if (option)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14043 { n = strlen(option);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14044 s = (char*)soap_malloc(soap, n + 5);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14045 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14046 { s[0] = (char)(optype >> 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14047 s[1] = (char)(optype & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14048 s[2] = (char)(n >> 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14049 s[3] = (char)(n & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14050 strcpy(s + 4, option);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14051 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14052 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14053 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14054 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14055 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14056 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14057
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14058 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14059 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14060 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14061 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14062 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14063 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14064 soap_putdimehdr(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14065 { unsigned char tmp[12];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14066 size_t optlen = 0, idlen = 0, typelen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14067 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14068 if (soap->dime.options)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14069 optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14070 if (soap->dime.id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14071 { idlen = strlen(soap->dime.id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14072 if (idlen > 0x0000FFFF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14073 idlen = 0x0000FFFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14074 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14075 if (soap->dime.type)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14076 { typelen = strlen(soap->dime.type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14077 if (typelen > 0x0000FFFF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14078 typelen = 0x0000FFFF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14079 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14080 tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14081 tmp[1] = soap->dime.flags & 0xF0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14082 tmp[2] = (char)(optlen >> 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14083 tmp[3] = (char)(optlen & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14084 tmp[4] = (char)(idlen >> 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14085 tmp[5] = (char)(idlen & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14086 tmp[6] = (char)(typelen >> 8);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14087 tmp[7] = (char)(typelen & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14088 tmp[8] = (char)(soap->dime.size >> 24);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14089 tmp[9] = (char)((soap->dime.size >> 16) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14090 tmp[10] = (char)((soap->dime.size >> 8) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14091 tmp[11] = (char)(soap->dime.size & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14092 if (soap_send_raw(soap, (char*)tmp, 12)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14093 || soap_putdimefield(soap, soap->dime.options, optlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14094 || soap_putdimefield(soap, soap->dime.id, idlen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14095 || soap_putdimefield(soap, soap->dime.type, typelen))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14096 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14097 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14098 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14099 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14100 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14101
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14102 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14103 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14104 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14105 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14106 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14107 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14108 soap_putdime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14109 { struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14110 if (!(soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14111 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14112 for (content = soap->dime.first; content; content = content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14113 { void *handle;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14114 soap->dime.size = content->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14115 soap->dime.id = content->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14116 soap->dime.type = content->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14117 soap->dime.options = content->options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14118 soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14119 if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14120 { size_t size = content->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14121 if (!handle)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14122 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14123 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14124 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14125 if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14126 { size_t chunksize = sizeof(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14127 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14128 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14129 { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14130 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14131 if (size < chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14132 { soap->dime.flags &= ~SOAP_DIME_CF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14133 if (!content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14134 soap->dime.flags |= SOAP_DIME_ME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14135 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14136 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14137 soap->dime.flags |= SOAP_DIME_CF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14138 soap->dime.size = size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14139 if (soap_putdimehdr(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14140 || soap_putdimefield(soap, soap->tmpbuf, size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14141 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14142 if (soap->dime.id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14143 { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14144 soap->dime.id = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14145 soap->dime.type = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14146 soap->dime.options = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14147 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14148 } while (size >= chunksize);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14149 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14150 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14151 { if (!content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14152 soap->dime.flags |= SOAP_DIME_ME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14153 if (soap_putdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14154 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14155 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14156 { size_t bufsize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14157 if (size < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14158 bufsize = size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14159 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14160 bufsize = sizeof(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14161 if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14162 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14163 soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14164 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14165 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14166 if (soap_send_raw(soap, soap->tmpbuf, bufsize))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14167 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14168 size -= bufsize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14169 } while (size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14170 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14171 soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14172 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14173 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14174 if (soap->fdimereadclose)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14175 soap->fdimereadclose(soap, handle);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14176 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14177 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14178 { if (!content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14179 soap->dime.flags |= SOAP_DIME_ME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14180 if (soap_putdimehdr(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14181 || soap_putdimefield(soap, (char*)content->ptr, content->size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14182 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14183 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14184 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14185 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14186 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14187 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14188 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14189
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14190 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14191 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14192 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14193 static char *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14194 soap_getdimefield(struct soap *soap, size_t n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14195 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14196 register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14197 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14198 register char *p = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14199 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14200 { p = (char*)soap_malloc(soap, n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14201 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14202 { s = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14203 for (i = n; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14204 { if ((int)(c = soap_get1(soap)) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14205 { soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14206 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14207 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14208 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14209 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14210 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14211 if ((soap->error = soap_move(soap, (size_t)(-(long)n&3))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14212 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14213 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14214 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14215 soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14216 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14217 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14218 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14219 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14220 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14221
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14222 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14223 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14224 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14225 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14226 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14227 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14228 soap_getdimehdr(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14229 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14230 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14231 register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14232 unsigned char tmp[12];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14233 size_t optlen, idlen, typelen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14234 if (!(soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14235 return soap->error = SOAP_DIME_END;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14236 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14237 if (soap->dime.buflen || soap->dime.chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14238 { if (soap_move(soap, soap->dime.size - soap_tell(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14239 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14240 soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14241 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14242 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14243 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14244 s = (char*)tmp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14245 for (i = 12; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14246 { if ((int)(c = soap_getchar(soap)) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14247 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14248 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14249 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14250 if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14251 return soap->error = SOAP_DIME_MISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14252 soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14253 optlen = (tmp[2] << 8) | tmp[3];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14254 idlen = (tmp[4] << 8) | tmp[5];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14255 typelen = (tmp[6] << 8) | tmp[7];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14256 soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14257 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14258 if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14259 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14260 if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14261 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14262 if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14263 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14264 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id='%s', type='%s', options='%s'\n", soap->dime.id ? soap->dime.id : SOAP_STR_EOS, soap->dime.type ? soap->dime.type : "", soap->dime.options ? soap->dime.options+4 : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14265 if (soap->dime.flags & SOAP_DIME_ME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14266 soap->mode &= ~SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14267 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14268 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14269 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14270 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14271
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14272 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14273 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14274 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14275 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14276 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14277 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14278 soap_getdime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14279 { while (soap->dime.flags & SOAP_DIME_CF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14280 { if (soap_getdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14281 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14282 if (soap_move(soap, soap->dime.size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14283 return soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14284 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14285 if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14286 return soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14287 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14288 { register struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14289 if (soap_getdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14290 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14291 if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14292 { const char *id, *type, *options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14293 size_t size, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14294 if (!soap->dime.ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14295 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14296 id = soap->dime.id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14297 type = soap->dime.type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14298 options = soap->dime.options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14299 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14300 { size = soap->dime.size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14301 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14302 { n = soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14303 if (size < n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14304 n = size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14305 if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14306 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14307 size -= n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14308 if (!size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14309 { soap->bufidx += n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14310 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14312 if (soap_recv(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14313 { soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14314 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14315 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14317 if (soap_move(soap, (size_t)(-(long)soap->dime.size&3)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14318 { soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14319 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14320 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14321 if (!(soap->dime.flags & SOAP_DIME_CF))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14322 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14323 if (soap_getdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14324 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14325 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14326 end:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14327 if (soap->fdimewriteclose)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14328 soap->fdimewriteclose(soap, (void*)soap->dime.ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14329 soap->dime.size = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14330 soap->dime.id = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14331 soap->dime.type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14332 soap->dime.options = options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14333 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14334 else if (soap->dime.flags & SOAP_DIME_CF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14335 { const char *id, *type, *options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14336 id = soap->dime.id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14337 type = soap->dime.type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14338 options = soap->dime.options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14339 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14340 return SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14341 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14342 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14343 register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14344 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14345 if (soap->dime.size > SOAP_MAXDIMESIZE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14346 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14347 return soap->error = SOAP_DIME_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14348 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14349 s = (char*)soap_push_block(soap, NULL, soap->dime.size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14350 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14351 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14352 for (i = soap->dime.size; i > 0; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14353 { if ((int)(c = soap_get1(soap)) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14354 return soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14355 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14356 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14357 if (soap_move(soap, (size_t)(-(long)soap->dime.size&3)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14358 return soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14359 if (!(soap->dime.flags & SOAP_DIME_CF))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14360 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14361 if (soap_getdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14362 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14363 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14364 soap->dime.size = soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14365 if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14366 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14367 soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14368 soap->dime.id = id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14369 soap->dime.type = type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14370 soap->dime.options = options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14371 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14372 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14373 soap->dime.ptr = soap_getdimefield(soap, soap->dime.size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14374 content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14375 if (!content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14376 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14377 content->id = soap->dime.id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14378 content->type = soap->dime.type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14379 content->options = soap->dime.options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14380 if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14381 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14382 soap_resolve_attachment(soap, content);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14383 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14384 if (soap->error != SOAP_DIME_END)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14385 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14386 return soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14387 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14388 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14389 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14390
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14391 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14392 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14393 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14394 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14395 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14396 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14397 soap_getmimehdr(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14398 { struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14399 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14400 { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14401 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14402 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14403 while (!*soap->msgbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14404 if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14405 { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14406 /* remove white space */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14407 while (soap_blank((soap_wchar)*s))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14408 s--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14409 s[1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14410 if (soap->mime.boundary)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14411 { if (strcmp(soap->msgbuf + 2, soap->mime.boundary))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14412 return soap->error = SOAP_MIME_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14413 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14414 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14415 soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14416 if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14417 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14418 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14419 if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14420 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14421 content = soap->mime.last;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14422 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14423 { register char *key = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14424 register char *val;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14425 if (!*key)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14426 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14427 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "MIME header: %s\n", key));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14428 val = strchr(soap->msgbuf, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14429 if (val)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14430 { *val = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14431 do val++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14432 while (*val && *val <= 32);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14433 if (!soap_tag_cmp(key, "Content-ID"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14434 content->id = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14435 else if (!soap_tag_cmp(key, "Content-Location"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14436 content->location = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14437 else if (!soap_tag_cmp(key, "Content-Disposition"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14438 content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14439 else if (!soap_tag_cmp(key, "Content-Type"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14440 content->type = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14441 else if (!soap_tag_cmp(key, "Content-Description"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14442 content->description = soap_strdup(soap, val);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14443 else if (!soap_tag_cmp(key, "Content-Transfer-Encoding"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14444 content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (long)SOAP_MIME_NONE);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14445 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14446 if (soap_getline(soap, key, sizeof(soap->msgbuf)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14447 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14448 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14449 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14450 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14451 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14452 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14453
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14454 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14455 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14456 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14457 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14458 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14459 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14460 soap_getmime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14461 { while (soap_get_mime_attachment(soap, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14462 ;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14463 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14464 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14465 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14466 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14467
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14468 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14469 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14470 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14471 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14472 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14473 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14474 soap_post_check_mime_attachments(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14475 { soap->imode |= SOAP_MIME_POSTCHECK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14476 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14477 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14478 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14479
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14480 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14481 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14482 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14483 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14484 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14485 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14486 soap_check_mime_attachments(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14487 { if (soap->mode & SOAP_MIME_POSTCHECK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14488 return soap_get_mime_attachment(soap, NULL) != NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14489 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14490 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14491 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14492 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14493
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14494 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14495 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14496 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14497 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14498 struct soap_multipart *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14499 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14500 soap_get_mime_attachment(struct soap *soap, void *handle)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14501 { register soap_wchar c = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14502 register size_t i, m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14503 register char *s, *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14504 register struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14505 register short flag = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14506 if (!(soap->mode & SOAP_ENC_MIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14507 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14508 content = soap->mime.last;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14509 if (!content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14510 { if (soap_getmimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14511 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14512 content = soap->mime.last;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14513 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14514 else if (content != soap->mime.first)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14515 { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14516 { if (!content->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14517 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14519 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14520 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id='%s' type='%s'\n", content->id ? content->id : SOAP_STR_EOS, content->type ? content->type : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14521 if (!content->ptr && soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14522 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14523 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14524 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14525 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14526 { if (content->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14527 s = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14528 else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14529 { soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14530 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14531 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14532 for (i = 0; i < sizeof(soap->tmpbuf); i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14533 { if (m > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14534 { *s++ = *t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14535 m--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14536 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14537 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14538 { if (!flag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14539 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14540 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14541 { if (content->ptr && soap->fmimewriteclose)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14542 soap->fmimewriteclose(soap, (void*)content->ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14543 soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14544 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14545 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14546 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14547 if (flag || c == '\r')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14548 { t = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14549 memset(t, 0, sizeof(soap->msgbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14550 strcpy(t, "\n--");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14551 if (soap->mime.boundary)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14552 strncat(t, soap->mime.boundary, sizeof(soap->msgbuf)-4);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14553 do c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14554 while (c == *t++);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14555 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14556 { if (content->ptr && soap->fmimewriteclose)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14557 soap->fmimewriteclose(soap, (void*)content->ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14558 soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14559 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14560 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14561 if (!*--t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14562 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14563 *t = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14564 flag = (c == '\r');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14565 m = t - soap->msgbuf + 1 - flag;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14566 t = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14567 c = '\r';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14568 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14569 *s++ = (char)c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14570 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14571 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14572 if (content->ptr && soap->fmimewrite)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14573 { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14574 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14575 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14577 end:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14578 *s = '\0'; /* make 0-terminated */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14579 if (content->ptr)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14580 { if (!soap->error && soap->fmimewrite)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14581 soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14582 if (soap->fmimewriteclose)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14583 soap->fmimewriteclose(soap, (void*)content->ptr);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14584 if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14585 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14586 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14587 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14588 { content->size = soap_size_block(soap, NULL, i+1) - 1; /* last block with '\0' */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14589 content->ptr = soap_save_block(soap, NULL, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14590 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14591 soap_resolve_attachment(soap, content);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14592 if (c == '-' && soap_getchar(soap) == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14593 { soap->mode &= ~SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14594 if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14595 { if (soap->keep_alive < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14596 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14597 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14598 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14599 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14600 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14601 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14602 { while (c != '\r' && (int)c != EOF && soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14603 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14604 if (c != '\r' || soap_getchar(soap) != '\n')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14605 { soap->error = SOAP_MIME_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14606 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14607 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14608 if (soap_getmimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14609 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14610 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14611 return content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14612 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14613 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14614 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14615
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14616 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14617 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14618 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14619 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14620 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14621 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14622 soap_match_cid(struct soap *soap, const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14623 { register size_t n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14624 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14625 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14626 if (!strcmp(s, t))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14627 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14628 if (!strncmp(s, "cid:", 4))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14629 s += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14630 n = strlen(t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14631 if (*t == '<')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14632 { t++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14633 n -= 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14634 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14635 if (!strncmp(s, t, n) && !s[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14636 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14637 soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14638 if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14639 return 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14640 return 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14641 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14642 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14643 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14644
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14645 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14646 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14647 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14648 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14649 soap_resolve_attachment(struct soap *soap, struct soap_multipart *content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14650 { if (content->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14651 { register struct soap_xlist **xp = &soap->xlist;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14652 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14653 while (*xp)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14654 { register struct soap_xlist *xq = *xp;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14655 if (!soap_match_cid(soap, xq->id, content->id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14656 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%s' for content id='%s'\n", xq->id, content->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14657 *xp = xq->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14658 *xq->ptr = (unsigned char*)content->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14659 *xq->size = (int)content->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14660 *xq->type = (char*)content->type;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14661 if (content->options)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14662 *xq->options = (char*)content->options;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14663 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14664 *xq->options = (char*)content->description;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14665 SOAP_FREE(soap, xq);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14666 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14667 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14668 xp = &(*xp)->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14669 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14670 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14671 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14672 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14673 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14674
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14675 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14676 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14677 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14678 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14679 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14680 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14681 soap_putmimehdr(struct soap *soap, struct soap_multipart *content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14682 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14683 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type='%s'\n", content->type ? content->type : SOAP_STR_EOS));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14684 if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14685 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14686 if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14687 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14688 s = soap_code_str(mime_codes, content->encoding);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14689 if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14690 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14691 if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14692 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14693 if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14694 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14695 if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14696 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14697 return soap_send_raw(soap, "\r\n", 2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14698 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14699 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14700 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14701
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14702 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14703 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14704 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14705 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14706 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14707 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14708 soap_putmime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14709 { struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14710 if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14711 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14712 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14713 for (content = soap->mime.first; content; content = content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14714 { void *handle;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14715 if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14716 { size_t size = content->size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14717 if (!handle)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14718 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14719 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14720 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14721 if (soap_putmimehdr(soap, content))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14722 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14723 if (!size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14724 { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14725 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14726 do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14727 { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14728 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14729 if (soap_send_raw(soap, soap->tmpbuf, size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14730 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14731 } while (size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14732 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14733 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14734 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14735 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14736 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14737 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14738 { do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14739 { size_t bufsize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14740 if (size < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14741 bufsize = size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14742 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14743 bufsize = sizeof(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14744 if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14745 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14746 soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14747 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14748 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14749 if (soap_send_raw(soap, soap->tmpbuf, bufsize))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14750 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14751 size -= bufsize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14752 } while (size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14753 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14754 if (soap->fmimereadclose)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14755 soap->fmimereadclose(soap, handle);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14756 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14757 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14758 { if (soap_putmimehdr(soap, content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14759 || soap_send_raw(soap, content->ptr, content->size))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14760 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14761 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14762 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14763 return soap_send3(soap, "\r\n--", soap->mime.boundary, "--");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14764 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14765 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14766 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14767
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14768 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14769 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14770 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14771 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14772 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14773 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14774 soap_set_dime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14775 { soap->omode |= SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14776 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14777 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14778 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14779 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14780 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14781
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14782 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14783 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14784 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14785 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14786 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14787 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14788 soap_set_mime(struct soap *soap, const char *boundary, const char *start)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14789 { soap->omode |= SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14790 soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14791 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14792 soap->mime.boundary = soap_strdup(soap, boundary);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14793 soap->mime.start = soap_strdup(soap, start);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14795 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14796 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14797
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14798 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14799 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14800 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14801 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14802 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14803 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14804 soap_clr_dime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14805 { soap->omode &= ~SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14806 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14807 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14808 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14809 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14810 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14811
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14812 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14813 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14814 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14815 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14816 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14817 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14818 soap_clr_mime(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14819 { soap->omode &= ~SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14820 soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14821 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14822 soap->mime.boundary = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14823 soap->mime.start = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14824 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14825 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14826 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14827
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14828 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14829 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14830 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14831 static struct soap_multipart*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14832 soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14833 { struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14834 content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14835 if (content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14836 { content->next = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14837 content->ptr = ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14838 content->size = size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14839 content->id = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14840 content->type = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14841 content->options = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14842 content->encoding = SOAP_MIME_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14843 content->location = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14844 content->description = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14845 if (!*first)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14846 *first = content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14847 if (*last)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14848 (*last)->next = content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14849 *last = content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14850 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14851 return content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14852 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14853 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14854 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14855
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14856 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14857 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14858 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14859 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14860 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14861 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14862 soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14863 { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14864 if (!content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14865 return SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14866 content->id = soap_strdup(soap, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14867 content->type = soap_strdup(soap, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14868 content->options = soap_dime_option(soap, optype, option);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14869 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14870 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14871 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14872 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14873
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14874 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14875 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14876 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14877 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14878 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14879 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14880 soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14881 { struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14882 if (!content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14883 return SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14884 content->id = soap_strdup(soap, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14885 content->type = soap_strdup(soap, type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14886 content->encoding = encoding;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14887 content->location = soap_strdup(soap, location);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14888 content->description = soap_strdup(soap, description);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14889 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14890 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14891 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14892 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14893
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14894 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14895 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14896 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14897 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14898 struct soap_multipart*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14899 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14900 soap_next_multipart(struct soap_multipart *content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14901 { if (content)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14902 return content->next;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14903 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14904 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14905 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14906 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14907
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14908 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14909 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14910 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14911 static void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14912 soap_select_mime_boundary(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14913 { while (!soap->mime.boundary || soap_valid_mime_boundary(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14914 { register char *s = soap->mime.boundary;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14915 register size_t n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14916 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14917 n = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14918 if (n < 16)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14919 { n = 64;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14920 s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14921 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14922 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14923 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14924 strcpy(s, "==");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14925 s += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14926 n -= 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14927 while (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14928 { *s++ = soap_base64o[soap_random & 0x3F];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14929 n--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14930 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14931 strcpy(s, "==");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14932 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14933 if (!soap->mime.start)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14934 soap->mime.start = "<SOAP-ENV:Envelope>";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14935 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14936 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14937 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14938
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14939 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14940 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14941 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14942 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14943 soap_valid_mime_boundary(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14944 { register struct soap_multipart *content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14945 register size_t k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14946 if (soap->fmimeread)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14947 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14948 k = strlen(soap->mime.boundary);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14949 for (content = soap->mime.first; content; content = content->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14950 { if (content->ptr && content->size >= k)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14951 { register const char *p = (const char*)content->ptr;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14952 register size_t i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14953 for (i = 0; i < content->size - k; i++, p++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14954 { if (!strncmp(p, soap->mime.boundary, k))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14955 return SOAP_ERR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14956 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14957 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14958 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14959 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14960 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14961 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14962 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14963
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14964 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14965 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14966 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14967 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14968 soap_getgziphdr(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14969 { int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14970 soap_wchar c = 0, f = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14971 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14972 for (i = 0; i < 9; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14973 { if ((int)(c = soap_get1(soap) == EOF))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14974 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14975 if (i == 1 && c == 8)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14976 soap->z_dict = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14977 if (i == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14978 f = c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14979 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14980 if (f & 0x04) /* FEXTRA */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14981 { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14982 { if ((int)soap_get1(soap) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14983 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14984 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14985 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14986 if (f & 0x08) /* skip FNAME */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14987 { do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14988 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14989 while (c && (int)c != EOF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14990 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14991 if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14992 { do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14993 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14994 while (c && (int)c != EOF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14995 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14996 if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14997 { if ((int)(c = soap_get1(soap)) != EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14998 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
14999 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15000 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15001 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15002 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15003 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15004 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15005 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15006
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15007 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15008 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15009 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15010 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15011 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15012 soap_begin_serve(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15013 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15014 #ifdef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15015 if (FCGI_Accept() < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15016 { soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15017 return soap_send_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15018 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15019 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15020 soap_begin(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15021 if (soap_begin_recv(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15022 || soap_envelope_begin_in(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15023 || soap_recv_header(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15024 || soap_body_begin_in(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15025 { if (soap->error < SOAP_STOP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15026 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15027 #ifdef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15028 soap_send_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15029 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15030 return soap_send_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15031 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15032 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15033 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15034 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15035 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15036 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15037 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15038
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15039 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15040 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15041 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15042 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15043 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15044 soap_begin_recv(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15045 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15046 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", soap->socket, soap->recvfd));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15047 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15048 soap->filterstop = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15049 soap_free_temp(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15050 soap_set_local_namespaces(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15051 soap->version = 0; /* don't assume we're parsing SOAP content by default */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15052 #ifndef WITH_NOIDREF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15053 soap_free_iht(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15054 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15055 if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15056 soap->omode |= SOAP_IO_CHUNK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15057 soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15058 soap->mode = soap->imode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15059 if (!soap->keep_alive)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15060 { soap->buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15061 soap->bufidx = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15062 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15063 if (!(soap->mode & SOAP_IO_KEEPALIVE))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15064 soap->keep_alive = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15065 soap->ahead = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15066 soap->peeked = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15067 soap->level = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15068 soap->part = SOAP_BEGIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15069 soap->alloced = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15070 soap->body = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15071 soap->count = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15072 soap->length = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15073 soap->cdata = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15074 *soap->endpoint = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15075 soap->action = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15076 soap->header = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15077 soap->fault = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15078 soap->status = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15079 soap->fform = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15080 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15081 soap->dom = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15082 soap->dime.chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15083 soap->dime.buflen = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15084 soap->dime.list = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15085 soap->dime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15086 soap->dime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15087 soap->mime.list = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15088 soap->mime.first = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15089 soap->mime.last = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15090 soap->mime.boundary = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15091 soap->mime.start = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15092 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15093 #ifdef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15094 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15095 #ifndef WITH_FASTCGI
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15096 if (!soap_valid_socket(soap->socket) && !soap->is) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15097 #ifdef __BORLANDC__
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15098 setmode(soap->recvfd, _O_BINARY);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15099 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15100 _setmode(soap->recvfd, _O_BINARY);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15101 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15102 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15103 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15104 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15105 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15106 soap->mode &= ~SOAP_ENC_ZLIB;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15107 soap->zlib_in = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15108 soap->zlib_out = SOAP_ZLIB_NONE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15109 soap->d_stream->next_in = Z_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15110 soap->d_stream->avail_in = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15111 soap->d_stream->next_out = (Byte*)soap->buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15112 soap->d_stream->avail_out = SOAP_BUFLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15113 soap->z_ratio_in = 1.0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15114 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15115 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15116 if (soap->ssl)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15117 ERR_clear_error();
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15118 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15119 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15120 if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15121 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15122 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15123 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15124 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15125 if (c == 0x1F)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15126 { if (soap_getgziphdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15127 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15128 if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15129 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15130 if (soap->z_dict)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15131 { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15132 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15133 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15134 soap->zlib_state = SOAP_ZLIB_INFLATE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15135 soap->mode |= SOAP_ENC_ZLIB;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15136 soap->zlib_in = SOAP_ZLIB_GZIP;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15137 soap->z_crc = crc32(0L, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15138 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15139 if (!soap->z_buf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15140 soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15141 memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15142 /* should not chunk over plain transport, so why bother to check? */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15143 /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15144 /* soap->z_buflen = soap->bufidx; */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15145 /* else */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15146 soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15147 soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15148 soap->z_buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15149 soap->buflen = soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15150 c = ' ';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15151 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15152 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15153 while (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15154 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15155 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15156 if (c == '-' && soap_get0(soap) == '-')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15157 soap->mode |= SOAP_ENC_MIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15158 else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15159 soap->mode |= SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15160 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15161 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15162 { /* skip BOM */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15163 if (c == 0xEF && soap_get0(soap) == 0xBB)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15164 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15165 if ((c = soap_get1(soap)) == 0xBF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15166 { soap->mode &= ~SOAP_ENC_LATIN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15167 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15168 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15169 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15170 c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15171 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15172 else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15173 || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15174 return soap->error = SOAP_UTF_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15175 /* skip space */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15176 while (soap_blank(c))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15177 c = soap_getchar(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15178 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15179 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15180 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15181 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15182 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15183 /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15184 if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_XML)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15185 { soap_mode m = soap->imode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15186 soap->mode &= ~SOAP_IO;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15187 soap->error = soap->fparse(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15188 if (soap->error && soap->error < SOAP_STOP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15189 { soap->keep_alive = 0; /* force close later */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15190 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15191 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15192 if (soap->error == SOAP_STOP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15193 { if (soap->fform)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15194 { soap->error = soap->fform(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15195 if (soap->error == SOAP_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15196 soap->error = SOAP_STOP; /* prevents further processing */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15197 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15198 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15199 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15200 soap->mode = soap->imode; /* if imode is changed, effectuate */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15201 soap->imode = m; /* restore imode */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15202 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15203 soap->mode &= ~SOAP_ENC_ZLIB;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15204 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15205 if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15206 { soap->chunkbuflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15207 soap->buflen = soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15208 soap->chunksize = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15209 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15210 /* Note: fparse should not use soap_unget to push back last char */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15211 #if 0
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15212 if (soap->status > 200 && soap->length == 0 && !(soap->http_content && (!soap->keep_alive || soap->recv_timeout)) && (soap->imode & SOAP_IO) != SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15213 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15214 if (soap->status && !soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15215 return soap->error = soap->status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15216 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15217 if (soap->zlib_in != SOAP_ZLIB_NONE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15218 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15219 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15220 if (soap->zlib_in != SOAP_ZLIB_DEFLATE)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15221 { c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15222 if (c == (int)EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15223 return soap->error = SOAP_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15224 if (c == 0x1F)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15225 { if (soap_getgziphdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15226 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15227 if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15228 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15229 soap->z_crc = crc32(0L, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15230 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15231 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15232 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15233 { soap_revget1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15234 if (inflateInit(soap->d_stream) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15235 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15236 soap->zlib_in = SOAP_ZLIB_DEFLATE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15237 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15238 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15239 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15240 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15241 if (inflateInit(soap->d_stream) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15242 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15243 if (soap->z_dict)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15244 { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != Z_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15245 return soap->error = SOAP_ZLIB_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15246 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15247 soap->zlib_state = SOAP_ZLIB_INFLATE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15248 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15249 soap->mode |= SOAP_ENC_ZLIB;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15250 if (!soap->z_buf)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15251 soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15252 memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15253 soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15254 soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15255 soap->z_buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15256 soap->buflen = soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15257 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15258 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15259 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15260 if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15261 { int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15262 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15263 if ((r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15264 return soap->error = r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15265 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15266 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15267 if (soap_get0(soap) == (int)EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15268 { if (soap->status == 0 || soap->status == 200)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15269 return soap->error = SOAP_NO_DATA; /* HTTP OK: always expect data */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15270 return soap->error = soap->status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15271 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15272 if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15273 { if (soap->error == SOAP_FORM && soap->fform)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15274 { soap->error = soap->fform(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15275 if (soap->error == SOAP_OK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15276 soap->error = SOAP_STOP; /* prevents further processing */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15277 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15278 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15279 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15280 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15281 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15282 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15283 if (soap->mode & SOAP_ENC_MIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15284 { do /* skip preamble */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15285 { if ((int)(c = soap_getchar(soap)) == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15286 return soap->error = SOAP_CHK_EOF;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15287 } while (c != '-' || soap_get0(soap) != '-');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15288 soap_unget(soap, c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15289 if (soap_getmimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15290 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15291 if (soap->mime.start)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15292 { do
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15293 { if (!soap->mime.last->id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15294 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15295 if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15296 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15297 } while (soap_get_mime_attachment(soap, NULL));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15298 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15299 if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15300 soap->mode |= SOAP_ENC_DIME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15301 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15302 if (soap->mode & SOAP_ENC_DIME)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15303 { if (soap_getdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15304 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15305 if (soap->dime.flags & SOAP_DIME_CF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15306 { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15307 soap->dime.chunksize = soap->dime.size;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15308 if (soap->buflen - soap->bufidx >= soap->dime.chunksize)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15309 { soap->dime.buflen = soap->buflen;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15310 soap->buflen = soap->bufidx + soap->dime.chunksize;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15311 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15312 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15313 soap->dime.chunksize -= soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15314 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15315 soap->count = soap->buflen - soap->bufidx;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15316 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15317 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15318 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15319 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15320 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15321
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15322 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15323 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15324 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15325 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15326 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15327 soap_envelope_begin_out(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15328 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15329 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15330 size_t n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15331 if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && strlen(soap->mime.boundary) + strlen(soap->mime.start) < sizeof(soap->tmpbuf) - 80 )
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15332 { const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15333 if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15334 s = "application/dime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15335 else if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15336 { if (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15337 s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15338 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15339 s = "application/soap+xml; charset=utf-8";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15340 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15341 else if (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15342 s = "application/xop+xml; charset=utf-8; type=\"text/xml\"";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15343 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15344 s = "text/xml; charset=utf-8";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15345 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15346 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15347 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15348 sprintf(soap->tmpbuf, "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15349 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15350 n = strlen(soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15351 if (soap_send_raw(soap, soap->tmpbuf, n))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15352 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15353 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15354 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15355 soap->dime.size = soap->count; /* DIME in MIME correction */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15356 if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15357 { if (soap_putdimehdr(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15358 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15359 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15360 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15361 if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15362 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15363 soap->part = SOAP_IN_ENVELOPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15364 return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15365 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15366 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15367
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15368 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15369 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15370 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15371 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15372 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15373 soap_envelope_end_out(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15374 { if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15375 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15376 if (soap_element_end_out(soap, "SOAP-ENV:Envelope")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15377 || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15378 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15379 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15380 if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15381 { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15382 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15383 soap_snprintf(soap->id, sizeof(soap->id), soap->dime_id_format, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15384 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15385 sprintf(soap->id, soap->dime_id_format, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15386 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15387 soap->dime.id = soap->id;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15388 if (soap->local_namespaces)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15389 { if (soap->local_namespaces[0].out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15390 soap->dime.type = (char*)soap->local_namespaces[0].out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15391 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15392 soap->dime.type = (char*)soap->local_namespaces[0].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15393 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15394 soap->dime.options = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15395 soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15396 if (!soap->dime.first)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15397 soap->dime.flags |= SOAP_DIME_ME;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15398 soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15399 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15400 if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15401 return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15402 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15403 soap->part = SOAP_END_ENVELOPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15404 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15405 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15406 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15407
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15408 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15409 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15410 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15411 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15412 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15413 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15414 soap_get_http_body(struct soap *soap, size_t *len)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15415 { if (len)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15416 *len = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15417 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15418 register size_t l = 0, n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15419 register char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15420 /* get HTTP body length */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15421 if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15422 { n = soap->length;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15423 if (!n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15424 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15425 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15426 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Parsing HTTP body (mode=0x%x,len=%lu)\n", soap->mode, (unsigned long)n));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15427 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15428 soap->labidx = 0; /* use look-aside buffer */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15429 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15430 if (soap_new_block(soap) == NULL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15431 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15432 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15433 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15434 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15435 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15436 register size_t i, k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15437 if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15438 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15439 s = soap->labbuf + soap->labidx; /* space to populate */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15440 k = soap->lablen - soap->labidx; /* number of bytes available */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15441 soap->labidx = soap->lablen; /* claim this space */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15442 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15443 register size_t i, k = SOAP_BLKLEN;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15444 if (!(s = (char*)soap_push_block(soap, NULL, k)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15445 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15446 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15447 for (i = 0; i < k; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15448 { register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15449 l++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15450 if (n > 0 && l > n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15451 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15452 c = soap_get1(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15453 if ((int)c == EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15454 goto end;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15455 *s++ = (char)(c & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15456 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15457 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15458 end:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15459 *s = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15460 if (len)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15461 *len = l - 1; /* len excludes terminating \0 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15462 #ifdef WITH_FAST
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15463 if ((s = (char*)soap_malloc(soap, l)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15464 memcpy(s, soap->labbuf, l);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15465 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15466 soap_size_block(soap, NULL, i+1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15467 s = soap_save_block(soap, NULL, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15468 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15469 return s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15470 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15471 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15472 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15473 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15474 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15475 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15476
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15477 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15478 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15479 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15480 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15481 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15482 soap_envelope_begin_in(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15483 { register struct Namespace *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15484 soap->part = SOAP_IN_ENVELOPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15485 if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15486 { if (soap->error == SOAP_TAG_MISMATCH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15487 { if (!soap_element_begin_in(soap, "Envelope", 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15488 soap->error = SOAP_VERSIONMISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15489 else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15490 return SOAP_OK; /* allow non-SOAP XML content to be captured */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15491 soap->error = soap->status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15492 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15493 else if (soap->status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15494 soap->error = soap->status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15495 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15496 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15497 p = soap->local_namespaces;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15498 if (p)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15499 { const char *ns = p[0].out;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15500 if (!ns)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15501 ns = p[0].ns;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15502 if (!strcmp(ns, soap_env1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15503 { soap->version = 1; /* make sure we use SOAP 1.1 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15504 if (p[1].out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15505 SOAP_FREE(soap, p[1].out);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15506 if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15507 strcpy(p[1].out, soap_enc1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15508 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15509 else if (!strcmp(ns, soap_env2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15510 { soap->version = 2; /* make sure we use SOAP 1.2 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15511 if (p[1].out)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15512 SOAP_FREE(soap, p[1].out);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15513 if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15514 strcpy(p[1].out, soap_enc2);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15515 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15516 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15517 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15518 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15519 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15520
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15521 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15522 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15523 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15524 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15525 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15526 soap_envelope_end_in(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15527 { if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15528 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15529 soap->part = SOAP_END_ENVELOPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15530 return soap_element_end_in(soap, "SOAP-ENV:Envelope");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15531 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15532 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15533
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15534 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15535 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15536 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15537 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15538 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15539 soap_body_begin_out(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15540 { if (soap->version == 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15541 soap->encoding = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15542 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15543 if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15544 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15545 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15546 if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15547 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15548 soap->part = SOAP_IN_BODY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15549 return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15550 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15551 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15552
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15553 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15554 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15555 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15556 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15557 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15558 soap_body_end_out(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15559 { if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15560 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15561 if (soap_element_end_out(soap, "SOAP-ENV:Body"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15562 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15563 soap->part = SOAP_END_BODY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15564 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15565 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15566 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15567
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15568 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15569 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15570 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15571 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15572 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15573 soap_body_begin_in(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15574 { if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15575 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15576 soap->part = SOAP_IN_BODY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15577 if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15578 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15579 if (!soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15580 soap->part = SOAP_NO_BODY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15581 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15582 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15583 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15584
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15585 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15586 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15587 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15588 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15589 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15590 soap_body_end_in(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15591 { if (soap->version == 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15592 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15593 if (soap->part == SOAP_NO_BODY)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15594 return soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15595 soap->part = SOAP_END_BODY;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15596 return soap_element_end_in(soap, "SOAP-ENV:Body");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15597 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15598 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15599
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15600 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15601 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15602 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15603 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15604 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15605 soap_recv_header(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15606 { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15607 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15608 if (soap->error == SOAP_OK && soap->fheader)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15609 soap->error = soap->fheader(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15610 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15611 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15612 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15613
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15614 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15615 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15616 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15617 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15618 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15619 soap_set_endpoint(struct soap *soap, const char *endpoint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15620 { register const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15621 register size_t i, n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15622 soap->endpoint[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15623 soap->host[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15624 soap->path[0] = '/';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15625 soap->path[1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15626 soap->port = 80;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15627 if (!endpoint || !*endpoint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15628 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15629 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15630 if (!soap_tag_cmp(endpoint, "https:*"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15631 soap->port = 443;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15632 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15633 strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15634 soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15635 s = strchr(endpoint, ':');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15636 if (s && s[1] == '/' && s[2] == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15637 s += 3;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15638 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15639 s = endpoint;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15640 n = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15641 if (n >= sizeof(soap->host))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15642 n = sizeof(soap->host) - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15643 #ifdef WITH_IPV6
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15644 if (s[0] == '[')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15645 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15646 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15647 { if (s[i] == ']')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15648 { s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15649 --n;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15650 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15651 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15652 soap->host[i] = s[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15653 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15654 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15655 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15656 { for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15657 { soap->host[i] = s[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15658 if (s[i] == '/' || s[i] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15659 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15660 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15661 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15662 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15663 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15664 { soap->host[i] = s[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15665 if (s[i] == '/' || s[i] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15666 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15667 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15668 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15669 soap->host[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15670 if (s[i] == ':')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15671 { soap->port = (int)soap_strtol(s + i + 1, NULL, 10);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15672 for (i++; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15673 if (s[i] == '/')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15674 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15675 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15676 if (i < n && s[i])
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15677 { strncpy(soap->path, s + i, sizeof(soap->path));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15678 soap->path[sizeof(soap->path) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15679 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15680 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15681 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15682
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15683 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15684 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15685 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15686 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15687 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15688 soap_connect(struct soap *soap, const char *endpoint, const char *action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15689 { return soap_connect_command(soap, SOAP_POST, endpoint, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15690 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15691 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15692
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15693 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15694 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15695 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15696 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15697 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15698 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15699 { char *endpoint;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15700 const char *s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15701 if (endpoints && (s = strchr(endpoints, ' ')))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15702 { endpoint = (char*)SOAP_MALLOC(soap, strlen(endpoints) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15703 for (;;)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15704 { strncpy(endpoint, endpoints, s - endpoints);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15705 endpoint[s - endpoints] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15706 if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15707 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15708 if (!*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15709 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15710 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15711 while (*s == ' ')
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15712 s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15713 endpoints = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15714 s = strchr(endpoints, ' ');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15715 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15716 s = endpoints + strlen(endpoints);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15717 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15718 SOAP_FREE(soap, endpoint);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15719 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15720 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15721 soap_try_connect_command(soap, http_command, endpoints, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15722 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15723 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15724 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15725
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15726 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15727 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15728 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15729 soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15730 { char host[sizeof(soap->host)];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15731 int port;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15732 size_t count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15733 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15734 strcpy(host, soap->host); /* save previous host name: if != then reconnect */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15735 port = soap->port; /* save previous port to compare */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15736 soap->status = http_command;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15737 soap_set_endpoint(soap, endpoint);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15738 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15739 if (soap->fconnect)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15740 { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15741 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15742 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15743 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15744 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15745 soap->action = soap_strdup(soap, action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15746 if (soap->fopen && *soap->host)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15747 { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15748 { soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15749 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15750 if (!strncmp(endpoint, "soap.udp:", 9))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15751 soap->omode |= SOAP_IO_UDP;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15752 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15753 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15754 { soap->keep_alive = 0; /* to force close */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15755 soap->omode &= ~SOAP_IO_UDP; /* to force close */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15756 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15757 soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15758 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15759 if (!soap->keep_alive || !soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15760 { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15761 if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15762 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15763 soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15764 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15765 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15766 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15767 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15768 if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15769 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15770 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15771 count = soap_count_attachments(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15772 if (soap_begin_send(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15773 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15774 if (http_command == SOAP_GET)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15775 { soap->mode &= ~SOAP_IO;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15776 soap->mode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15777 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15778 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15779 if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15780 { unsigned int k = soap->mode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15781 soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15782 if ((k & SOAP_IO) != SOAP_IO_FLUSH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15783 soap->mode |= SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15784 if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15785 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15786 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15787 if ((k & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15788 { if (soap_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15789 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15790 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15791 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15792 soap->mode = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15793 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15794 if (http_command == SOAP_GET || http_command == SOAP_DEL)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15795 return soap_end_send_flush(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15796 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15797 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15798 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15799 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15800
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15801 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15802 #ifdef WITH_NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15803 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15804 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15805 soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15806 { /* requires libntlm from http://www.nongnu.org/libntlm/ */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15807 const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15808 const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15809 struct SOAP_ENV__Header *oldheader;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15810 if (soap->ntlm_challenge && userid && passwd && soap->authrealm)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15811 { tSmbNtlmAuthRequest req;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15812 tSmbNtlmAuthResponse res;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15813 tSmbNtlmAuthChallenge ch;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15814 short k = soap->keep_alive;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15815 size_t l = soap->length;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15816 size_t c = soap->count;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15817 soap_mode m = soap->mode, o = soap->omode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15818 int s = soap->status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15819 char *a = soap->action;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15820 short v = soap->version;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15821 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15822 if (!*soap->ntlm_challenge)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15823 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15824 /* S -> C 401 Unauthorized
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15825 WWW-Authenticate: NTLM
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15826 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15827 buildSmbNtlmAuthRequest(&req, userid, soap->authrealm);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15828 soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)&req, NULL, SmbLength(&req));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15829 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15830 /* C -> S GET ...
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15831 Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15832 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15833 soap->omode = SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15834 if (soap_begin_send(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15835 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15836 soap->keep_alive = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15837 soap->status = command;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15838 if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15839 || soap_end_send_flush(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15840 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15841 soap->mode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15842 soap->keep_alive = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15843 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15844 oldheader = soap->header;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15845 if (soap_begin_recv(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15846 if (soap->error == SOAP_EOF)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15847 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15848 soap_end_recv(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15849 soap->header = oldheader;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15850 soap->length = l;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15851 if (soap->status != 401 && soap->status != 407)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15852 return soap->error = SOAP_NTLM_ERROR;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15853 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15854 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15855 /* S -> C 401 Unauthorized
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15856 WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA==
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15857 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15858 soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15859 buildSmbNtlmAuthResponse(&ch, &res, userid, passwd);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15860 soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)&res, NULL, SmbLength(&res));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15861 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15862 /* C -> S GET ...
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15863 Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15864 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15865 soap->userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15866 soap->passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15867 soap->proxy_userid = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15868 soap->proxy_passwd = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15869 soap->keep_alive = k;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15870 soap->length = l;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15871 soap->count = c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15872 soap->mode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15873 soap->omode = o;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15874 soap->status = s;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15875 soap->action = a;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15876 soap->version = v;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15877 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15878 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15879 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15880 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15881 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15882
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15883 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15884 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15885 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15886 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15887 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15888 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15889 { register int i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15890 register unsigned long m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15891 register char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15892 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15893 t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15894 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15895 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15896 p = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15897 t[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15898 if (!s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15899 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15900 for (; n > 2; n -= 3, s += 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15901 { m = s[0];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15902 m = (m << 8) | s[1];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15903 m = (m << 8) | s[2];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15904 for (i = 4; i > 0; m >>= 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15905 t[--i] = soap_base64o[m & 0x3F];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15906 t += 4;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15907 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15908 t[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15909 if (n > 0) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15910 { m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15911 for (i = 0; i < n; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15912 m = (m << 8) | *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15913 for (; i < 3; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15914 m <<= 8;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15915 for (i = 4; i > 0; m >>= 6)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15916 t[--i] = soap_base64o[m & 0x3F];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15917 for (i = 3; i > n; i--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15918 t[i] = '=';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15919 t[4] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15920 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15921 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15922 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15923 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15924
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15925 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15926 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15927 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15928 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15929 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15930 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15931 { register size_t i, j;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15932 register soap_wchar c;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15933 register unsigned long m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15934 register const char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15935 if (!s || !*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15936 { if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15937 *n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15938 if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15939 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15940 return SOAP_NON_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15941 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15942 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15943 { l = (strlen(s) + 3) / 4 * 3 + 1; /* make sure enough space for \0 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15944 t = (char*)soap_malloc(soap, l);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15945 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15946 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15947 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15948 p = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15949 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15950 *n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15951 for (i = 0; ; i += 3, l -= 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15952 { m = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15953 j = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15954 while (j < 4)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15955 { c = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15956 if (c == '=' || !c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15957 { if (l >= j - 1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15958 { switch (j)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15959 { case 2:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15960 *t++ = (char)((m >> 4) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15961 i++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15962 l--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15963 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15964 case 3:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15965 *t++ = (char)((m >> 10) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15966 *t++ = (char)((m >> 2) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15967 i += 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15968 l -= 2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15969 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15970 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15971 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15972 *n = (int)i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15973 if (l)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15974 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15975 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15976 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15977 c -= '+';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15978 if (c >= 0 && c <= 79)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15979 { int b = soap_base64i[c];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15980 if (b >= 64)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15981 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15982 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15983 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15984 m = (m << 6) + b;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15985 j++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15986 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15987 else if (!soap_blank(c + '+'))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15988 { soap->error = SOAP_TYPE;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15989 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15990 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15991 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15992 if (l < 3)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15993 { if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15994 *n = (int)i;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15995 if (l)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15996 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15997 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15998 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
15999 *t++ = (char)((m >> 16) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16000 *t++ = (char)((m >> 8) & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16001 *t++ = (char)(m & 0xFF);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16002 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16003 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16004 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16005
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16006 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16007 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16008 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16009 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16010 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16011 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16012 { register char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16013 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16014 t = (char*)soap_malloc(soap, 2 * n + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16015 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16016 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16017 p = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16018 t[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16019 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16020 { for (; n > 0; n--)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16021 { register int m = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16022 *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0'));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16023 m &= 0x0F;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16024 *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0'));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16025 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16026 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16027 *t++ = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16028 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16029 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16030 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16031
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16032 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16033 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16034 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16035 const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16036 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16037 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16038 { register const char *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16039 if (!s || !*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16040 { if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16041 *n = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16042 if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16043 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16044 return SOAP_NON_NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16045 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16046 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16047 { l = strlen(s) / 2 + 1; /* make sure enough space for \0 */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16048 t = (char*)soap_malloc(soap, l);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16049 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16050 if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16051 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16052 p = t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16053 while (l)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16054 { register int d1, d2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16055 d1 = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16056 if (!d1)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16057 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16058 d2 = *s++;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16059 if (!d2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16060 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16061 *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16062 l--;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16063 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16064 if (n)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16065 *n = (int)(t - p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16066 if (l)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16067 *t = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16068 return p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16069 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16070 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16071
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16072 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16073 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16074 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16075 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16076 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16077 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16078 soap_puthttphdr(struct soap *soap, int status, size_t count)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16079 { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16080 { register const char *s = "text/xml; charset=utf-8";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16081 register int err = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16082 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16083 register const char *r = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16084 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16085 if ((status == SOAP_FILE || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE) && soap->http_content && !strchr(s, 10) && !strchr(s, 13))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16086 s = soap->http_content;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16087 else if (status == SOAP_HTML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16088 s = "text/html; charset=utf-8";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16089 else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16090 { if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16091 s = "application/soap+xml; charset=utf-8";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16092 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16093 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16094 if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16095 { if (soap->mode & SOAP_ENC_MTOM)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16096 { if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16097 r = "application/soap+xml";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16098 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16099 r = "text/xml";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16100 s = "application/xop+xml";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16101 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16102 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16103 s = "application/dime";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16104 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16105 if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && strlen(soap->mime.boundary) + strlen(soap->mime.start ? soap->mime.start : SOAP_STR_EOS) < sizeof(soap->tmpbuf) - 80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16106 { register const char *t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16107 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16108 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16109 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16110 sprintf(soap->tmpbuf, "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16111 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16112 t = strchr(s, ';');
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16113 if (t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16114 strncat(soap->tmpbuf, s, t - s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16115 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16116 strcat(soap->tmpbuf, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16117 if (soap->mime.start && strlen(soap->tmpbuf) + strlen(soap->mime.start) + 11 < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16118 { strcat(soap->tmpbuf, "\"; start=\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16119 strcat(soap->tmpbuf, soap->mime.start);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16120 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16121 strcat(soap->tmpbuf, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16122 if (r && strlen(soap->tmpbuf) + strlen(r) + 15 < sizeof(soap->tmpbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16123 { strcat(soap->tmpbuf, "; start-info=\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16124 strcat(soap->tmpbuf, r);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16125 strcat(soap->tmpbuf, "\"");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16126 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16127 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16128 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16129 strncpy(soap->tmpbuf, s, sizeof(soap->tmpbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16130 soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16131 s = soap->tmpbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16132 if (status == SOAP_OK && soap->version == 2 && soap->action && strlen(soap->action) + strlen(s) < sizeof(soap->tmpbuf) - 80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16133 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16134 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16135 size_t l = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16136 soap_snprintf(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "; action=\"%s\"", soap->action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16137 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16138 sprintf(soap->tmpbuf + strlen(s), "; action=\"%s\"", soap->action);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16139 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16140 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16141 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16142 if ((err = soap->fposthdr(soap, "Content-Type", s)))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16143 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16144 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16145 if ((soap->omode & SOAP_ENC_ZLIB))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16146 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16147 #ifdef WITH_GZIP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16148 err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16149 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16150 err = soap->fposthdr(soap, "Content-Encoding", "deflate");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16151 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16152 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16153 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16154 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16155 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16156 #ifndef WITH_LEANER
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16157 if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16158 err = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16159 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16160 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16161 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16162 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16163 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16164 soap_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%lu", (unsigned long)count);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16165 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16166 sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16167 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16168 err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16169 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16170 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16171 return err;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16172 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16173 return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16174 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16175 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16176 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16177
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16178 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16179 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16180 static const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16181 soap_set_validation_fault(struct soap *soap, const char *s, const char *t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16182 { if (!t)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16183 t = SOAP_STR_EOS;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16184 if (*soap->tag)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16185 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16186 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16187 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "Validation constraint violation: %s%s in element '%s'", s, t ? t : SOAP_STR_EOS, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16188 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16189 if (strlen(soap->tag) + strlen(t) < sizeof(soap->msgbuf) - 100)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16190 sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16191 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16192 sprintf(soap->msgbuf, "Validation constraint violation: %s", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16193 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16194 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16195 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16196 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16197 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16198 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "Validation constraint violation: %s%s", s, t ? t : SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16199 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16200 if (strlen(soap->tag) + strlen(t) < sizeof(soap->msgbuf) - 100)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16201 sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16202 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16203 sprintf(soap->msgbuf, "Validation constraint violation: %s", s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16204 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16205 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16206 return soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16207 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16208 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16209
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16210 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16211 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16212 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16213 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16214 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16215 soap_set_fault(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16216 { const char **c = soap_faultcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16217 const char **s = soap_faultstring(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16218 if (soap->fseterror)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16219 soap->fseterror(soap, c, s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16220 if (!*c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16221 { if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16222 *c = "SOAP-ENV:Sender";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16223 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16224 *c = "SOAP-ENV:Client";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16225 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16226 if (*s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16227 return;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16228 switch (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16229 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16230 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16231 case SOAP_CLI_FAULT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16232 *s = "Client fault";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16233 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16234 case SOAP_SVR_FAULT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16235 *s = "Server fault";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16236 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16237 case SOAP_TAG_MISMATCH:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16238 *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16239 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16240 case SOAP_TYPE:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16241 *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16242 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16243 case SOAP_SYNTAX_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16244 *s = "Well-formedness violation";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16245 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16246 case SOAP_NO_TAG:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16247 *s = "No tag: no XML root element or missing SOAP message body element";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16248 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16249 case SOAP_MUSTUNDERSTAND:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16250 *c = "SOAP-ENV:MustUnderstand";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16251 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16252 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "The data in element '%s' must be understood but cannot be handled", soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16253 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16254 strncpy(soap->msgbuf, soap->tag, sizeof(soap->msgbuf));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16255 soap->msgbuf[sizeof(soap->msgbuf) - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16256 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16257 *s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16258 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16259 case SOAP_VERSIONMISMATCH:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16260 *c = "SOAP-ENV:VersionMismatch";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16261 *s = "Invalid SOAP message or SOAP version mismatch";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16262 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16263 case SOAP_DATAENCODINGUNKNOWN:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16264 *c = "SOAP-ENV:DataEncodingUnknown";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16265 *s = "Unsupported SOAP data encoding";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16266 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16267 case SOAP_NAMESPACE:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16268 *s = soap_set_validation_fault(soap, "namespace error", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16269 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16270 case SOAP_USER_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16271 *s = "User data error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16272 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16273 case SOAP_FATAL_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16274 *s = "Fatal error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16275 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16276 case SOAP_NO_METHOD:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16277 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16278 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "Method '%s' not implemented: method name or namespace not recognized", soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16279 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16280 sprintf(soap->msgbuf, "Method '%s' not implemented: method name or namespace not recognized", soap->tag);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16281 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16282 *s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16283 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16284 case SOAP_NO_DATA:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16285 *s = "Data required for operation";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16286 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16287 case SOAP_GET_METHOD:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16288 *s = "HTTP GET method not implemented";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16289 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16290 case SOAP_PUT_METHOD:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16291 *s = "HTTP PUT method not implemented";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16292 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16293 case SOAP_HTTP_METHOD:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16294 *s = "HTTP method not implemented";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16295 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16296 case SOAP_EOM:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16297 *s = "Out of memory";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16298 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16299 case SOAP_MOE:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16300 *s = "Memory overflow or memory corruption error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16301 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16302 case SOAP_HDR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16303 *s = "Header line too long";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16304 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16305 case SOAP_IOB:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16306 *s = "Array index out of bounds";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16307 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16308 case SOAP_NULL:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16309 *s = soap_set_validation_fault(soap, "nil not allowed", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16310 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16311 case SOAP_DUPLICATE_ID:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16312 *s = soap_set_validation_fault(soap, "multiple elements (use the SOAP_XML_TREE flag) with duplicate id ", soap->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16313 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16314 *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16315 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16316 case SOAP_MISSING_ID:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16317 *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16318 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16319 *soap_faultsubcode(soap) = "SOAP-ENC:MissingID";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16320 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16321 case SOAP_HREF:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16322 *s = soap_set_validation_fault(soap, "incompatible object type id-ref ", soap->id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16323 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16324 case SOAP_FAULT:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16325 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16326 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16327 case SOAP_UDP_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16328 *s = "Message too large for UDP packet";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16329 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16330 case SOAP_TCP_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16331 *s = tcp_error(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16332 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16333 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16334 case SOAP_HTTP_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16335 *s = "An HTTP processing error occurred";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16336 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16337 case SOAP_NTLM_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16338 *s = "An HTTP NTLM authentication error occurred";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16339 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16340 case SOAP_SSL_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16341 #ifdef WITH_OPENSSL
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16342 *s = "SSL/TLS error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16343 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16344 *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16345 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16346 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16347 case SOAP_PLUGIN_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16348 *s = "Plugin registry error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16349 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16350 case SOAP_DIME_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16351 *s = "DIME format error or max DIME size exceeds SOAP_MAXDIMESIZE";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16352 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16353 case SOAP_DIME_HREF:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16354 *s = "DIME href to missing attachment";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16355 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16356 case SOAP_DIME_MISMATCH:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16357 *s = "DIME version/transmission error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16358 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16359 case SOAP_DIME_END:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16360 *s = "End of DIME error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16361 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16362 case SOAP_MIME_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16363 *s = "MIME format error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16364 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16365 case SOAP_MIME_HREF:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16366 *s = "MIME href to missing attachment";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16367 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16368 case SOAP_MIME_END:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16369 *s = "End of MIME error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16370 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16371 case SOAP_ZLIB_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16372 #ifdef WITH_ZLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16373 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16374 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "Zlib/gzip error: '%s'", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16375 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16376 sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream->msg ? soap->d_stream->msg : SOAP_STR_EOS);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16377 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16378 *s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16379 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16380 *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16381 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16382 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16383 case SOAP_REQUIRED:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16384 *s = soap_set_validation_fault(soap, "missing required attribute", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16385 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16386 case SOAP_PROHIBITED:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16387 *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16388 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16389 case SOAP_OCCURS:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16390 *s = soap_set_validation_fault(soap, "occurrence violation", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16391 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16392 case SOAP_LENGTH:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16393 *s = soap_set_validation_fault(soap, "content range or length violation", NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16394 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16395 case SOAP_FD_EXCEEDED:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16396 *s = "Maximum number of open connections was reached (no define HAVE_POLL): increase FD_SETSIZE";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16397 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16398 case SOAP_UTF_ERROR:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16399 *s = "UTF content encoding error";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16400 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16401 case SOAP_STOP:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16402 *s = "Stopped: no response sent or received (informative)";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16403 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16404 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16405 case SOAP_EOF:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16406 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16407 *s = soap_strerror(soap); /* *s = soap->msgbuf */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16408 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16409 if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16410 { memmove(soap->msgbuf + 25, soap->msgbuf, strlen(soap->msgbuf) + 1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16411 memcpy(soap->msgbuf, "End of file or no input: ", 25);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16412 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16413 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16414 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16415 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16416 *s = "End of file or no input";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16417 break;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16418 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16419 default:
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16420 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16421 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16422 if (soap->error > 200 && soap->error < 600)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16423 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16424 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16425 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "HTTP Error: %d %s", soap->error, http_error(soap, soap->error));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16426 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16427 sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16428 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16429 *s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16430 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16431 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16432 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16433 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16434 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16435 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16436 soap_snprintf(soap->msgbuf, sizeof(soap->msgbuf), "Error %d", soap->error);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16437 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16438 sprintf(soap->msgbuf, "Error %d", soap->error);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16439 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16440 *s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16441 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16442 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16443 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16444 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16445
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16446 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16447 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16448 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16449 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16450 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16451 soap_send_fault(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16452 { register int status = soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16453 if (status == SOAP_OK || status == SOAP_STOP)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16454 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16455 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16456 soap->keep_alive = 0; /* to terminate connection */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16457 soap_set_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16458 if (soap->error < 200 && soap->error != SOAP_FAULT)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16459 soap->header = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16460 if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16461 { register int r = 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16462 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16463 if (soap->fpoll && soap->fpoll(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16464 r = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16465 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16466 else if (soap_valid_socket(soap->socket))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16467 { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16468 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16469 { int t;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16470 if (!(r & SOAP_TCP_SELECT_SND)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16471 || ((r & SOAP_TCP_SELECT_RCV)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16472 && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16473 r = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16474 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16475 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16476 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16477 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16478 if (r > 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16479 { soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16480 soap->encodingStyle = NULL; /* no encodingStyle in Faults */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16481 soap_serializeheader(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16482 soap_serializefault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16483 soap_begin_count(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16484 if (soap->mode & SOAP_IO_LENGTH)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16485 { soap_envelope_begin_out(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16486 soap_putheader(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16487 soap_body_begin_out(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16488 soap_putfault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16489 soap_body_end_out(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16490 soap_envelope_end_out(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16491 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16492 soap_end_count(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16493 if (soap_response(soap, status)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16494 || soap_envelope_begin_out(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16495 || soap_putheader(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16496 || soap_body_begin_out(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16497 || soap_putfault(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16498 || soap_body_end_out(soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16499 || soap_envelope_end_out(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16500 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16501 soap_end_send(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16502 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16503 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16504 soap->error = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16505 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16506 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16507 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16508
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16509 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16510 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16511 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16512 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16513 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16514 soap_recv_fault(struct soap *soap, int check)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16515 { register int status = soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16516 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Check if receiving SOAP Fault\n"));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16517 if (!check)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16518 { /* try getfault when no tag or tag mismatched at level 2, otherwise ret */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16519 if (soap->error != SOAP_NO_TAG
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16520 && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16521 return soap->error;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16522 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16523 else if (soap->version == 0) /* check == 1 but no SOAP: do not parse SOAP Fault */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16524 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16525 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16526 if (soap_getfault(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16527 { /* check flag set: check if SOAP Fault is present, if not just return */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16528 if (check && soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16529 return soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16530 DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed at level %u tag '%s'\n", soap->level, soap->tag));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16531 *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16532 soap->error = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16533 soap_set_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16534 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16535 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16536 { register const char *s = *soap_faultcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16537 if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16538 status = SOAP_SVR_FAULT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16539 else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16540 status = SOAP_CLI_FAULT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16541 else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16542 status = SOAP_MUSTUNDERSTAND;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16543 else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch"))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16544 status = SOAP_VERSIONMISMATCH;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16545 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16546 { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Received SOAP Fault code %s\n", s));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16547 status = SOAP_FAULT;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16548 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16549 if (!soap_body_end_in(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16550 soap_envelope_end_in(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16551 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16552 soap_end_recv(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16553 soap->error = status;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16554 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16555 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16556 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16557
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16558 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16559 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16560 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16561 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16562 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16563 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16564 soap_send_empty_response(struct soap *soap, int httpstatuscode)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16565 { register soap_mode m = soap->omode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16566 if (!(m & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16567 { soap->count = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16568 if ((m & SOAP_IO) == SOAP_IO_CHUNK)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16569 soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16570 soap_response(soap, httpstatuscode);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16571 soap_end_send(soap); /* force end of sends */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16572 soap->error = SOAP_STOP; /* stops the server (from returning a response) */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16573 soap->omode = m;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16574 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16575 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16576 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16577 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16578 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16579
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16580 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16581 #ifndef WITH_NOHTTP
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16582 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16583 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16584 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16585 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16586 soap_recv_empty_response(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16587 { if (!(soap->omode & SOAP_IO_UDP))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16588 { if (!soap_begin_recv(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16589 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16590 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16591 if (soap->body)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16592 soap_get_http_body(soap, NULL); /* read (empty?) HTTP body and discard */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16593 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16594 soap_end_recv(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16595 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16596 else if (soap->error == SOAP_NO_DATA || soap->error == 202)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16597 soap->error = SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16598 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16599 return soap_closesock(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16600 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16601 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16602 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16603
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16604 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16605 #ifndef WITH_NOIO
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16606 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16607 static const char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16608 soap_strerror(struct soap *soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16609 { register int err = soap->errnum;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16610 *soap->msgbuf = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16611 if (err)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16612 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16613 #ifndef WIN32
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16614 # ifdef HAVE_STRERROR_R
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16615 # ifdef _GNU_SOURCE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16616 return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16617 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16618 strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16619 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16620 # else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16621 return strerror(err);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16622 # endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16623 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16624 #ifndef UNDER_CE
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16625 DWORD len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16626 *soap->msgbuf = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16627 len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)soap->msgbuf, (DWORD)sizeof(soap->msgbuf), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16628 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16629 DWORD i, len;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16630 *soap->msgbuf = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16631 len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16632 for (i = 0; i <= len; i++)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16633 { if (((TCHAR*)soap->msgbuf)[i] < 0x80)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16634 soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16635 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16636 soap->msgbuf[i] = '?';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16637 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16638 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16639 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16640 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16641 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16642 { char *s = soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16643 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16644 int rt = soap->recv_timeout, st = soap->send_timeout;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16645 int ru = ' ', su = ' ';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16646 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16647 strcpy(s, "Operation interrupted or timed out");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16648 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16649 if (rt < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16650 { rt = -rt;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16651 ru = 'u';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16652 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16653 if (st < 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16654 { st = -st;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16655 su = 'u';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16656 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16657 if (rt)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16658 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16659 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16660 size_t l = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16661 soap_snprintf(s + l, sizeof(soap->msgbuf) - l, " (%d%cs recv delay)", rt, ru);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16662 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16663 sprintf(s + strlen(s), " (%d%cs recv delay)", rt, ru);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16664 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16665 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16666 if (st)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16667 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16668 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16669 size_t l = strlen(s);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16670 soap_snprintf(s + l, sizeof(soap->msgbuf) - l, " (%d%cs send delay)", st, su);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16671 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16672 sprintf(s + strlen(s), " (%d%cs send delay)", st, su);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16673 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16674 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16675 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16676 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16677 return soap->msgbuf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16678 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16679 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16680 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16681
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16682 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16683 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16684 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16685 soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16686 { *soap_faultcode(soap) = faultcode;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16687 if (faultsubcodeQName)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16688 *soap_faultsubcode(soap) = faultsubcodeQName;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16689 *soap_faultstring(soap) = faultstring;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16690 if (faultdetailXML && *faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16691 { register const char **s = soap_faultdetail(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16692 if (s)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16693 *s = faultdetailXML;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16694 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16695 return soap->error = soaperror;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16696 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16697 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16698
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16699 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16700 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16701 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16702 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16703 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16704 soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16705 { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", NULL, faultstring, faultdetailXML, soaperror);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16706 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16707 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16708
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16709 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16710 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16711 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16712 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16713 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16714 soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16715 { return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", NULL, faultstring, faultdetailXML, soaperror);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16716 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16717 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16718
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16719 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16720 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16721 static int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16722 soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16723 { char *r = NULL, *s = NULL, *t = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16724 if (faultsubcodeQName)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16725 r = soap_strdup(soap, faultsubcodeQName);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16726 if (faultstring)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16727 s = soap_strdup(soap, faultstring);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16728 if (faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16729 t = soap_strdup(soap, faultdetailXML);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16730 return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16731 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16732 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16733
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16734 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16735 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16736 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16737 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16738 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16739 soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16740 { return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16741 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16742 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16743
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16744 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16745 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16746 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16747 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16748 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16749 soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16750 { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcodeQName, faultstring, faultdetailXML);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16751 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16752 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16753
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16754 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16755 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16756 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16757 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16758 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16759 soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16760 { return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16761 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16762 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16763
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16764 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16765 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16766 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16767 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16768 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16769 soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16770 { return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcodeQName, faultstring, faultdetailXML);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16771 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16772 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16773
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16774 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16775 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16776 #ifndef WITH_NOSTDLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16777 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16778 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16779 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16780 soap_print_fault(struct soap *soap, FILE *fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16781 { if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16782 fprintf(fd, "Error: soap struct state not initialized\n");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16783 else if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16784 { const char **c, *v = NULL, *s, *d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16785 c = soap_faultcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16786 if (!*c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16787 soap_set_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16788 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16789 v = soap_check_faultsubcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16790 s = *soap_faultstring(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16791 d = soap_check_faultdetail(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16792 fprintf(fd, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16793 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16794 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16795 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16796 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16797
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16798 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16799 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16800 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16801 #ifndef WITH_NOSTDLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16802 #ifndef WITH_COMPAT
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16803 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16804 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16805 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16806 soap_stream_fault(struct soap *soap, std::ostream& os)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16807 { if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16808 os << "Error: soap struct state not initialized\n";
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16809 else if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16810 { const char **c, *v = NULL, *s, *d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16811 c = soap_faultcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16812 if (!*c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16813 soap_set_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16814 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16815 v = soap_check_faultsubcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16816 s = *soap_faultstring(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16817 d = soap_check_faultdetail(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16818 os << (soap->version ? "SOAP 1." : "Error ")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16819 << (soap->version ? (int)soap->version : soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16820 << " fault: " << *c
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16821 << "[" << (v ? v : "no subcode") << "]"
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16822 << std::endl
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16823 << "\"" << (s ? s : "[no reason]") << "\""
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16824 << std::endl
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16825 << "Detail: " << (d ? d : "[no detail]")
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16826 << std::endl;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16827 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16828 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16829 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16830 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16831 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16832 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16833
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16834 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16835 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16836 #ifndef WITH_NOSTDLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16837 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16838 char*
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16839 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16840 soap_sprint_fault(struct soap *soap, char *buf, size_t len)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16841 { if (soap_check_state(soap))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16842 { strncpy(buf, "Error: soap struct not initialized", len);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16843 buf[len - 1] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16844 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16845 else if (soap->error)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16846 { const char **c, *v = NULL, *s, *d;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16847 c = soap_faultcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16848 if (!*c)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16849 soap_set_fault(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16850 if (soap->version == 2)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16851 v = *soap_faultsubcode(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16852 s = *soap_faultstring(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16853 d = soap_check_faultdetail(soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16854 #ifdef HAVE_SNPRINTF
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16855 soap_snprintf(buf, len, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16856 #else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16857 if (len > 40 + (v ? strlen(v) : 0) + (s ? strlen(s) : 0) + (d ? strlen(d) : 0))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16858 sprintf(buf, "%s%d fault: %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v ? v : "no subcode", s ? s : "[no reason]", d ? d : "[no detail]");
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16859 else if (len > 40)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16860 sprintf(buf, "%s%d fault: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16861 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16862 buf[0] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16863 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16864 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16865 return buf;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16866 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16867 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16868 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16869
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16870 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16871 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16872 #ifndef WITH_NOSTDLIB
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16873 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16874 void
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16875 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16876 soap_print_fault_location(struct soap *soap, FILE *fd)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16877 {
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16878 #ifndef WITH_LEAN
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16879 int i, j, c1, c2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16880 if (soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= SOAP_BUFLEN)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16881 { i = (int)soap->bufidx - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16882 if (i <= 0)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16883 i = 0;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16884 c1 = soap->buf[i];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16885 soap->buf[i] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16886 if ((int)soap->buflen >= i + 1024)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16887 j = i + 1023;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16888 else
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16889 j = (int)soap->buflen - 1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16890 c2 = soap->buf[j];
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16891 soap->buf[j] = '\0';
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16892 fprintf(fd, "%s%c\n<!-- ** HERE ** -->\n", soap->buf, c1);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16893 if (soap->bufidx < soap->buflen)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16894 fprintf(fd, "%s\n", soap->buf + soap->bufidx);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16895 soap->buf[i] = (char)c1;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16896 soap->buf[j] = (char)c2;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16897 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16898 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16899 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16900 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16901 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16902
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16903 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16904 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16905 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16906 int
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16907 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16908 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16909 { register struct soap_plugin *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16910 register int r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16911 if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin))))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16912 return soap->error = SOAP_EOM;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16913 p->id = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16914 p->data = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16915 p->fcopy = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16916 p->fdelete = NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16917 r = fcreate(soap, p, arg);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16918 if (!r && p->fdelete)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16919 { p->next = soap->plugins;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16920 soap->plugins = p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16921 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16922 return SOAP_OK;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16923 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16924 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id ? p->id : "?", r));
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16925 SOAP_FREE(soap, p);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16926 return r;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16927 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16928 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16929
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16930 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16931 #ifndef PALM_1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16932 static void *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16933 fplugin(struct soap *soap, const char *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16934 { register struct soap_plugin *p;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16935 for (p = soap->plugins; p; p = p->next)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16936 if (p->id == id || !strcmp(p->id, id))
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16937 return p->data;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16938 return NULL;
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16939 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16940 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16941
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16942 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16943 #ifndef PALM_2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16944 SOAP_FMAC1
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16945 void *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16946 SOAP_FMAC2
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16947 soap_lookup_plugin(struct soap *soap, const char *id)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16948 { return soap->fplugin(soap, id);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16949 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16950 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16951
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16952 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16953 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16954 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16955 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16956
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16957 /******************************************************************************\
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16958 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16959 * C++ soap struct methods
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16960 *
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16961 \******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16962
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16963 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16964 soap::soap()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16965 { soap_init(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16966 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16967 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16968
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16969 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16970 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16971 soap::soap(soap_mode m)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16972 { soap_init1(this, m);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16973 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16974 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16975
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16976 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16977 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16978 soap::soap(soap_mode im, soap_mode om)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16979 { soap_init2(this, im, om);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16980 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16981 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16982
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16983 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16984 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16985 soap::soap(const struct soap& soap)
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16986 { soap_copy_context(this, &soap);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16987 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16988 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16989
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16990 /******************************************************************************/
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16991 #ifdef __cplusplus
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16992 soap::~soap()
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16993 { soap_destroy(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16994 soap_end(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16995 soap_done(this);
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16996 }
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16997 #endif
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16998
8300eb051bea Initial upload
ktnyt
parents:
diff changeset
16999 /******************************************************************************/