From c59214acbe4c161aa5fed442efd95e2c3ba744e4 Mon Sep 17 00:00:00 2001 From: zribiahmed Date: Thu, 22 Nov 2012 13:29:17 +0000 Subject: [PATCH] copy --- Makefile | 121 + README | 136 + docs/README.doc | Bin 0 -> 13824 bytes docs/conception.doc | Bin 0 -> 1123328 bytes docs/conception.odg | Bin 0 -> 37456 bytes docs/holdrequest.doc | Bin 0 -> 141312 bytes docs/tr069_datamodel_guide.doc | Bin 0 -> 88064 bytes src/AddObject.c | 157 + src/DeleteObject.c | 157 + src/Download.c | 639 ++ src/FactoryReset.c | 79 + src/Fault_cpe.c | 211 + src/GetParameterAttributes.c | 216 + src/GetParameterNames.c | 180 + src/GetParameterValues.c | 190 + src/GetRPCMethods_acs.c | 88 + src/GetRPCMethods_cpe.c | 119 + src/Inform.c | 413 + src/Makefile | 59 + src/Reboot.c | 104 + src/ScheduleInform.c | 232 + src/SetParameterAttributes.c | 406 + src/SetParameterValues.c | 208 + src/TransferComplete.c | 120 + src/backupSession.c | 1379 +++ src/config.c | 1099 +++ src/config/cwmp | 25 + src/connectionRequest.c | 135 + src/cwmp.c | 684 ++ src/cwmp_api.c | 287 + src/cwmp_lib.c | 71 + src/cwmp_value_change.c | 61 + src/dm.c | 2004 ++++ src/dm/scripts/templateScript | 0 src/dm/xml/tr098.xml | 1337 +++ src/dm_rpc.c | 1748 ++++ src/event.c | 485 + src/httpda.c | 710 ++ src/inc/backupSession.h | 34 + src/inc/cwmp-1-1.h | 1258 +++ src/inc/cwmp.h | 348 + src/inc/cwmpBinding.nsmap | 11 + src/inc/cwmp_kernel.h | 8 + src/inc/cwmp_lib.h | 6 + src/inc/dm.h | 227 + src/inc/dm_rpc.h | 121 + src/inc/httpda.h | 121 + src/inc/list.h | 471 + src/inc/md5evp.h | 81 + src/inc/soapH.h | 1532 ++++ src/inc/soapStub.h | 1060 +++ src/inc/stdsoap2.h | 2317 +++++ src/inc/threads.h | 123 + src/init/cwmpd.init | 123 + src/init/iccu.init | 124 + src/init/iccu_enable | 22 + src/kcwmp.c | 197 + src/log.c | 163 + src/md5evp.c | 102 + src/soapC.c | 12549 +++++++++++++++++++++++++ src/soapClient.c | 566 ++ src/stdsoap2.c | 15170 +++++++++++++++++++++++++++++++ src/wsdl/cwmp-1-1.wsdl | 97 + src/wsdl/cwmp-1-1.xsd | 1664 ++++ 64 files changed, 52355 insertions(+) create mode 100644 Makefile create mode 100644 README create mode 100644 docs/README.doc create mode 100644 docs/conception.doc create mode 100644 docs/conception.odg create mode 100644 docs/holdrequest.doc create mode 100644 docs/tr069_datamodel_guide.doc create mode 100644 src/AddObject.c create mode 100644 src/DeleteObject.c create mode 100644 src/Download.c create mode 100644 src/FactoryReset.c create mode 100644 src/Fault_cpe.c create mode 100644 src/GetParameterAttributes.c create mode 100644 src/GetParameterNames.c create mode 100644 src/GetParameterValues.c create mode 100644 src/GetRPCMethods_acs.c create mode 100644 src/GetRPCMethods_cpe.c create mode 100644 src/Inform.c create mode 100644 src/Makefile create mode 100644 src/Reboot.c create mode 100644 src/ScheduleInform.c create mode 100644 src/SetParameterAttributes.c create mode 100644 src/SetParameterValues.c create mode 100644 src/TransferComplete.c create mode 100644 src/backupSession.c create mode 100644 src/config.c create mode 100644 src/config/cwmp create mode 100644 src/connectionRequest.c create mode 100644 src/cwmp.c create mode 100644 src/cwmp_api.c create mode 100644 src/cwmp_lib.c create mode 100755 src/cwmp_value_change.c create mode 100644 src/dm.c create mode 100644 src/dm/scripts/templateScript create mode 100644 src/dm/xml/tr098.xml create mode 100644 src/dm_rpc.c create mode 100644 src/event.c create mode 100644 src/httpda.c create mode 100644 src/inc/backupSession.h create mode 100644 src/inc/cwmp-1-1.h create mode 100644 src/inc/cwmp.h create mode 100644 src/inc/cwmpBinding.nsmap create mode 100644 src/inc/cwmp_kernel.h create mode 100644 src/inc/cwmp_lib.h create mode 100644 src/inc/dm.h create mode 100644 src/inc/dm_rpc.h create mode 100644 src/inc/httpda.h create mode 100644 src/inc/list.h create mode 100644 src/inc/md5evp.h create mode 100644 src/inc/soapH.h create mode 100644 src/inc/soapStub.h create mode 100644 src/inc/stdsoap2.h create mode 100644 src/inc/threads.h create mode 100644 src/init/cwmpd.init create mode 100644 src/init/iccu.init create mode 100644 src/init/iccu_enable create mode 100644 src/kcwmp.c create mode 100644 src/log.c create mode 100644 src/md5evp.c create mode 100644 src/soapC.c create mode 100644 src/soapClient.c create mode 100644 src/stdsoap2.c create mode 100644 src/wsdl/cwmp-1-1.wsdl create mode 100644 src/wsdl/cwmp-1-1.xsd diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f57fe68 --- /dev/null +++ b/Makefile @@ -0,0 +1,121 @@ +# +# Copyright (C) 2011 Inteno +# + + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk +PKG_NAME:=cwmpd +PKG_RELEASE:=0 +PKG_VERSION:=1.3 +CWMP_BKP_FILE:=/etc/cwmpd/.cwmpd_backup_session.xml +OTHER_MENU:=Other modules +include $(INCLUDE_DIR)/package.mk + + +define KernelPackage/kcwmp + SUBMENU:=$(OTHER_MENU) + TITLE:=Modules for TR-069 value change notification + KCONFIG:= + FILES:=$(PKG_BUILD_DIR)/kcwmp.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,1,kcwmp) +endef + +define KernelPackage/kcwmp/description + TR-069 kernel modules for value change notification +endef + +EXTRA_KCONFIG:= \ + CONFIG_HELLO_MOD=m + +EXTRA_CFLAGS:= \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ + +MAKE_OPTS:= \ + ARCH="$(LINUX_KARCH)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + SUBDIRS="$(PKG_BUILD_DIR)" \ + EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ + $(EXTRA_KCONFIG) + +define Package/cwmpd + CATEGORY:=Utilities + TITLE:=TR-069 client + DEPENDS:=PACKAGE_libuci:libuci PACKAGE_libexpat:libexpat PACKAGE_libcurl:libcurl PACKAGE_libpthread:libpthread PACKAGE_libopenssl:libopenssl +endef + +define Package/libcwmp + SECTION:=libs + CATEGORY:=Libraries + TITLE:=C library for the TR-069 client +endef + +define Package/cwmpd/description + TR-069 client +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + $(TARGET_CONFIGURE_OPTS) LINUX_DIR=$(LINUX_DIR) MAKE_OPTS=$(MAKE_OPTS) LDFLAGS="-L$(STAGING_DIR)/usr/lib" CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include -I$(STAGING_DIR)/usr/include -DCWMP_BKP_FILE=\\\"$(CWMP_BKP_FILE)\\\"" +endef + +define Package/libcwmp/install + $(INSTALL_DIR) $(1)/lib + $(CP) $(PKG_BUILD_DIR)/libcwmp.so* $(1)/lib/ +endef + +define Package/cwmpd/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/cwmpd $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/cwmp_value_change $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) -m0644 $(PKG_BUILD_DIR)/config/cwmp $(1)/etc/config/ + $(INSTALL_DIR) $(1)/etc/cwmpd/dm + $(INSTALL_DATA) -m0644 $(PKG_BUILD_DIR)/dm/xml/* $(1)/etc/cwmpd/dm + $(INSTALL_DIR) $(1)/etc/cwmpd/scripts + $(INSTALL_DATA) -m0755 $(PKG_BUILD_DIR)/dm/scripts/* $(1)/etc/cwmpd/scripts + $(INSTALL_DATA) -m0755 $(PKG_BUILD_DIR)/init/iccu_enable $(1)/etc/cwmpd/scripts/iccu_enable + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_DATA) -m0755 $(PKG_BUILD_DIR)/init/cwmpd.init $(1)/etc/init.d/cwmpd + $(INSTALL_DATA) -m0755 $(PKG_BUILD_DIR)/init/iccu.init $(1)/etc/init.d/iccu +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_BUILD_DIR)/inc/cwmp_lib.h $(1)/usr/include + $(CP) $(PKG_BUILD_DIR)/inc/cwmp_kernel.h $(LINUX_DIR)/include/linux + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/libcwmp.so* $(1)/usr/lib +endef + +define Package/cwmpd/postinst + #!/bin/sh + echo "$(CWMP_BKP_FILE)" >> $${IPKG_INSTROOT}/etc/sysupgrade.conf + echo "/etc/cwmpd/.iccu/cwmp" >> $${IPKG_INSTROOT}/etc/sysupgrade.conf + if [ -z "$${IPKG_INSTROOT}" ]; then + echo "Enabling rc.d symlink for cwmpd" + /etc/init.d/cwmpd enable + /etc/init.d/iccu enable + fi + exit 0 +endef + +define Package/cwmpd/prerm + #!/bin/sh + if [ -z "$${IPKG_INSTROOT}" ]; then + echo "Disabling rc.d symlink for cwmpd" + /etc/init.d/cwmpd disable + /etc/init.d/iccu disable + fi + exit 0 +endef + +$(eval $(call BuildPackage,cwmpd)) +$(eval $(call BuildPackage,libcwmp)) +$(eval $(call KernelPackage,kcwmp)) diff --git a/README b/README new file mode 100644 index 0000000..4b4639a --- /dev/null +++ b/README @@ -0,0 +1,136 @@ +1)Build + Requirements : + librairies: + - libuci.so + - libexpat.so + - libcurl.so + - libpthread.so + - libopenssl.so + - libz.so + - libcrypto.so + the librairies should be present in the "staging_dir/target-i386_uClibc-0.9.30.1/usr/lib/" or "staging_dir/toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/lib" + + header files and folders: + - expat.h + - expat_external.h + - uci.h + - uci_config.h + - zlib.h + - curl folder + - openssl folder + the header files and folders should be present in the staging_dir/target-i386_uClibc-0.9.30.1/usr/include/ or staging_dir/toolchain-i386_gcc-4.1.2_uClibc-0.9.30.1/usr/include/ + + +if a librairie doesn't exist: + a- run make menuconfig and select the librarie + b- build the librarie package + +2) Build + +this software is composed of 3 packages: +- cwmpd package: contains cwmpd daemon +- cwmp lib package: contains cwmplib and contains cwmp_value_change binary. They could be used by other user space applications in order to notify the cwmp daemon when paramter changes +- cwmp kernel package: contains cwmp kernel module. This module could be used by other kernel modules to notify the cwmpd daemon when kernel parameter changes + +The three packages should be selected in the make menu config in order to get the three packages compiled. +To compile the three packages: $ make package/cwmpd/compile + +3) OpenWRT settings +in the OpenWRT, Add the following lines in the /usr/share/udhcpc/default.script file: + uci_set_state provisioning iup tr069url "$url" + uci_set_state provisioning iup provisioningcode "$provisioningcode" + +4) Run + Requirements: + - libuci package should be installed + - libexpat package should be installed + - libcurl package should be installed + - libpthread package should be installed + - libopenssl package should be installed + - libz package should be installed + - libcrypto package should be installed + + Configure the acs url in the /etc/config/cwmp + and then start the cwmpd service: /etc/init.d/cwmpd start + for the help: /etc/init.d/cwmpd + +5) Value Change + +5.1) value change for user space applications (using the libcwmp) + +Before using the libcwmp, we should check that the libcwmp package is selected in "make menu config". and we should check that the package is compiled. +The libcwmp should be installed uin the OpenWRT firmware + +example of using libcwmp +in myapplication.c + +#... +#include +#... + +int anyfunction () +{ + ..... + /* parameter change here */ + /* so we inform the cwmp: */ + lib_api_cwmp_value_change_call (3, "InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.IPInterface.{i}.IPInterfaceIPAddress","lan2","3"); + ..... +/* +Description of lib_api_cwmp_value_change_call input parameters + parameter 1 : is the number of input string in the function lib_api_cwmp_value_change_call + parameter 2 : is the parameter path + parameter 3 : is the first correspondence related to the first indice + parameter 4 : is the second correspondence related to the second indice + . + . + . + parameter n : is the (n-2) correspondence related to the (n-2) indice +*/ + +} + +5.2) value change for user space applications (using the cwmp_value_change CLI) + +Before using the libcwmp, we should check that the libcwmp package is selected in "make menu config". and we should check that the package is compiled. +The libcwmp should be installed uin the OpenWRT firmware + +in OpenWRT: + +root@OpenWrt:~# cwmp_value_change InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.IPInterface.{i}.IPInterfaceIPAddress "lan2" "3" + +in this case the command will force cwmp client to send a notification to the ACS (if and only if the parameter path as configured as active or as passive parameter using the setAttributeParameter method) + +5.3) value change for kernel space modules +Before using the cwmp kernel module for value change, we should check that the kernel module package is selected in "make menu config". and we should check that the package is compiled. +The kernel module should be installed uin the OpenWRT firmware and should be insert before all other kernel modules + +example of using cwmp kernel module +in mykernelmodule.c + +#... +#include +#... + +int anykernelfunction () +{ + ..... + /* parameter change here */ + /* so we inform the cwmp: */ + kernel_api_cwmp_value_change_call (3, "InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.IPInterface.{i}.IPInterfaceIPAddress","lan2","3"); + ..... +/* +Description of lib_api_cwmp_value_change_call input parameters + parameter 1 : is the number of input string in the function lib_api_cwmp_value_change_call + parameter 2 : is the parameter path + parameter 3 : is the first correspondence related to the first indice + parameter 4 : is the second correspondence related to the second indice + . + . + . + parameter n : is the (n-2) correspondence related to the (n-2) indice +*/ + +} + + + diff --git a/docs/README.doc b/docs/README.doc new file mode 100644 index 0000000000000000000000000000000000000000..d0f608e37c528e7b40cb431ffb6f15b567fd61f9 GIT binary patch literal 13824 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

j0^y4nn?VbnR1rT7 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

FBWfCR(ph6Eq!?UtJF~Ckm}n0B|F~ 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 $G(;dgmj zoU@s{HLq1?bvh`sue57k-D>3wx00bZ1MA_yq@XttGr6%v=d5ykT?nt0pU;Xxhql=y zDJWRFZrN#_t!1RMfdJC9`tu6A;Ot;xU0l*X|TtY!nwUGWo5iI#Av$ z^|`InvV2b$Z>cj-C|sW5YJ^B0Y2l7T+-5(K_U|FoTi7@pUtS3BZZT1;<rxnwZJjRnjrU3s1rDEO5}7PECi2hKQm!qD zMcfWVjk375mrrg44*h^}vsaRhvsW1MpHN=`a(Wm7juc_x)=|WZm8zMtCUtt<%Gk`&ejY#JBqaBWqnmlH|CUxqN#rF2Ex$NjJvbR9L@0 zA}10k(@M|H?Jw|geq~@jB<x2^y}>y(G{eBAD(#@^$(A* zl@n!bl|Fwvn6GQI)ZBYwz_2{+&mHV=>*&Awcp47zSKE|zZewWQz(v`@W>uGU<#u`u zs&^6frz7q-#LQ-4JM3!#SB@N=og7-~#D>YJazr!d5O^wWBM*X(RS%QN^Lo@M#ZP6~ zJ<-Wd95}m^(%wf$MShfAbS@Q}?}x{b(JtcFEVr?njg*60HJc<@dG8Egfaa6L$8-1N zcpIZ#7VU5)DwRV);tC5)KA}5XeU>A8Ir9>H-(M&g^UG{=ZiBmqPc7M>;T)O3)qXb( z%V4pTZ+qT(@Yrmh?+b;Ijue)pB{N#cQ~WWb?K~f0)l#*c$@P%X8X*0E#00NoG~@Nw zh`cS85+kJAiak0}&u|Cx=ah0S`DR)DS<1fis5k?zZo8*rJu}Tp?IyF&U#HK|c#KEG z{-mnZsfo!s6naI@#q{>!Q)xN#)ym%gfQ^qzKXHy(`7p__DxtJz;Ppw!x+opqfCJCG zmvxdln||Z<}kk4O6a`j1EX^w1^!l)CLr z@A-FQHCe)$(iyBNA$ppuA)?B>PUf4gnN@^`TjxLgY2iaP-el<6vh$B2K2}2STv-k} zRCaq<9QD3owA0rU))o)1$y^D*;Ko77c#(53#)x#cq}s_;x|nSG++%ym7_H*^R?X*G zu13ojV+>AuaZ`>2`4Uc0dpg!)sXWQJ0T4{e(3KTfy$7%N$=X-8ry$p6*rQGxfx$UB zmEQ>}{22jmc^Fohy&stz~9u*)qpbF-=NTEoAyO^ETc_5?<|1YSUg#9WEW_ z_J-~}@nJ`=^wxA}`muxAQWxUe&pY8itGsT{dmB=o-8{AOt7B*;0&_D?Id6Hv?X_!u zEeGk^rlnLgMA$P{9?D{HE=OZUBj5oEBAeBtqQXr$^p@}UwJVx-Ki;>rwB~Y(Z!eX^ z+5N{gY|eHG__Q+<5{hDl5hs7xDVG9}DmGeLz?crGICFM&1qiI1D1SRUJH_*X+NpOb zaA1w!5+QV6=dp&BI-^CmbM-t;NtGBGP9y9*G8U0RB@J8}WTxb%<>{<%*SruDR3x8d z7Wlr)2^;5(LZ?nn?7P+;A4wn{enM=&{hO}N(ZPXOg?ZQjGoU;ICOo)6KJAb9z~YP0 z0Kr_tC zDe|mOk&-NHQp*b73Q+`)x7>ZSC=z*ysIb3}v9cH9-8d(9Oq?g9qljMh4|9zZHU8tW zYUV{u^(W=OExhM|$<|9fP?M?39YCk+{ub*7A^*j&Bnet1eWlH5bXAIpF{(21Ug9^f zcf}!@_X_kn0bi0|3Iw~xk~t$!(uf< zpJA)#$N1*tnw*Mks>+H1ht1XL*LJA`^K_+ihkB{}Z<=CvS*+|%`o(}eT0IT6rJ-TL z(5}J%^x~r87{Kz#Aq4H7pW^{SVk|5y0F1n`@!@tb1rFlf$qA$7geY3{r*=4LrCFUu z(-B2Y$VkgFJtEGShId_`QQZQjpQDU&KqtmkMvVORvYHw}7Rau-t0s)(FFbd&x<-lrlO9}_=Ciy|Hxg&ir&$v(9#rAT(|&;V@Q z`p0TAWIl`_N>XR9iWNQm$anUp{k@D#hzd_1JFN_EY0C?yWedk1!+Ldk3vVJs#A#Q% zWBZEJx$4p69g^46ks9d>&GZht1Tj>c&a(vMKP%C0A3iXRX!-{8`{!KsR-?Z#oTBpf znbGMxIHOqpFdhF=4Dog(v*yIPvpd$jH*Cf0cFholjk7l(jR57!6z-a&aecblj*X2~|Gu`o?4tRrb$w%D!4Yunn=O?2ycwkjhEj6hFSS zB5Q#T^A~Ldo=T6cG3D$gxW6)@?sSwct%QDjWa-(%bz~v9C-Lys@GmGvp?{l+1~3N__|R-A_`)qVcwG9aGv7H}-Eo z{`J-whhB0!hVwYyJ)l0T@U@8>L?Fe$NDBCB<)GyQ5O8uuqkgcmYO49|vS&`JP$gt% zXIEEO15$CoWy(Qo37|4qn*s45-&uZ>;Uq&wrl1V@7X8?o9{ZOr<%c{h_kw&zBPY`l%NBCA(?YTtB!BVjEz*v|JLKB0Z0}d^Um_0UO>)zp z1Ev-a%sCpUozI$tIQ!-8ZU$=$zs56CqY-~tLD9Q8DSTv<6L?94xLCiHT?0G85 zCzBD5uz_FlKeqS4wKJD$77UKv8I%50aI`y(zvd@ysf{M7*L1ADkN!GuOWN5LY$uLe zRV`0;d(>qKZLTMLFZD`{%^l>qiWbM-8%vD7! zgF1qE_Hh!l7QwxG8-lV3XEe!uLLoDB3CX#m&f#dKEB&s_QrX zQu}0z9BJ6clYJXpV+ptXE`cQaief~ITvb%Sh1rIb!cOD3pn%8cQTuux zFbLs3W_fZ{Q<8J|^5g=)I=3IJfgLdrQ@sNKTS!Ro8uR79+nYduc&~zXn?3EgMarb* z+9}+mf0YdQ{QGLqMBwLMT+BIQAEowCvgV~f{mhN(E9=ke$#@OGSqG77hS=OkU{lvp z=Vrma3O}FZLDGc9u5+PKhPFaXNbUVa+tIEsE4;ENNs<%j)56~?N!yh=hoHN=3Bx3F zN{9}&%>JCK&a+I8-sOfQzKclzWa2vKjx%rI6lF4K8lX+(oTxu>cTB?CHQ9Od6=-&! zfL9mG##|?P*>E!OmHS-<6%kS?_%B=QC5Wd&-yxYT6P9eKX_6ix9m&gf84h^&6gzO2W5-?xB7|M$& zcNiVzeG|dpLy637>zbzCnDxJ)?@%=q{spHd#&2IYC8vZ&WHXm-hu<(NV4P$cJPYA7 zErDK?0*QfULqJn$SBDRamd7ZcqRe~fauNcLbyA+r5lppfh1 z{X`CUvM`!boXpa;LNxm2N6zt~*_bi57$Dttqex6zqLI|Jx5!0SJ)d2Re^CoocnzL| z4z)It4bw&rsN>qWd`J#mv{uL`*=(~f_vIBcxEXYnJ7wOjg|cMap7h+ zL~ZK`0)or_UdFuqy|>8sWqr-F@R$ol-1D;U8x8bv2RK~5ivS#3z`@zSjO4Q`nTlB) z9y6I?MrKalo^D^(GYBgIGH@KTc$ab5SoFPur_ikEB*yf1nuNo_Lb+hhW334(B3uS5 zBQ6dc#OB&e8 z^ByGq_8^+X=OZa*sU_}gs+RCg<4_^TW&A~=W6#yly(cUciGzAF(t~ta z1j5%Lg!w~Pye8=@>i*Ny;PZ@1153lH6wC>(nJOOc!&19mTY~xEF7aTvn*GO`9nOS7 zQq=WU$hHI$0L0zmI&_qyjCWzCSX^Wy9I_afg6}$qiJ12fgg|tlwM<_(Hnu7+6c&Tb z%b+I;7g9KO6&a>rxLiUyE_q8!i;bQLQzD(7vzcytdkbqOGmziW;PB|v@WMbJ=1>Pq z7_-}EbfZU)wWbo-zJ-t!vHDa<6A(84!SxdfP>knXDP5Qj?>A?Op{cNaspV~4)~V@E zA_UQ~?sl3u@3C>8$vZtP0tHz^3XL;X3@oml6~7D5JrxskJRAd|{34oc`xqm>dOWsP zR|2N7jf{RI_{G30#)HVuvSM4}y{BF61 z_nbl@$n``uB325*CDkeOqj(`FA_f0!_#ebZ{B|R55 z0O@AUSW{Y=6c}4m82qv)*fGM#&`A+^luGCR`f?Z`3Z}vFkP}{ZM|=?bnTlDG)r$p$ z3qn7@mk<+-GJwZ*7=>A(&hh=4wGf^-{Zg=!_o>TSrsNhEjoe{&AS$$a0Y;DqlG0Z~ zV_g@umrERr5p+hvqDA#Bi%G#> z1RJe~I;bUKA@75$yP{EZvN{4_AYEDiog7=g!g*x|GKAT1C2hQxfjm{XgFEN@#m>i( znOEneZ}qeNAo0P@^;9W6Z7m@UU2UVcy5dZdCrQzmM3_0od8kYVdC}d50hK8G`!L4f z@~}Djw_@8e{$GmQefy{wbe&0rNNM7`43vwDz%4G+zjB4HsqXK%o?cim{YNz9?UTfQ z{rY#!1SAU2ZygwTHsqPJPT*+dhb`wj`czS0ELuQ71mS=hl`R?g-T>X~G{K;sC!ip` zp#Q!oGiA=KpD&Yf2Nx^t0_ZdFf3euhlwGYL9?^jec;W`)H4vl!%a;FF<wntkb$+{;Ps&g2ZIF0cTjp6jXXnd6|I93XQ%mT+Z4zk7dKZ^hhyBMJ^k4)I z+uS$MtxCv$?GhDsX)~)Exn=Mp^*b7DXb$kTtBqFlbab9K!xW!gdeCXZ`k~=>?swD6 zY;+GBZl$?7Z@asKP=(4~T|oqvRjM?CnqNUaZ2vXL1-s~muLO`G_WrL<3RvD){>SAF zXeRHUz!Lqhy>z1g??Xucr$d^Qex#1;GvyZ;a$2r6>6@A=OG)V|FGvL@;t5bl>r7c{k0C=P`;+cwc8I(0sS>yy(;<2)H*%EfF6jtcHxAR5D!w> zmiz@jJSYhGmw!{2P6sHtE&N=++mKz>(7>!^Sd%NB3l9&+&~o0EzAOTuO6~3MBg8+EUhpID|G7-x++ees zqJ`#odZvM{eV-(8UcPau*EWA$?DhJTAL*u9Pr!R9vdJCv|6UY)KM?f|8d~(}eCb1J zIQ&x`GiQ4XT$L82D;?O$1WrXpP97K-h|m)$516pe%%r5GxMJX8jmA7Xb7xdmR_20j zZ*K$HkK*EDbctd9i*JSgl4)-ljgv9!6k#c2k>4zT5)FrBUw|>`GMnV=;=8PDQR`}0 zo=n1~vpo1Pq^Mhs^VAV|QW@SlNgS%Um`;utYfpnx5QYsZ?s{rt#;B}Ieo z@!0_03yA`Sbs7o%t79|38+Z|KAVky40y%M!@6L zV@kHtpkZaLEh{@1OK$5fo+q&05sGYm4gU8_yf{7)@$2((7|qH9|6S5AVQHZX0Uciu zOZ+Q0H&BpYgpr8<-mf)KA`=D!LHZ1ll@^7E#fAmmga0KaBo6`tmJ0l7{fA1lpI2i6 z0d-^iCG=C#IqfVR+Fen2XRz^cL;VNO@|^%IQM^A$Hi=ZIrVtO$eWg)zZJKN1ZQE?E z({!z0mc0N)eDns_u|aM7<4fjxKyWZ2EUEuNYmFbbmAe7}6Ec`NbriHeALPjTWRB#7_dLkavYSH8mV zx$;vZ)X|}qLSp#ZP_v3BT}WNW0UI!|eYHjZcVPDmcLq`vMI=6(GZKpI)HIoWixBxJ z{O~qCsGCl0Ge2JClmkdLBjz1?*m2UcTQsW;=XrN6FW!RjT?YF!6712fOWp7K=_1jz zi9U9I5C$nylrBW%c*ks62C7d=G!!vDz)mnGSd|7rLl8aeSK%xG#!;n#8tq0AVz2{& z8PD<4$VLs~C&!eXCPKy4aTgSagJY2`^PYz!p z4t3U4m-dT$;kOhKy=XDCEg?uS#wXDHFNmVvokVy7xs1--y!Nt$D*8;2#`4A~!}{7B zJotkA83X1&ewU*Q$xfFm+ljqu(g7auA`myQgcN&UArnWTg92Z=$Pt3@^uf9|b+ksn zJ-3KwjajP7SI;44ow=J_^$8yUt5Q-FAUEh|hTrmc3)Zg`e!*8wH@ce34Mu;B5mW(d z=$?N_$*(gws~?UQwBmQMBAA3lwQ8Ai>f%?$fznx%Zl+WKj=bWdqsO2MM^4zNK}XQ^ zv+A3*pEI`-h^uhQMK#<$Kvc&>%KNH$ekcOH-s5tf8z~Km{^s=D3Ec`kN zkD-|elSX~op-?OtFn!{nuX}D(JAp-&6nld}^u+KwU25s?y-UJ-Poe=E9BS&xXmDZxADee1VTO+Ztf_ z%ij{wyZv)Tim*$5IfS2qKm-zXdfMi&%$5_cg1_}AM)Z|z;N-4NsUit%f0c46BPLh` z0vA`%npx<4OeSuN04w42^hpG-=YRlDW&1X zS+7*d86{!> zWG1p(2Mg{;(%0B&OkQm?^L4m0R#4JhQWVG^4uNkr449JU<~z$0z6A7u!!Fm=Bmboo zxuBQVot=!JAoSG>c^p2bC*c*7TAM5-Y22_qXZqkSXm!veslGcHaDFTp4^Q|$ zoV-}+!dkXqfo!-Ho5iUq*`h8D8U$$H@xwt8Q6pP+_Yl&wK~xCTL4Hu9s(TbzbO(V7 zgstw}>7y--6iAee_;~b}aO5!`Q77vvE90U~<2f~&g*XZvQ4y$fM{4U^WaMqa%3(w1 zUEsB|;~fHBD@2T}JSI4RTXYn?`9;od)n2?STG5e7U z4IMOQh?7c-1l#Y-4S1`fJ6{wPsdA=cy=lSVnf~TpFaq&;ljHZauS+n{*OwF-&<7^& z?em?hg_Bc|0Atx=YNO>kAJdFXer#_KDgSP7Z~pM`FfIag5m(jam9V!47JBB47f7 z`FFg5V!{OicsBr+JEfwJ9g!iT_XXmQhNYs2$R9;TjiT3D9Smyrq8+3mN?=&MbqPs^ zo8RnVZCTX(rd?k@@9IlRU^U-p!wa|(6&AjFZfk0Ks;g5(3GpA?{X@bvWB@_+;s7sZ z?~Tlc9bwzt2DtR*?#8d4S1)UDXHYUSdOVzQV@FKvepxoBv;T%PWCan-5+g>8g1mK) z4BM|zi2fgLuR^&rUfe}ca6X2_01Y;zJ4-r~mzI$+1{jpf=9K5rdwra3Ai)T!-a`9mpaUFVArw$g-b|~NI<>A= zL_|auw#5u~xzG2<)ggU%0bd$Ax*rr2K_a<6j|hpLKRpQ;hCAp$j$s&fx*{L%@6)-} zDrAf5e)EI~Nr;J2Q;nd(^vRn*m&nR>O0YqPa&%4dR$|^~N7uaFGn^#E{ z7k{v8E_-`>1AwgfQP6xrei~G=(-bt>2+BU8i;IhmP{z#3=3qZDlO;zdGYP(Z6U_(i zA+T9?cKv31$Jxt0_T3_rpF^JGnEsNES)GO2*D-4%y__9WqpJ_?gNF4F^pkmOYi-!) zPBXB~si>%2??$=7K{=S41Kla2rG+2X4+~GvwGb1a0p2y|o&$#bK6L}&Q&(12PEN3!HGbt*2lQ0!>?je(#1HFt zGfE76_ssODdP{fu1pIBo$i&8mQoTmo>38NG$lRO~JzpDd1{U1#U0p4iFzmWrm4YfN z&$WxZGE@LhJ?4e6oT;UzH%0zQ;AMaE>#>UEs;)Rms8Wy0?dPwGx^AfiFNN%oniFR zijEekx?@Ns0fEq9RHm_s2}O)CliJEk{nuxAqPQ;-hZR`i>!OY4T)xPYE$0K@zUUqt z=Tov|j16Zv9NrMQAtD@JzpQO(-oKWSNQoj^(J!|*TXu!;N9)=hPO7&!T3WV!`UZJx zv_gnN4+QtiU!`)`c?t?TxID*%hMwHr?YZ0@1VDKZoU#iHAOmf~WBy|mSP%f5nS?~D zvRP<&e7S11G`R$M%uqIH&mgC7^k$@8Rc(X1NvM`;JaIv0Z6xJb+cW*;3$iL4uWX#< z3D@-pz{6%2noMuARlrJUA$)f$(Nv=Hns|JV@D$ z?=-BQX%VE5pu|icrj+wr4{bTO6apSzs4+q5$ zS=TbT!>%|DIyBe_fy@to(1?MY=qgf2U%x@rn;XNvelmRSrq@}S&cDos)&t>KLd53p zuI=F8Jlb|`n}7fQ-C(gwmsFaY8@EudPLd$fGg2D@7BixwbHzKKwRUhThs4*Y=2`iR zxok$=ct;37*;}y4Y_#E{$w8)ZngZ!7t{^K92~@)Huw(N8Jz8(|VM3m^CQH1YDv z^~D0p0}-YPI$N95l^^ZTjaDP>ryutdHE@o-4~QSP!%q0WJf%POiUXMAdj6)I&}(_# zMj+>QpOZbkd*;rc+`jT_O&&htlqF7A7!sml(x9itF((LQUo7A9B(%5<$M#qChMZy* z9qpnO&VFIq5RJsOYo4N3E(?oH?4DRBC%p@PTdpN%^QiGUjdBxqqK(W(kx|K0eL=YV z@H8?Zp*8R@jrZQVI4!DFS?#^>xJsy36JS9(eq4TmhfSY2xpqbNv3>Opb!+3*V4yEz zQ*Xnd9}bd);2()jOZ&rwB_aMpfpTwWM^_cgX&p>hms^)9xxs1^P{PDTN3)v9hX+5oroY(_5T~{&bedhkn12*!Iizd4+L12l!TEL)x~8N!oHYN4TTEa22X!uy7L*eKF0x z3^d>i6B^py{y9a)KSf0qG&R%t3B8X8?!N$|B4FA4;lnV%*F;&wy4xlN0 z;nZ56Z+QlY>}wm-`J{>Qg3rhB`@@EOSN3bBx5prqEPfOP97dIMtLgR)l+-+vfrh{S z3elT<>`v}CeQ`&}did_>(R~=UWDdljULYz157ern&`ePL!UUqu?Hj;EPfve0TihUt z;pgb=;NKqN-WG{=@&#q3M3us&{H5N?*cw&N=iy`$!c9X4D|Tez)_x&^2Jl8O1Fm?J;aZv z=>Lu>oCOk3F5K)#U=X$(*RE@na1V{{S?9N|?|^;FiaFT@!0^OdjS}KyW@i2)_qZz@eUYtRLdY|95>VGpXAU8+Cgh%-b z<>)}GCn0NRS*4Y`rRWt*j>&{|7O^;HKHX(zTE>(=Kg9?q3#}PABzk6MUmgX0dV;gw zcP!0?v9jL(T|xA^yMd+!>X*pLUu*|sHHVV?te0xKmVuNr#n`=SR^c_a#uJQa?O0!{;cO=SYz$aDWi>n$<}AB! zrV&q=xws)>aQ>kpMv<}V&^%ZGskM11N_eHnm>D#fC6J0$Z`vucvB?!27A?zI2;Fo2 z8||ISP6u`}F;p$P_0mpV%C%m%sj)E$4|#YHIHxN&B^z6+Ejqw>bCl*-3H#q^fj2elgEzqKQVTx(A9| zMCI^6Zq&2GROqA^0{E6|X!(9erB<`l>_3bVl_r!%2aH)4FT)8v_MKtL_l6T&#Nh_R+ zwNIXL_EKX{1n8h-g9^<|?>HA{TRi}67raS)D zwH>1Y$#h1i{TuZfJ>e&vlYJ*O&eN!~<=ftFy+IK;gfvPE$LThl#0_kp6AoAX&nnBT z)7C@ID1z3{1dOEpft|LO2ESIvv(=iyw(b)FyBymCS}jhi1Kd#C%a0n@b+LZ7PtPjX z$@0mLd+V~&Loov~Y>DDGo8B0NgtDW_C?03(!I>JP%?T1{&!TgvW@s8N8jF{n`q6{& zPz**NbM-xkAZjYcz2Fa2?SwRTCjDJfnT&et<&>Q>7OIaML@k61pV56zS9@)X^Xs&< zI{+I!Wn4Gvi8fRZ34}@^K%l6gFxu_c%8tt$AwqC^q(Q`O$%Y+ZeN->risM6M<7_^X zpXZ1lg>zhI3U7!L`Tam%dX+p?tD+tP>YK2_Gx0z(xcCaZZ3IUZy6|>ba^a#YE>ya5 zemvrcFkDRZv-&`(ty;ZiJ+wq5?vdQeQA{)Q*Mq}65d}YWSDKQE#G2e7ryqzMNHDt2 zD`UQDwX?)a#!-TWa;h;bUxM(l%?2yZH`$E1;zt65p;({=2FB-sb3_Eo$I0>{Fr) z;gi5*FgO`N;TaD_=i8&#hN%bzo%VH-7{cgl_2gsGg_g4az|ItG{&S@%|+tEBiU3TgZr(wlzy(5;Av5+ zKh8MGL5L-4keOl1>!`8;+Mqr8b;xv>P1H)TOFM@rsH)T+T5|=Th`hX8Wb>zu~!8Q=9_Y>ZljPF7Kp|m z@iwj=-|oP91eJ2m<8$+|GIRM#2rsk3!zZ-Ek_7hrn)r*|jc`;n$}X#}azH9lMBTCJ zVeA$bh?byLr@wrYla?lD(E;+qVRd+g6D~ueV?Pdj{H7`Sk=yq3e0wO{FGxJ{Y}2-^ zdNCq@&~RL{-r2-c8iAT}O$(`<#7zS6P4@TVzK{Y5^I_R<_ujcQb0?KwYQ5jrb)H2h z?^UFmU#;lZ)A?Jsx@J5xB@|wtQ!A~CkN$-9+Y>uBxz2h;z5T7fxkRkU5Mgw5e;zJv zr3y55|A9PICF)^5d)xZ(<~*sbof%m9^t7I&_$7+ZY0=hGcBPF@;x;5=(0B~MQ9?SM zUC?e`9jvCZu;WMggNa;TsZ5@2FzoIg%ZEoKORu};*8{^iYvU^x!+epp zo3~T-hI1(yEsE=V{FS>-WyP14&Nn?xPdM0sJJmySp;|4^{a3&0WG|{Tq9^A{E*hhW z*yR`>VkZX`1EoWxf-M;{m2ab0lzDojsoihp{zs(ZhUf>1majikqX7$nH(Vx$H6Jhw zT-JuIjKNPPVevU%muDh2GTm{!FcsPiT9^ZY`eNeyF7Whr@E<{8!Z3AMS1;FNbvbVM z9em7bAvdoDg|IyI9c>1)KE*EA!&~SYcgUacAZ8VdW)k8Jj!un2!oL>ETX~3xKo@3z z3II1<+I<596Pem?ou3}{UVQmkI`{#$L|(U|*RNxt1MjPiXS`LVF8rs$I;u0_IUN1h zH2Ryx-A5d!2YJ72j4OqeUiV88&3_zx9BzIl$I(ETl+@U)c51z{IF9qhp*(9QY@S;x zY^U#il+Z`jQJZ_Z+FtnL9LU_;U#_=&sxDR`gb?+OwR~>3T8@Y4sJ+T~zCY~Fw_F7W z@1+SNNtXRx^ zZV^c2I&5%|kh3I|Ap7)qww|S>U#rzcpXG8sYE}98*bliH%SpXZ^}qk!a`M>uK9c={ zlc|NdYu%zrS;vrT{JiGNjekun)x<6Bu^-vkL22>p_d}zRr6y$-s-&QScE{()H7eKd zLekLv{6QQ}l7jWmsg`fL(F?7#`>B~8*S%IUEccSqqQ50MBl_(gHe`!3H@KqA@=Oma zet_S0c(qqE!~|V&rigz4k|Zwb6CAr-Lw1?-x0}()z~)tA9Zgz@x5gG z6eEEL`sCIj%9@AQf>L11C28@LG&9q3&5in2sb>Q!7pe{3ez%z6f$?ntkoSW>aH)#b zH8h664!wy)_R5>h-s_BiKm{N%gjg8hbYkLH5ti40l(m`k zzlo9KZ%0K}y^U;i0%X}rw+T|Lg2E0@@4n&Gj8wQiZtG(P|KPjh<`|p?d;C*{^|7D! ziVIk|g;JTxsL^&vAcBTuhv)^hABzieTxl^6w7Oz-JcjNFRKad zK-%R*pTYr4##a{X^n?UR6h8v5wU=e1Ld&M@0v+f}l|06V)urb9-OkQ-87{N&&vrIF z6s$j%>^Iki+MTP|1i8m1#g1f#WH68rm4FniTEW6;PNm^aIszjasbE1bpA(m!gezvx zu2lWe!r6>~T6emHOZ#K*(!D=~Ufb)`55pAk8(q`=2F3?&;6g%@``be!!Fh;G6vj7* zxAs-5+`fwT!)cD@X=l=&nS@9njIXCQPErnyeAUz3v$=cKl!g$A{Xd9%r|`JjH-0d- zZL4W)+cugsZfsjk8fTIwX`G4C*mh%1Y}+<=-rs)@_h9#E&*r*D5AOT^KKQ_G5gUO2 zPfc4UtbTv?viSm#b9+R6>Nt|jA%ei{<-+`EAa?j{uNCkncq@a>9~-xLDf(??O%eFm(?&R=0mv(phe zjdoqBz8DHTm&ig#QE6B+0B5$GeZQ+@V?|-j=yR>dxG&-WwHFP=Wkv9vQy1aIKJ^wn=9xn;1I>Rw0f+UUzC6S`W0Wv z@1$y;SEd$G45ko^MOKZ<>s56*V(dg=CHa<5NY-yaT#(i1m;2&kBf)`6pHJIq#=exe zOFmBFX~?Jzt4^|r*Far(eG8uyisMCZ=j(oFtj(>iiXvvP7RC?zjc)VTNR`6}ir^6m z%wfzgZmz!zpSG40`stOYMoVAnigX>uFzZ>2c$ErolH6vgTL_qRq!!7nZH_g6Rc7%E ziuWOafwihESy|df+B0+O5d^juiOBdOLV~n!?!5lVky-g2Yd3Y|8Gc&nhjfqK@#NdJ z!(eN@hDhr~lR3PCFC;cXtKSkXAZ>ga3rctz_$%CnD->G&{6u1aJ zH+K{f`;*c8xRpiEpqEGRl+pUWG)P6Uu{4*;g*va?!DSCx95KE=6yW{-QF?JTqR=_8 zf8Bzplp$dU-9GfOLVV^)6#K1ldCj4wtqE>;NpVCRge+!wzDfi#OPBh_26EXTPf4xn-5rnJC{~dAPE3?6u9Bza*Xdn|jOE zZ6pu>-=zmZgD+F!5JiI8R^sci$ZMw~IbGlh^JiM;M)^5oHQ&NAuU61o1nWkiVqXvk zibt;kO85C(;?(BH;_I(8ePrGJ{XKlke@ONLMb*Myk0LS4$8hk7LIh;hizYmNvhCWB z`f+d(TeDXXIPzjWU56uaZ2lKz;VR zL_URHR`7uOu{|E-SB3O?OAkn9Ewru2bnbuvNz3@;m_;Kwkhd>gU@eWDSkz)RIY; zV^7~z;%=S4l@Hd8q0m!-@i7eL&G|wQhSQOO|G2p?>!ouc!Iq)PaElJM=m-aC&R*E zIG(8rZpEwIa`OSkax^o)X%$^vT@@4o7n|KhO-&?`z7i6QDGJ>v{O*8NTTuF%5?r>g zC$&Cc3@(hD!_D$-5S!U!UKmF;4lT3JV!=K1um?2JNa~Q22Nx%3tL_Lz7=!lh&cyG> z9bwcUc1Tt}W|;auG**nr81TtIuybVZI{SHa?6N7Nf(1W3a>(drtCkNcTdGK}Jy{`1 z(8zsd^L3r4e*V~GTF>HFqC(>XV~Utge{CM$lQ2)xfT_7!SdJ`roWKj6>RF%yz5r~VONEL|0nQj2z}1WZL#xZ^6wb|QFxfR&#JG#XFX`!mGWm< zy-s($lrR5+48$IFgHUvr>r%M2)5UHQN=wb?WA ze5ceME-}kcHqy|OqDsQxlLSg?d$~KEL)eZ&eTk8Ko!3AmNoU2VLl}y6tdPqXriJZ$ z{{B+D>&K|VUym=hL<9F{IGgJhF7VlIGXNAu6;_>@-7l0~1f`$U&=MB6Pisu3hycVI z8_a$4bXXna1un0A_1{Xzw=y)@gGBj*aO2F7sb0cOq@>4)>ZR^=!gjwvS}Kqtz@HT& z#<#!Uu2|ky1Pdq(16|R`e7qUl5CNCppJPT3xO6By|KwyO{VXgLOr1i6_uW8 z{dj*^bQ0M}!BZTh=x|gXyG}YPOpl4CN4}z#=xVO8SuJtWE1CNCJ&jQzI{wM!@l(Wi zeIbjY*F3=}qO7qF2;^jC*N^}?TQ?*owTt?1&T!fFGRL}c`17^t5wYYtGOu3e;WX3z zto$n!*wI*2F(o0EhAL3_FA@<=c112)&_4Sj$XzZGR z*Hl{Cxwp6UvNC-VH1xO+X!2IG8XQJ|JXZ$+?>PTPUBAXZRPIwUuR#^vo3v4 zRC3p3$a&TACBW?|jz&PM(OY zld#a5oCs%V&fhZ&1UlNn-2N6_9#E&wHjr%w6-+X?PXA{*<8!zk4 zb49R1P<`enD~(pb4dSVMP^XkLy`g8p!bKc4f$ypSk=MEKTA|c+HVaeAh!q<%Gd&<# zxo!X{0qy%P=#nU6-7;$(x5D+IfTTagK;-YTql+jPr#emx;?H-1%m_^8;_W5OR%sjf zhqLF0Y=SyLL8LvJHELzr&(|kTkF$*NXX`sy4R0EL%62xtnMrbtAp4xG|A;l|Q%R_vwE5`;EZgq`R>6 z`1Dh{$LY!OHcuEevWFjYhmQ4i>}Iuu9-)@Sa5A)&zA0IUbR!S<~EzbHgMfBS_ zZzkG#8G_E!tVNQOzuCJ3zlO-~-|4*cud4<3@aXz9Hn$}Sd?5BHd%WZEdz!(ijzga8 z?Nf)>?)R4FuX8Z_6()?9GnxP@bMZfBK(o_C>f1TLHl;PQRW zxxFt z(lIzce$d<5jVUN9<`-adaJZVAgYTiC*hW&bf@FWwTocNd4Vy=JEhs5Z#pM=+5IrQ5 zFLf4aDj2nuvT;{C&k}DsUfh{bFAj&{Ac^qP|9N=mx?FWBB|ODSqgitjC1WF}s~k7&)8TgsGJO)SJVh^Kt7&*Rt=#TGj4VEoS=sn@$a7{9xDnZ zJ%Kv`XdTnD8mD5D4x$^h)wJ9cKof7=jO@agd^+|!-zFxFR?wm!4n*kRGf|mtJv9NM z+TQx~$9BB&ZEeA!gN=0It7iUe_6m=F{-mpx@4wa(YH<1NCa&>!!*6%)4}DkQdsMOc ztklQkf{6RzTtg_1)sTrcy4iNtzSkYv+v$4H+BI2%0?8Ndb_yO!{awNJVpQ2w=C)(V zqQmTJBg4-x90{FQek0pu(x;b3w7YDP70bNUK~S&v5l%vW#53fjDUW$&>La{s?H3O? zn9rg3DDtrk9WLuh!_^xfS3s|zBjf|JX&M*%Yv4ll)bC#+jFM(w`pRN1gMt@m(**=-A`zE0x7=5Yvi&P#Zw*UXoSk+ zxrhU^x|^RZr9K#n`<(I=ht3-sXR~Uwgo=)VS(M6>wi$MU5j|MH+4#FnOdU}K@1&>` z8B|7Z;DPC#lP&_9k$s6r7FZ`rJdojo@~%#Pd^XGP7qgXk(=bFoNjfsURX#EfEs&wF zhcJ%av4-88>F_sG68v_pUpvJb;j(eOIhMaP3xAA6M?lF^s_9GZ-30xcl*S||L~`~=4u+i_lXtxV27y0Z0`cAmBE%5uDzDWN?2x8W#>K=`(c-Nl zDG8nM5JxOZm2@mGpZ?`b5*ULUH`r20szIA{$ZEuXb*wuj3Zg7F3Dr)3{$@Y9GQdlN z#INIL%eCF;BnYb4u|$mWX8MzzkP^M(t08HSmi|YsT`s(N_V$*?bi;&Q5J@aI3adW7 zsp+!&)ZH(D#&l=AJ*V3ago1Xw1E7*KD%xhpIXJRe6HJtkG%Ciq-!@v=){SL0XS z8=5lwd}CI$L>eZ*;di_~SKUtkeD!>MAPUIcRDt4cyPC9e>N1TFlW`e!bw#!i)jC_X zok7Mz+GXK6A6&A%5>>0L1&5LcCeV1}|VEnKyu_Ia2&b)6zAR&AMC7+w>(=wy177?t9ZL^WVt) zv^@fwnq7RZFE)dus-vz}O{mWjb|4FRd)tOcpKB~s93CF8d2`V5GjqU(S~(<+5k?9g z{r;PKCFoyi7VhI=mX#e>A||)ZHFOf*rz>te?)Q!p&<^lB>9@fO55f{F2G}t&Mml_<7*a+ENFspv)^6{Bv zsSUlw0OC(3TfvsuZn7bN1$7Fp>}rI2cN5u!VjA}k4j_-XFSRUXLSXxP)D<8Qo$$nY z@z~wd%gfWF5f%OM@vb3B&bv%YLyL=+nK^F45}Gn1p2Sr@7yxQSN>_?Us`I|y0S`VH zmNwlAR ziRLBi&vy;=e@tL}zFvw7VkmPQ5BkxC7YBrVj6y%7kfcwPyjLWzIxV8uFhv?i^kBG_ z;gDVW7fkFNL-kgBWyF*q!W^Dn5{2h+c$b`~3{~mal2qLW+2aX>rHv8D7BsXfozr)% z*6fDOUwj-5}e{emqC8rjwaOU}XeD^idysJThldTzgBdCCLqzE22Jmsa({yujTP;JSpXBuUxciw(l~bC1Zp`jY z*!;G?`y=S%-qFe#2l5a~`LLRHI(E20$=1tjs4F|Av$N#oMFkT<4=rL~zb+;kFU)ob ztjzG1OyasvKwc)ahYnpqz$^zwgXV*m4M@^pdu3HsRpp7^nVIkYU11}8bach?G}|;- z=@NNnwcTYuC&x(Sb^1_w-)UFLCFwujdixV-|FZam1EQ!d<%`z4O3F2o=(#;`oz$&6KmJ`?saqr$Q&D-?V=9 z92y#onyK{dT(O=bj3WvO#>d7^%Jh>oGo$h*55bqs8|>{2HiQ?G23m)a1oK6LQ5azK zIT$+8tgEAQzB~(d1WlAva&@)T(jrM3K|_uyoMo*PUMGi?Pf_~v%_j%fnn~FACFAH= zmznM`I6qwZtC8UO4&)G~SdD4fxi*+_W58q?Zl+hDe(avHu<$D{&xiy~nGV~A%T__b z)%FBy3k=$YOHl|nB5}P3V@47o4}x)F_0m`1-7f#@*4ICU3Y{&SheK_BShIi3k%b$extiCU`h}U(ibem+1c5h zot;u~Zy_@KTr@(b9{L-BaMFL5k0phLU`(CB((-_sn_Im^p1p%GI~$vIGZ>RVnL0*~ zAt#hW!NZd{gl)z~VGc3FKAxu4FG&$Z0;bR0`v${4KKna1E3%NEot}cZYd!JAaRROW z5KITRK4RUlPznm8Szzzht1D-y5Dfpb+AUW1?F1KOa0iJJc(y}>Z3MExko+(NK3o$u zuAZ({`=*VJjg^(Q;^L&&$Iqi%*q7-oXBZcksM=aY93<2ufp7^}#~eAKW>z!=i!77c zG$y?Iep9bjL$S$_b4Mp94aR*>u-z^l7=2DLYihcaoV<5*BxHtx7SV6QmJ1tU=++~P z=gLAMjf@Oc%*nxl$D{`_Bc4EnhK}y#;W4sLt#c|TEgb~D?Hw>1+Leb2N$cN+_5c?( zdmdg!#&{L0Uu`XjO*hj0u71NQ{ktx&lAY%;pwq@4PcXs5vVO#}K9n9mvRS9xwH*xl zRHndyz{N)>jf(Q=2_LiIU`#>E(J<+ft#85@Zba5{9}e$UNc62nsT;8gG6ZtlM7~TdZx@Ebynf-R`*>; z_n}Rq)*WG0;iIG=ZpO{nLy$`}qD)P%CGs$Y5)4^*rym_^_W6fJpqL}(Hxf?a!HkD7 zv7>@!&~i;p4VVH7(g#;vHHJA`?lg!p&IJET9b)_VLhj57IhtQ`H0s+W($Tnh3LOO9Kj$Yzi3^V{)&bUJ z3LfFfgvKL@Vi&$lR&HBdHRZxMfQ)!ePZeZIYf*F7aS)pz1CELDz=lzt{ci=?uzrXm`U&kG%Eq) zFlwU@83_qYym0}@mWzl&NZ@;r?&2{XNbFwn=K=)x%<)~`_i&MMXlxiLL<@vqY8X=~ zsxLrRlDK((>K`GrFi_X2`F=sIIjPA&tD09M`jR3rZ&#Uc} z+#rI1z^1`Me1jbouH}@$7=D6e6xjO~jXytd z+w(|?9eg*T!r3_WAc_m9|;p7(Qc|vrfoVn)=aT!wv zzYAZcLj}P8_E*7#Vw-hVazwCz0>>OwD_>sKzd->!3^2L$KZ*|p_yq?hIDJCIz%*AW zFf|Ycj7_D$hAce-zXKJb1oQv>L$Szjfk9SQCEqGPs0H&hz+~;Rnivm+y%!kpuXC_m zJ^K@jeAX%N7u7y@JE8L=>N6d;``}?r!%23d9q@>Mj@*u*F%9OhHye@%#dp9!&e;U#-5UwPjFaw)s zw;R$Mso(oaxydpUC(Q8h@CN_=`)?fRXu!jgP%dR;WaRJPAyEcaK^N55ujI*?uqBrM zLmjJB=qAM!f)ge6k@$`+H}^(+`WDzdbqX5xiz9j#Gl-K0F&AUk9ZaPQ{BYIKzyeN{ z%pRwn#{Sn_sQ)#$$E;RN%}2<{OrkFucMM$pJd~9W%Pt}yBVTHEz(BjL$5b1p3y{F{=QvaZ46pkS!tbYfnU8m!4o(h z0**;T?O@CyxI8rmaF#kY8x(-RIs{s}x~XKW{OavP+x^m(I0|N(BknxmBhqf_xl9e5O&L4IA6sJ8F9IPGu;1~fPM1#W%i{e}&PmKbDhMs=Y zdp8a#JiqR5TX{*j#}H%z@fglfos{~_KYOf{sDYhCai0g@HL_IAY7&yO(s{sL8m_RZ zp{=iy)?4xqeSLi{qBtqAy(qZ35&!#XGLtnIaWHL8iO#Lnu)n`w63mbBxc{NO`pZ_) zkRhMTCz?-SV7~^nLA$Jt_zHm@C~lY`%FolJ$Cwf-)JtCR3mn3W0{_jO3w*-E@bEDB zKrt&TtI=)(thTq0n1lv~A}oQJ zibL-MpWSF^tT}pldGV$w;6_PJ$4gQq7=xLcP^~=R+2csJuP}!U5gTOvf1f}WLR*c* zah^`rM9QYqE>>QThv4F;bD7RBl&&%eypS3`bkS$hLH{*QK~aGhvl=0mKW)KC8X@y! zi1%{<7a^>mhM}e2^U!UX2`_@454EXq%XBjo8|r`chGXza_+SD1wd;A)3jPHCjEqT? z(Qf`l@DH9v?MMjCicPXE>BdX<6d3ob-HM3-#oOUM&?fk2Dtb#j7>#)Kq4Q?4BtX5~ z>Coe&<$mbK2wl{4lo@Oj$hOuJaLfC->M3zLIH2RU*yt8xBsgq3AF>FhV}RJ_{QarLsL1O5E0Jk++>0KW#SW> ztfDPc+18rp%U5rT#0u7Ru+qq`?18Br&(pH3pAKSnLC4$kSR6B_Y!3}OsmZpOU)1xH zcla?!qkl8A3WGY86=>WF>cC*uJ6)&Er<{IyoDO#p@b5@5ZyDPz_UfR9t}aKhPALgGSkJ8oO!e_}FA>kNHK|a= z*6&+^cl)H&wO-vfOQOXxI}`8p$LO1l%>``++tK2u=#K9v2}a(h*i%C7LfAiLR#MJ4 z1Dw>I;e`&dF^>jd+n=C!EdQ3!6 z@*}Ue$iQU`8ai08QsL{V!sA)F7GXA6IN|UXxB(eIESIUCfGv&U&LtP4pnzkVIa4yB zn1rP!2a|}ML?r)`r%?_fu59Q!>5P+;ihb8Q7IY#`lJ3RTHHUStTw290tR2;v_fTA-O zSV!_HFdw#mO?7Q(Y*aysf0vQ&Hl!ryx&A%10!b8pa6_P{RZ2z@B~y^dg_q=7JQl=7 z^z(}Pe+87sW>2QI&A+~w)J><7{}%&gfq&Izz(K+_BzSjmX)#-@Z0scZFKIB&Ly987 zC1h&1>8rp-&}%nV)ZR?f-D@J(NWKC2WVTzTie|*e4{kUOP@pF zl*38UA)Ugtwb8-~{A|(6?HcQK?>D|Lzxp`ObnS_>iY zGxJ8UR@76q@&EqkiNej>Ny#1r~trTSPg+jEt4#tch$|p z-8OoanqGE9Uahrb%G?B_4PH-h7+TbB30-Q z&+qez*_mU%IAe5K(usb4kotwk68~=&N14k>--iz&5dUG=Ci9p0~RGjs$TVgbTv*!z%D*R(V~uV1T$%ufs` zuxHMo??vsG=ag6{yF*|M+Kf;CPtLN#N-Jc$of<2rO^JLS+*>ub1R%gfrDrt10E60S z>9YW)QvpX#>z^+cs|Ktop*4x=(zm)oVrTCMKjFGJ>>ntO)Vq-J&TN~FYxjXM1R?%ErW8M#b@ou3a-P-9j3>C{I=V*C%0BzAZ-$1RDe(?rh- znKXtj77tXb`%wK-o&Crb}LqjI+{Ap^Ob3Du&L)uJ?VBjrsyY1 z+&CcSRlid(V>D^hJ4k3URmRQjcHvy`T}}_rS=w39{{K7|T)B_V&V)c!lQ}`Fda@Q! zJGZ{*fw#v0XN}mZpr$VbUZ&{{nL&ZKURM^3|BuTu!LED*Z9cULmu*a{M+U^YSiJ7jqRuCK&v!zpml|{=-YofS}fBn zyYp^KkfF}Df>0_kDw^4`mLSUZ|K22CM+_ekK*JL^B4wOaq2t>!h86j#$FX*zt-6MYQcw3diV~?Bv~2E!%kXXSL9fqwlhbIN29> z%5NEP`M4Cv*g3iPifSsXa;|p%Vd_>)Pk;^_vjEq*D#i1?Q(foGdt3gg1EC;50a=U@ z_jru}OQ+~eRLEE{QB&G@*XjKmb(yUb;RGh>}Q4Idd>`DC5vS z%edCi{f*pI$G((IMbJ(6%~-k}9r|d#i2#Z||CKos3$kc3?E^{s%*js5MA&kh1kd_Q zMw=4o4|8EHqd!$1>#K+!S~%Lzq8)><@?O0m6dmUd*#OwN0MIri+rc*RoEuE4-9yOa(H;#fg=k z3P!9`Q5t||&zxIE@}A%Skul%7$`ZwbRjZ60Cb|pM3Gngpaz~ zF3S&#{qeYuJ8AwKBQVva#?1V8$R9d5g+s^deNyEEITD3IPS1h>n*}}?ER1pauV^bIJ!A5?>(SR!cK#Car zr!+1uh*QS#rMtkgm9N9!H3L5URe_UGiOXmo;@CjMD1iA|U^F>r)1H&4m-9rp8!B9k z!(hKzZwsU<&7@D?kYY%4iuinTyKulIKpLNzZ3#+$+%xL3aQxer^;F;Sw=tDBciY#4 zKNo>X+8}l)Rtw*=x&6Sd_@~wKw)=p+oriT`&XxB?J)&lTTxz+<X3H5Q(6rl5lBdB%ALYs|USGu-bXYqf z`05??r5?YXZ*~2OB5@DV{0|o5Ag(mgp87BlsV_`cf{;47Uj zeqU#gswD$1=J+s=KP2CLET&+GqMTIXP>L|e&r=_O%dIB~(QM|&nh#kZ%Z!b22)O=o!de5bMD1QPHSJqYd-!~bZ%N@SJkWfn~qnw2tnC4DPKL_CzCPe z#smD!Dod!Xa(RUPR)b~(KUl>n09Rf;o4y)tk-d5R%1+%+g0$VHwK&s_vg2=DsQvP z3-7~gF8U{lCr4%jQ)e#bko4Kc?YlmdIAaFv2W#>S9N5eMPV!<~(RVfUiZkZcJxB7~ zqG3Wo02stTkm$%6y+(1%JtdqrUbRcel()hX^rFOAx&NqZ)JD&kC&6B&YxCuUXYvlu zW&6y|TWpnD~Ukq=NbU@xn8s<)5zR z37rFU16EFU3Wg>gu<1n`wdhPXg^W=~8O zO2xA_tHaMhPp7`w?y4Q=8=sn)>~?zFJkGF4`GSZT6q^bFLj^g}T-mitkFF*+HXM^c zD?ggu{}j(R9SI$>Ajd~iU{h8FE1R{Yhe<41OqaiK3B$=n_RlWk;KgAH*+J!iLY6UW zUTd7uIg$4vcRM8ekDK_Bl4QX69vBERh5uy_1pz=TVZ)*=^IippYFVEKn?kZZl_FU# ze_G8BIO%EQ<)tjGstgJT8Z)lD(()CbI-OH7*uuv;2se7jRQ9OkNnP_4(YXk}m3SM* z5X?U6lJJ3~waX^ROkG7{JRT3_B@?u)FC~aCeoG*Xnj}#!S&Su{)-+d@x7F4=_8*L9 z>-J~DuWEOWhFmyOtMDt(XFISy#wFgC_WzEgcRB9}wKhO*w>^cgjIMHE5qJu~{mX;> zQy)#?Wf&}I7)}}EdF$L^$j=sadcSdPRDCT2;dFE)t>lfvi z=HFwX(BL}x_kMn_rj*~UJOf@w|V_la|?cKLwh%^?^mP34}+%!drwRW#iL zlmGLyr7Wzezle|+`8_lgIytOe+e0X{Tf0N&2Yqd_c#eo8wfRqzs3Zv?-#ZK#Y=lMW zh}_5l9uncZ@bLy!qf2Au^qv1=dy_M z`gktb;bf}GVZ4s&o8fe2au0;mc3QfPZ?O@kYAsq+5oM8q9PBHkq-geY?#;ZXlq@l! zYJ6I0YHPFecC|}r<#o(rmlcF;oKj{X%uKQLV^9)SqWzA)OF!QMoU04o(eANxkUlYG-l%XXGgVFjW^o$H;bDFMY84>i1&1lDDmNl_2}WRQ!$ zsB8BVv3Cx_=1taLJstUIJu~Y}gxsv>AgwskwdMof1rW`>O(BXeZH^c1)cgc*&QaX+Re^$ zFZrEe@)glYRRJguDoS$BZf?+RABXS^0$X_@#j(hW@~iDX`a>>PsEdWSw@;LMcG)z8 z6d#&mB@KvCa$I)lqSCaoP98vP;f^7(KTBB8jOlk+-Mo^ies#UXHo`xW(Y%uRd}z z$B$+Xjp?F?ZSAsQ-Wb;>3mxw^erWw2V)&xG8pes0@TxRhQB;f9s&KqI*}`oHp)qb+ zrK<^McJM^;KgbZwl(K1eFdDu~x3({Gqu)qiQR@}15_Ged3a)CAvH^}6yl!a=651}t zmjl`}1seCp>=p?8b%XHEt(T9Dg>a`B{%LuvM?rrTy}+2r>a;+tay{+RUX@QAqaO$M zZS#*F-SsLWDCA)>>q3{F-#76vmxGN_x_Y;x1{X)9-lGiJ zoqRpr9E!~Z6HvvMx7>Ld07YG9U0kJ zQoZr5<)_rY%!c(7ktIqSY3own>pw|QIt)Ux#;rqL^#&UYdvXrSZLksBHbU?&Lt?;% zCXV=jF4+Ws^jxVtZWque>(XJ8{x*&65VG@&(`*?afU3GmrbwRl4u3P#z%-fsT#s9y z84mB-HsW3BXon0NcZd5Kne9`z_!DO|*da4Ol^O4(Qro0uVf>ktaE&YaKP6&98$tVy^ zeZxerTV>zQ6qkpHGb4WandS@mmw8DQ>M_w`M>GI>QX`Z@vIb)90M**|X3+Gl@_al6 zrEC+F&L8dm)kk$_v!u`qLvV)}_bq;NIP~q5vou^jTWifrD!tOJhukvQBj!r3cTD(J z=??!g{%M9O4U~~u!_2K@VYWE-avC>H&r$|Nd~?_{Y|bR^)1h)>4mpf=fqh`k;<&&fibhw{VHIb*eg3<)q^)Tna$9XEclavZG3P?-Mj8DJ zOaWB)G@`1@n%T3nyp3bkw;1e~i5o;kjTVNe1o{43G*UspE@Qnme3)}U$p9+{Ug|yJ z+&dkXrM6GgW0rhUcH1b&xAt)c-VJW|{FqGYaQD{@jy`u_&W%v2-+{NRu4ovBl*q1- z&{|u}W3s2Sdbx}NvUuZd=Cgn%rk+2G>JK)I^?a;+tM)bqHJCn^H!9$Z#$Ii6MWLZp z9U-O~-5_kZ)a|nu7d-Sff0xUYKedaXnvsU718HlOOI4sq=W_eJzbXf$^d38=xv<4d zc|9A3M1vb4uQB~?YwN)W16X`bB}XXS^l>wG`|@8;@ZatrlP69TY7Kg)knz^`qN+BE z^YX^kA6cF9*DhdxC@seO$J1&%gL**VM-YBFQ7thOUP8;mM?JPBi?e%5o>yRbjmb;= zO!g(v4nvB`cS`%kBoG@fz&OC;B4no?UXc|K70pf{%IXq$M#{fH&lWpEu;BFFX&(%R z+Z@b(cfDyy8*?*}agg0mh3EOyTQ_mZyfW)+0P7mPUunzQ zx6Vk-rEfo;RIA%9_zQ41kmM5r3PL7HWK5*JN6pwJc8@udk&2zk)}RwCLJ5d+j{D}@ z*{scsO~<0xf=4ptrSOue`TM-SHP3%IZu~Lx1e^0SM?hbvY_ElmzMT%>jx%QbKy;0p zx57UlWcl9yY{sz)vfCLm!oH*(8C&e5DK4MVI^9H&m7N+Re>zo9XUx=l)Pp*Zp*LC3r>z8wPT?^wvyf(?R|RlZe9!!(8; z;$}Zdi#!JK=XqQTud;rgrD&XT7k~U3bt^;tE>PLp^>&8F!J^MX_n-xIa{RTYZpyS% zQ^{Cg+}UuUA-vAn7a!xPb>MD_1#6(K^DSoEq{@y2-LaxvJ4)Cew1KS6O_~N9ff0sA zsZKJ=0Qgy3eexFXRL4PNSR6!11Y~O7H6ncFfE!R|5@_(9>LQP2OL z*p9eOe{AI~c48gh_|TWu9xLr)Q@GA}jZ@=_SLx~=feOTCi*=UbXquknXRBfq4S0>3 zwW?#0ig=NgmHy_DE!7r5cwzh#WX(p5LSR{oLWtE6om1OP={9uSZ(ye|>TbDYMpv60 zD6R=aj*6FFxj{nv)HB?u==V6ZKV{QA3v-tr*#0CDgjDtPyzcZT`B_zOGL#o|p;M(d zfNuVM?bAkvc|N_Exw;})J|1(7_UF5xm(ys5oF`}eg;gQdPw^hwvegkrFF&^)u3*!h$TB(2ZI?eJ1 z{Gf9gf}y8nqQ*pJ{gVN`i`RX5ey$Ww%*@l?*K%5kWKdB1(8(-$IupB|GLU~gH5If2 zBq7TDQpio#L?DQ4H!5$cxvAhgNy^@&Me=-eRCVdb&w};*bQ(uvBTznBez%vKV2u~< zynAbA;J;jx+d$u;(q2Oq_55q2;9+lqKFPkhvDN~Tiq zap$&%?~?M4fqFHZvS(uSJ0{pE)E=gwtCn6tI-~*^ctGJ7l?yZ;Y?We>OzeNZ2ZRVY zJvlO?hfL8dG^KkJtLHki;X3ad-S-+ZddYAn$E{q_3c5ce*wU?3=Ls9Wucy*axtynz z==?c-W#XgL++6skyS94z)$DV0Q7`xCKPmSoWdhWfhnMKKe0!vgqw^EWM7fKIECbV( z@Nsz~5mhmS)Csif8_i%cF2SDDTAxBW>&!*v1Nk*5x4tU{J;*^Y@eFu)>KIw zwe*Q(gP}lViZJGV#Hv*?#D0yu@hAyW4JCqJ&LtXaYxu*sv~iiFK}^pp8aXB!=3Wuyu9+XhC(Z3k#Ca%eWt%l3*}1Aq?fJIGPm`_ zO!xuYXm%6z<-2&oIHg06s_yRNeW%veHfpSiIE ztO>fbe|5TWsyKC#EtpO5ggXcV(L?Xiv=?ESyj8o2?E-wkW15U=uHu>wl_PP0wT4D? z&SQacBrf+1?zG1EUlpd;*}Fi(=BqFK0J_{0xR=eZOV7e_^zq6_MH{c?XyA?QwE4n= z7RhH_Y@6Z1djeyd{Oq61&JTkHDnI(EOq})U&9qj}$CG(R>bUU~pE~FO=rxzeqEBdu zH#ql#_tlBSV#Fkqv@qqMs(Bpdvee+xD@WEgN-)1=> zdG1lLC=~dRj>B-B;YWa$`rV2u$c!gLi69iK0zLTnCgTf%Dn)z)XGr>8YA1!zq-(_N z(l4qGAtX3)gizUSOc#B&f)Vd!d~w+fp5_+CA`J73A`||;A)`+ zym1R<*gotlwy<eZ|F+Y%tL2g4HJ%U5TAQlQyd6fcf2>_?i!FYNK)Eigoya63S#`UTURiLLuS24nlo>>TdjD`rHAGPx zQ07gW;n3m}ifymf5iH=cVONTJv2$DQtD)XryZY6SEqH_rQE!h_)TP{tvmy(X@7KRe z)S0+GGA`MCvZ$?cxuX<@(|^ow%_*%FM^L{BVAb>rae&Qpz2$f#TV*fY_E+mArS>P% zk6kpVF`0cn^|MaoSW~Yp6c;Aej4cn-1xtpnH|A)Hkgw@#3!~;&vvFF#G(NB|Y+?oe zgqO|wMXbHJ+E78}Wx-iFOT+6(uZ8#=WX`%P*+im_Uo&XM z7OTJ)G+@$QSY8v4^F@aRq2E2+C6gb}GHd0~PL!H2)k|hFcB)oy^5L_3@)a{sG=#;P z>YJu?TG9zC9zYhq^0+R-(;`~yXKlyNHMJip^j}hNc+2X2c1I$S*ceYmzMD?-FN=e} z?nkI8w#;F+w7ZKR#+H&Be(n*Ip6ICbDS2&Boq9J$sv5ECE-|OG=VDw$k%U2 z@**~b#k7*E9wZFyxJ-jQvLbI^mMZ8j>p1&1EFN{`;7Lio}@djj<*Yv z+TBYkZdTSd4Ff*MwUx*_+aTt33fLJAB2!BGFt{Yud~em6{-oM*jG$!;hHkGN#eD`C z8W~Wtd1v_ucN%~3_MY{-N7?MsBe#CVa;wIegI__xo?;F>8qAp2_@qoBs7cMi05Dv@ zQURY+)!sfRbA@SZVr=ugNva(FiV-x3SCN*P?^Tw!DMu>^ah{n`g@ovqQju_Ydo}V;lkJ z{9Hrqh1CstCD(>p+88;Oak=Qo=;$OVqH-@UK5cv+Ru+!auB^A^5}}?agwJfb+EcGf z)eKZ}wyRg$%$O0#IP?74+RBSp-eB%3ftF!WLmsZv7<~TM@!drD(ShhFmB9R_1g(~; z^Z5p0RTiUeC2A%iawCpS?z>h9QYNG6(IWLr^AMLT?HA!IG;Z^s@yxS7TmT5uB$Up_ zfNDd?um-Gcg@Mm{EStt_v+&l59zGjB26>T>bF(%q8|xq6{_XkcQzTUyZjuv;*zW-# z{PhYXV0BT=QCBh&28NREYe+-_vO1Hssrhk9Kw|$3wy-IqrW7+u-QH_eZCm+835sE^ z79xZB;K$4I(=}stj9^IEi6(2zA;DZp>v7()2CL&Y{Ew@Oo1i;sH}d2NJ$IFxW)%;F z8d%*|4qEw7mKFd`ABR^*N=bb3uXeDd4;LRDN-uMpd1UMK>&X+9Ui=k5%5Lorb3;|k zWM7r1mY?1qn`v%&J6JU%p=5&gm%T>B2IyqCOyoJ|OtR73W%`*Ub-i>pj#u3M5GHlH zjOn=e;6Kq3u~QDMELA-!e?eoOHRGd+7!+byxxZ#jO@ioBJNxL{-!7VpyhP7xxb&Ji`Yhxg{Y_oux?u4oCWv^xg&BINtO=xZ2uViN-6LE#*!5XQqtg#)Ef zMC?gf7&CKRY5v2>X1Ehs&()%3y>c16seU*frw#~8ryiv^a4NJr%j(kY>@S@VY#4ns< zx7K9;z&^5>Tv=He#e1*&W-)u+@H~?-H&J?%^`(0c2fkZK2-0uMg}>%=&d6H)q4{!0 z!s);OaSHiOR@2%K%)8t_vK1_|OK`L7p2LHRorVR6EG;2PHM~@P%@VSXsG2X`TnUtS zDYq@rp2f|pKS|ITFhh?y%+G2SQ%7?SDhcsp^|83RvnqhRF3~oV5~1H-e23ATwFXqu zIZ#Lbguu#F$A>kmN+INZD>%%5`V(?GUZ!Kk-N$NVKPmH&Ij!8(nZGroLRaMn7;txY zV_Gh!yE%pPJKy1VgBe%gVZjX~zE8alk3CSH{dCGsi!cy$?%;?Dj$eN=TzF_q&O8sw z6vpagr{qWw?ZRn6i1vBWS_#@kilWoXuiMs3>b7Y!(^`wacxt({Kd2nxzpznv%WZg6 z^zAHuIy+cnsXx8#l*{7H66!kDys5eObh5JSE`H1Q3kJwoTZB9&E1H1ymoI;}Q-kMi zmW&7OsD*#~S!BKGgsEv<8&URMUo8tsHLLA-R{g3**%uf{{7Cjgy2(W5fQ_u@5f%=# zg}H35nuD9l7XOJ3SDp)jNXC0;}7Txeom=TGusdVrJIU>VDklG817JO7!gb~zlZASL6aS6{E*1bGIFR8GL2pQ}C zXThW=i&KV*aar2*`6!l14Ho|{=HKS%vNy6t0CpH6KF`C|Um2?GN*zVZO*AQm2JlBOn?~|;0z24mc z#@>@%q66~tX>$zjzpn%PfzYli+vPkSTiLLj7ehP;Wp-*KMY^l|R^5moER>9K#@b&R z%uWkdBq0`rXVko}PaU9E)|tG%_&n-fV;rl&Fhze%Ph6b8KZvboQ*9eOt6T1OC@!9+ zk;e!aux5C7ME3FH`lr-&Q)apKI4S#*h1()xQ#xT_*7aO0wVk}vTAI~p{!Xa#QSi`) z%NBi{57vQ8rz%zZz5*56k4E~qjCX!wg_8dX`Cj)Pg^8atI@l+`ebCZ`p)f5MRfiB2 z|DwfVd&X@Obodh`koHRoKeJvwdKM{Mm>1(7M{0;(!boECzz1mIpwwREJD$STck%T- zWHeEsZ3O=wiRL|I2r*bbc~llv%#VRMYSJhM;@lLWc{LB_B3D6Vhbafii4q7N||N zs>3~wTIH@nskXQ*UF%>;wuQG;dQr1zM(+*fopIBujrn=#hN7~V(J8a6VJ5Xr#TEKX z9~x5TXaUC!-a#5>;^(EHdJJo)C>Y*Y5M(vb#Q-wfUzjTpv_nOXU>_Zp)!o6dFD&+z zN)`9cNKO@K-Ge7s)2Jt3kHwzI5wV+f?@%wHhd zhbW~D2+|>B9aYR;)ltcdP;|yTblg?X5y(<5hmkP)0u{HmZcL5b!<-M!n8~J1Fz8n* z|7iHlJI*L-6Jt`w3o{?kl(Rxn!w)scaOIr5>`qC&NU?qO9M=}_#$8cs;&8Mmn_HX0 zo9-}C%A|}~a_VqDhs2Ewiw0S4JK9-{OXRFRZ7=N6St1}Xl5_0z6^zaLNqU#!$TT}D zIN~u`l5tXs*@_D5W$NZ+&pd6Jl;>U$VG1a_#icaDn1Hsf%(ep&W>%O^>9_`PoQr5Su4kbvX zN}pf|elzAq$Pe6@*3jqkN95Sg*nGFG7mvWHYj;|fkpTtpgc{z=A>ZGoJ8DseaPz^y z2vN&yF?o`R#G*btMhsY|Gg`gSE6qY(dGbN#68I0oiUZ&uU-S?W45~`lc7WfIS0PCl z6WQ9-#;iCTQSL97Jt^)=%~kpQXzWeQzc@kBvdXe$;77R|`_M%W?#h1+l555%^w(e2 zYgl%?aRZv{>RsreBo2PlI&LK+k3Or3m8+*Ejknb=b6@i&LsXAw(mQOiCBtaYXtpi?h0_;-f;NCl8Fv>%E_ zI!I!X^myB9%uUs^Q1ijZou&24rZR+>RBGE>gOB5(#3|4Y6-Q1H&k>4pH<7lwgBGc@4lYtl zlhj+uVoG}-LO2vo!4|hZ8kJP$z*b^uSu1WbCySj01j2_J@(Ld#qqsW+q-knU>&Q8n zL%$szZ*o|_{p2UypweTC4?T*C^WTvqFBEYdyUF(8t`c|ea^*;u?N0rk4jUlOKp&_W z_%55Zljmky+RGn#D2FHJErrtf(l++C4X%FkdhC9YF1*`Ue{Nkhhg}o=H<_t}y9-Zd z&AGg1=2QjjcF^rHm*#Y*z-&Pq^EUF>6gNSPgxok-Wf9>N!n&Hj4393Tf0bEJ>6NGV zKCofsH`X~AZffA{8-{c-8Cf-}*-Tm3i?lOg&dNqAMsp@$ne#(ae`YVki;%OmWupvzPUkSrG#nwMA9!#Ppnn4*N5*ev}ed`&)NkzqIQPLB}a4!J@`i2Xc51^xC+nGhFpjZz4 zo}xaR;X!g!u8xg2X1aS(XGxSJl@SpCJ!?}Zt63FLqKc2BPX$A1ZoPHoDk#{w>9mcv z^#B3(fcy-=fxF`7`pP=C7xG~hgEK}NzV@>6D#eiMs6yT{9$^eFi3x>+H#)#>5$2m` zQ2UR?KZyV<+h1~mJ_%bX^?<_ji&DCu^&(#KO1j$Tm9H59S~$7cQ#&sIF4p1oW3_>t z4-@%%8|29IYo#I=E8?I|LcU-aoE1yfj&WKVMVTx{G^X*B!jW7>bX7*@=6Ug2G*mU= z0@eV>+t-PDwoy@Ls7>$VA36taNY2@jYFe<;CcLdda?~4+w~sKTHfvm;0;b&c4OfQw z#CEW3&c9$U-fNN;{d!vqFdRhzan*(pp&msPOIWuR30CA{fRYY;SfG<))d zMNDNI>g&j~IBBve@3N1QwC$YN2QlXjI|ROX`iON`XU~Kq84{xSotwZxQiit=P~$)3 z6KF{2iAjHnG5Xrob#3gMAsG2@1^-D*y54Vleq+75a8T~Wj1?Se)y(4Q-6Q=FKge45 z#{avYY^lL2_9q+edkYetD`Zr3BSVk~cL(dBfXwj9yY)cYp)9Ul@zfx{S)5=;Nr-ey z2{R`34ra{pi2z_L;=~JEIR6)viKz5_u|Q*43GkOC+hzYY+RX+V=#AMF6wZd&tAu^8 z034Lb8a73>Cqzfjnk%sWpt;+Wh%{Lh6_CVFYH~G~_ub80Ps97@+e($;MR^0D zAd`f?4m68TlA1rDtSSh>DYFD2#w6gw)nop#i;$&|Hj1N8phKdMj58x23GKGL}%DR{-~s}BjnKygovce zZgSrJzPg#tkDCQAb*TP_uClUeEpsXp`1c3AuD|lXI%Oxf#}h!3!S!!U3?^&o*8m=j zFL-(1yqm!bV zJAMXFD_QWdTPT5kQK?OWRv^D-xohR3PAqc`U{L-4Gzx(P4UUbMd?BCN z6)qLJ9C6_mVmsIB2`}ts^Ti0f+%3wIV*byz&sH<@X;_aF*|a~a?x(G7;Ze1>H~}?= z%C1TQ`a`7ne#TU&zrJ@0b{SPJo^cZm#`T5ME%@oP2vWa~C&Hu!%5}Wv$y0W=4Ot3A zgGTZ;lA(Tl@)bk`N3UU#p_QO3zjXhkst!1;2k?c_H=ngg+Qa!TlTLP_ZIXPQ)b4J@ z^rt|1%ZGFcJr_Wl5J*jr`pW5(+$#RNdui$;)>QY z#xf}b02IPliSVg;pGS0=J#lpH;%SoKzsfE_frh$=sv*hdLybIiTraEqVyIQo%kM1j@5HsbpSnU!Ee=>$&c<-JRi?H z=qW57g;sMjpCC}M{w2daer$T)FEy~UI}zkPYwWKvKNX}ra^b2GAVNS8a{bo=f>Qq2 z6K9g`Iou4JgbCZxZsr&WD~I+X9ciG{N`tNZus(2$+BK5GY$z-& z&Zz?Z2-3rb0cT$5^qEuFjd^2$^iO%Lkl?0OTl9{5s`%^=Sdc=fmYi=f6a9IJ@{V0V zqlpY|bV}*R|9Wf&uf8tG&=9Wz;9{SQ+izsvL6nV#g z*M=bc{J)I?eCGf5U?E~4!I%2?Ki6*%;mH3Ey7D0Ye|6HxahqjsW@ zUHUav41I?5HELA@|HevH5TSK!6CMYqQ%p4KmX8K zaUNvuxg2;rkmfgsvUq5B^sNo>wU=Q^V!}-?b}c&~_uWh!B-v^Kmmgptzw`;7~YE+|^=!@l7G#bTX@(%AEIl0$+wd>Gyif zwjKUvQ(u_UZh|A}guyXzM6I1l>3pZMV)z%G#Q}}Tp+Lt}wkb8^7`Of9Wxq*czp%=q zxJ+8=7R}C%K7L^(@AYWbjfPk_iYLjgw2jJlWC?p@99A2La9|40(w|1-*|c#}OH1~3 z!Pnh_=+D1QsbH#q`q+U*zfnH_cTCg*t%4zOBS%v!&Fm{ip%ZDA&# z7I0nu1?gbA!s(PlC-CNwhEmIJySfSln!#(ogERpJ(w^G)Egv9((HPz5?Hh!*GaO2l z)hiiY&)3;|l^5YoHGG>WA>abawQ+>to1VBYb`Yx5dbP@`bK?!T-103b>|Jq;%k}v3 z;ligG)Ootz{$ZOl=I$p6_F`j21#T8NOqiT-{Q#^7kw7EvaS98@2j(0sc(YFlLQhWZ;c8 zaLXrTb?bXOi;NzyC#vIM(Y<68wkohAsjDOXwnb3ip(ZC9AF@@JNmi^trVcq3bh>A= z#X<116AjY*13dJrW2qmo8ix+gb;X7iLM5d5I~0)74GZxf)Ey#*Jh&rEM@DdYyx&i% z={lv?3Rbmw?w!!E23%#_z@B_y`*>EbTj`X{+>U8)R61u;D>E$#jhj8#B_g7;a^6sR z5T54mM3lYi%77W)Esf=IcN~=>Gkrx(i*YSEb%}u*NbE|y4$)-`{m*)uLH5ESvmjfr zV>^#e`|BrpWF-Y(LFW$97!6AhQMA_Ppb^4lT?`eLeh=}lbX9-3cP*S^J|6#$DKe`~+$=>kS3Vu17+_gp)NC@B4e`cC5?gxI%l0ABygP__=qJNu_P5E5zh+z9eYi25_ z#Um0f$4#74jBxDjc=Y?wL4i_FV&6s@l;+~=joEC*;a+@oI`0bfU{}-Q*4*Tx_nmIE zw@w_9%wndK(P<|Kfogs^HmATdH_UW3)gQOQRtYR2b0DJ|3QKD)NHxvu2-=>7_j`bNr*>W_xsJ1lo>S3cJ9Iz7W` z#U*pAJ&QVSdv;kfmZ8fBIq2nxwHgnQ#LI{CdKq0w2YJ2ezZ;HIO-^!i9Y)RDGRE15 zqT~)h_=ezvy@am3FJq`~<6fZNuE*k;-|;G}sS_kZ`1Ad_%WN(b*%KZocRn(t&7s&F z)#OajlD|5uly1B*8k{WglT%DLH7oXEugyhdpu<4%HAjHX(AOKWb@z0r(Fyjc!CvQ* z{vKz7n{6uLw9N0PrNv~TFI@>Pd;wHZf~!n=tmYyH*Iogn4i`#~pDQ}kM& zr7&?{nxH_=^3zYe@o@SNQT*6*V1N_Wdx}oo^9bnydm8`ErvIl!zl$hFqk;n)k(2BG z;bBvWeBqLxpP!S9B~=>wlSC#2gb(~bzr%;=H_irF&h((7^N%{@xAulB4dCL<`o#cY z1X9Y7TJw4GhxLlrys`ZJXko5x$CHV?JSrko-ZA(!{c~WpP=fmn#Kgofl72tz1PR!) zQaj$Od{3}zOj5}$VqnL`MDl4+tBMXD31?j;Z8v6QWc)D!cB$b0tw@5{WjpR}ZtYjs z0KA5CMyb`)Y_5?0C8p2|E?wZp-RE3aqwNjv3;?^uv6wqqW$RLvT^vS0&25*1sHMPH~?6c&)f46eN6Yd zAgx(l!}6^FGb26UOfqhITwZ3)Aq5|$-rIa?Fr2sutk;Nw(e4fdv01jo!@|;OD0EmxGkB*XpG`VJ(v7 zz(X?sED;IQ-ouM1bWS|kBBUaAPvT%ZoEud8_V(JP$OW+l9A>~+w>leJ?$`|t2I1u9 z>s-JJL1#`o77=dQimGOHJos#S9$s1qI~)O<*5)+gnqQK8t1AJdRi%b6jf->?2nT^G z1sAV_MS>ZYJ>1R9IR{Dnn`eBfnvc&OADqL9oow}c?W(|1tt>vv@zefj+-osq!0$YTGHYB*X0tR0 z#ZerAjx4DT(C=+{w)Ri8OJ+1n5BsJcl0f-d(0*hNC!yD5iI2Cdo#{!Pi>?>Rk5HUD zk*lQ*MEaGE6+n??v)?Dedn--Dm^9cs@iG6}BOX9SeSGDYpSK3O9ye7f8sQaA0GsLA zi_Y4<5Rr}@oAc6%<%WYI-7o2TDwIII2ept`SXIN)=o+&0dlz@tCQ0>0^8TrYn~*yG z5-J_9n|1R~fdf6WtBw1_pKiR=3SL}3AjNnl(+S_{Y%cSV!bCNgY#AfmTqnbN14?x! zFYSjIp4S$1{bgDI)Vd`4>#IG^8G<#=^I*XHJfF`tALnupzto7Q_ z%t8GMsq{QJ9V}KB%;qgT?4o6OK}_ZPEAQtW-P_)zu?zfrD=mE{!Sl#V@zMt zZt)r|R6<(A5`4KF{$}f+b2Ar{?en_Xe%jy)%fnbx6cq;%7+*l|{qknIo6@_c zziqV-vCnR=mlBFTV(UB~ajpAP!Tk1{gqM4*w%^0r=zCE8cl3MzR#cv??+8A=gXGT> zRg@PrXYK7lrbHj6i{~O}v5c&qlD+58?>DB%MVz&UyG{M|>gI0su`EQdckM#Zz>L?q z7hC!-tqr7>RWExBKJ8C;mG!H+y=w!rscc_U#|-3498U#l`%Dz|n2rR#xbk`L1YT(| zx{PiZVoe^c3C9n!9U$qKJ8Y~gYQ}pk{R*T{djQKJtrNwmfOq9o+sHiTDmHT?GT}BL zHz(zT_m^>>I=69;!~GzsLI&UdVsMdZHs^;DZsS?dJ|F-`989tn2|D%Rv1|D&5t9et zqoPl%x7(nXpfregvL209`FLi=669A;^EoiHu*vKfPI&2`(7vDhW~+055VP^@tm`Io z*zd!?>0my9XWMxZKu2A!q|X_HhypcExde8Cxex#3$Rm}z4Ft}SO#atB}4-Wj|o7Afj z4_kqQkrs`D;y!+dur*0a)Q+1;@bZ6vwfCB`b1mPvtZ}zM9eaAM*PDA`Vf8!yQQ(RO zO_9g`kv)v&CadEzEZDtmB9~xl=TZ4q3YYSAYD&;ki7)wr1zCLh)Kk91R5)_6WgJ#x zg%<{iE6y6REBCx?RC1jBg>p=LtNyfCPL`0Hhh%}w*GHsYi0S=VIVHC^p?bSB-&mLW zf=RX}zV*@-7uJI^%I1OwbtePAxGQ&=;Rh-?DPQD|A1*`!PFJ@!+03)U$^$C8Wf?9U zs*6UTt60>-v9#})5g%RUU~gOy%0=EWUTAi8eb!4v0#V!?%v(r>@kK>bE;EaZLF}AL zxSTf6W>mnv3ips}Q(bZp2iL*b`|@6uJH=`w|A~)wMaApA3x$ZovD=oPb3Rq3OMMI~ zGs>-m8_7v=(s!vp!qD+e1_##J^HPfUT=xPNR+K9Ex8*ZftTMsAdi!e)hwV$_MLExU zWeZKj^_1$yo2yv(Dbj>+46~d7=m6A5u9#UwuT>a3{8EGL+}M@%ey%lRTt;BzmkCVg zy)lxJ8PrS2h#)e)Mw=~pX>D!&E+?Mu#2`i$ZK66IFu+rFblNNpp!qcVEq?PiY3`RY>su z{KF#2M1P0(GFICy4YAO?O6vDgl{Ktqbe8&-mc3?tL3uW!glz$sOw>^pF+$=FXU<_ z=dL5xR`kbj@Y!OLXyVA3u$Fo(-ukSJx6bkx;n`E8%LZPOrnbj&!#t69oo%gZ@kh9k zsV1FGbrA^Vh)T)p+pLoLA8+dC(}+GE8Z=cb%tp*eyOJy}3tFhsIX^04h@ zH)Th4e@sm$c%l_)= zlXzs+Tcs{QPj&$7eyIu0JP7KnYEjo`Ojk6>t{oIb@F(a3L`kHQqz5@Xy`H?9t)lyT zF%fbx;dV7Fkwd(DcTHNz%^H}GF6BD<| zRNgbPFPSVi=YXeVFrGO&IvNOcHF-M#slP136w>Po9@>6eCwB^wabK->ed!8u_LgfMl$h?Z?4F9*r;eI-xcpBP_^Z@*H$529eD*vKuz(Bt?GUN1qrf>BLmm}x!V z_X-}8#^jKV{3$@4U*P;*`8IN!S>amm4>H!I_23j#-fs7bmr~4#55X}H+QvoB8l|nh zWC1nzn~^5{l<=;=rKw#(kYEC*`Z-W?lBS@UlHxNB>Z;I+WrP2HGE~#90T*h1RgX-gcCJuW)Q%XwD&P@5Yi|xnX zVaI|s%!p;9p7Qlq&9mqLJO4{~xwf0NlrqCKO0UW4M4(rl_x`i5uS+5KRiAXA+RD;O zh7YjPZqF?j6S9TxX(Pu>V z_WP}gK1m>`^p#r4LGq!_$uOlf=V-3l2wmdq)+zPh*w+vkpmvr$?Y6-mwiKbJMo8;9 zl>=R_^pv8@R1ht?0PX7v3-bH(-K2eV1X$T^Ym~I-07`UQ<0V+#qnWO%ln!BMB)l}; zJ|_LhMTm*?maz6RY9WnNK(qb&qsgHRN5}y?q<&9JAkkCDn24EXE=;P;%l(j?A8_w^ z?e}<^Ck(xCwhH1>E{Qj_`$>%Lb*pQN?8K7VX7^4 ztmbvzb?{pWV~2(Hha?Ew37S-43|?9=6~Mq>v|t=-qNvQueGF) zDJz`c*;n>SiWAB3@R74M{BOToWix+9*%O`7QSHn>=m40?0ApsWLS&o)Uq}@lX+u1s(5coQx zCkTsNU|HL864$d6M~gWx+4Wu&`(@YqO`?N^>f`z0l%w3mC9eILNjRFXWzu(;-7ppo*zuT{BNc-NF zBcYaSNr*pI(NIfa!1M>czAw(Sr{<^hZ$7Hu@OTJ_C|5e&E*+b8Xti1#$CZx3Suz$> z+@5sw+A|<46@FQcu|Gy3i3@cVb$Od>sOY;Ef+9_Tyw1aNr>>FNN(sx0!~A#}KRlrm zX+Hub9!8%v&m3_1+){teo;zhXMO<`cxY}|T-T;Y17>W$f8@?ddsYj&=bOp#VtDY4w zvmVx)`K&kHL_7`N_ah=GT^2J<%>7RHIk?=ObJw_?`+Q>(li--eBwrB#mYf&WXm*%S zzUU)BB=~yJbJo-;t(q0BFuc{Uj^t2wO%{TA0v}UW8l)h-o)AHUq&V%naavPp@ z(_Nn23*yeyJz+}hPyUItP6vi%lf-G%3>_$Z4zM#Az&< z{YxY8>1qn3pr;)yt93mvrBCL$*XQvvCW5N2CqO)x^^i*T^Ls5<19%k1D!w z`meWU5mc9J2cA#6x|3x0u%O+$#hLkD*=Gcq6{A^G_EL1$-U$2M6GR4aIRc!FBj z_IN$wmw(9!rl{Cdu{y6tZc|cH4z*DsT)sHWK(=kPGoaGL&8@k)SzS#{zC;CDVbaB%RU_Mf8ujLn1EBtrCY9NP_Jz}0tOk_{A6J7!Nl8hF zFabZw{e`5#0EKsL;%PrqFznRL&5i#;5#0DzllVX6!e2p%u>XJyZ=Zht2Z1<3`SBkP zcaJ%DL$v7Vd_Vn9TD zmJAJ%1-@Sh*LP)%lB*9+pu+q4QOWG`oX*CSgW+MUpbw>3Wdz}w1c`the@ohJtq*-O z3=)`^!jq)25yQ!pr8FY?;^nQ?GBt=Y&={wFuKXDq>N=?~=+h3mnYLo&vpIzjW`bislQACwkXc?!Y{8i(ZdA^e??35c&i z+}^#uvDrJlT1+l+59>XG~(RQo?gTKy`-%M z2R08ewKJ+c;gSo*agZsmh3`XHs#ZK=+YVKDiyJvkvqtZ6p$42=NN_3t+cX^7?V6L0 zRA#E2j+k~bCSt6jf!GtD?`JSeR`XiPTQJL+sN1QWhe1p5SkFzv?gToR9H(_#nDnkt_VN^C%9Ndk?Bd-MGpM$$>tf#F#4BMcmOq^4XuyT$2sJe{%? z_hgC-*`!&Y8i$aUl8!!s&cRj~kXuP@#iWM>|K-zy;-~V;p-$)OoN6QqjN#0;Agz^M z3<6d&3n|9T5=-_iJGjIPlimFv!S*Xj{yhn&q6I){6Thy;jU}DLSf7gE({o!Aqh112 zDr69nEU)I8}>Y}#`u}o~LCc34H_KC8Xcg-{^>=g%zvwf8d6B9;1HRI8< zz4+xSrjv?56S>IpE$*}Li?}qt-q7Scmj?2xT1}32^T&C^7VQg0Q*jk!B7^OC*yl5f zb~{VK>-V$ZA|)+((aj8(y`u*p2C6~m=Ifpj15=TP_ZmuwV)Z8k0(AAfuvVG7|;|mqxMGaNwDy`w0&#Q>e?0g@cL; z9kO_+6)$kf%}+!e9vh{7Eix6?7GH}0)l$kJYh_9S#6g8I?A@~^3GjsElVmb68y@BB zAbXk$u5o8D@kgty4X9{q5c7DMHB(m6>hN^*uy~D5`;7>T21hC=L8o1dCgDA&z{0lC z)by73tBLtHOVA(rI48a3W&E02)@srhDQz!alO8zfpqJu)DDghK6@(f&>z~{%1u{^^ z_>U!g)@tP`YAJX=?^_ciY3^Vi9#-`;L2_#6ob(Vfcn}xVQ1r{OT5xxC#N^~Sn{d)b z{P0e2J#U;-rOkWah}R+@-SNb^@MdYM8>%{eP;pYb9B4be4Og?})@wSUpysd@f<-XP zVU+nZbkzZ*rPw<0ic2v=UTKI4BN3H5XIfz8T{OHuo{TxRJ3Ac>m0vk5@HoD~+C&lo z>Jv`NxgRNLk_ihzVQVm#!A8`l@4p+)nXXOX5bn!3NlRZudGkEM-8&m7Zj05?T(uBD zE_U0`1FMg_V`eK@L9)*na#IRH+?lz&Ted%Zu%=<0UUGL~1k$xS+x1U-apDj9 z2(Zk>_}8zu)$wj`Rn}NY-yV?}Gd4^^JEpr20e?;7mlA|hVZe}|6!_@PIYJKh;>)Gp753}CL%r9au8et?_9*HJ&RW(*qQeb5ROVfvpIDZ>y zn{tJ)+(wD1bL09H93RxDkK@Ybe@_pzWdXwPYe+;QM@H?(>1CuS`Y@E7nN>SX(VcJD zkbg6ra%?VYOq|CoQ)!uKu!Jj6YeCV)XCeM$5lxmFC(^BPDlq<&XP4l}V7O3#dPc@I zxX)#6h?r9~`v=cwW-|@cfb7IS_IU;36^f^6BR8zF7JIR=yC%z;H)HIov56EI*1%_Q z4Wqrvablb0VaYoJsYGPs*7TSrnj}Nc{Ykqf^4psTZ2a-P!2crcoT4l1qBfmWg%zV> z+qP}nwrx~w+sPMIY}+_efB;JbFZ=XJD+#1LbSJ63Pm28S`&7C ze(ieVnljxmK@kZ3X|o+dFf*v%Hg?*>uf$Z%{twdEo*hw0P{@%-h%B$?Y`GI-l*9-ld5qi+{K@-EvTB{$jH&PWPedcu&;?NoZ4xH%hpi;7+Qjnd=&OUwFCWtS+CKb zXi9UUtSzB?cM&88_*wjok5N`PGc7LK!8Hzo5RGcZt->(5-rf40_M9h6F&dX}lboX+ zBFRz=7!~aXjTJ#1u6(ItmqXudo!=-SWhlmBTk!D``%Tg2(>E{<1>%b*;gWy7V7)G7 z1rz-t_*6L^yTg!ccgj3HUusJf6(oE!3+ca&)5R2?n151AcFJrBX;VFxf9 zFP9!oQ*_8l<0dYx!b72Ox`p#qglw)niml6Nt*b3jAUPQ=8>^Eb!c8b$T^s7(AR}Ut zC7kM1!gsjYz;~fVnBZ6en{{~h%$TlAk3$^QU15X6KTbEOq7yx&^mEzDy6UA&`LuGb zgEWn*<72M3{!FLcnL0TgGcja{iD9~g2K6Q`t*(N^C7x2u6)84t_l$Wru_dD}9v)e$ zSesrO`M0h;( zWep|GT{#o}Erj(N81ODL%xwR7`3>oIRbFK~Bq)=Rlow*&T2fd3>LyP+DZ*fmyKxx} z5;*#@o@UQD8E$AXg5CZbwGU<2|HY7$D6T1gu4sgq;`C~c;hIKDfY8}=!-f4tq4D?{ zL=5p|iy9FT^lP0}7nV5#5qV_ZwzesK)po@2$5O;he!hx%ahCL1bL(WZBu!N1#-5j7 zF99DQ+yyD3f_z)j40fb~;&l1z?gqF+&)+dx_lC9g4W_&uSt$>!;GB;fp@ZY| zI@O(4Key+9*wWPiox??Ju)?x(nm=Rc3m?C7tYeu$QvgbvDg~-p4n?uo-oo0VuCBxx zH9HIvB&j)zu^w#{q%FhfnN_X&Lg{#R*HYPqoe{H-g zU7kwVn46c`SeFb_=~RBa?R;H@rrsSK=xP(3-=gT_4*iE{L4+yl@2WpMr}o!bABqMG zotARK-U{gOO0E`lffJ31(LIJfvZBqJoCO>mH=YJj1WywOT54NUYiTJYW(K;#Bl{HBoaF3<^cRIFu9Q{;Iwu;Y+cemHrgc^AdOIFzzlWu51^aL5_So zAHf0fTAD$@Wo|km$%*Cm`*=xcV7JQR>RwbV-yn5(NR}*w4AXXg*RD~MRUQh^*L$rX zya0Y3I?N9Hv$?W5uVvwPqtKpYTQ4>qk$pTK0?%e}mNDEvruWm`F&q-W+gGb3H?sm3 znDZN(@P_Tf|2oE<9r z=h~3q&rQWbLb`|qsOxPuvG6q!IXsO^_+#^^+Far}Io`*r{I+4dp~lM*sCTK`O{XKj z7;M-KYj2I0K%9O-h_qDz=(g6n)24CEi1oAlwKKcWb}j_+P-IG@`Mj;i&4K{Eb(Met zoGKcd%T?6Ck~gWdx+-w?EV%L5cDjhFTHs0PZNz+zVbqpZG;zUa<1=}yJyo?rq}Lia zM&lp0IzIa|cG7%A&@u1@1H;Rm#HF!#)V96B-v;D(Fwu#FPWpK;9dcw>Tcep=sq*A4 zXgM7CE&9UEscY+eK_bViUN@fJ4Y8Fek!88LQj7W3UG@ztlcg|)(kF#ykow`+c zxMvFDHPD56Re;kQs9*fkn-L(hn&e* zr^S`n->)Z^(8~{B%gCkHRrWS^mp16jEz7I~R=(;EZJIcZ>q3gK3|}BdM&AxC&zMI3ksdn5ct|CS{i}Nh3o1 zxOZ`M8A1#q#l_Vycpvvr5hBCk`y*tX`h$6E?=`G52QyaevV>Gk=LYedvVgx&Qw(vzG4lElFb`H0zssnmb zy~P9v4I#p#g;48GD8HH!6MG#;&%aE!N%21Il%L#~A_1)GCknCK;htA=cctIvKNwTy z`U=Ojp0C5-9o5Ri;|#=9ZS}b6d6;Z!<3$fX0kkZ`* zjkj%-YUI{m+#~~|q4s5_L=VZdzZD0vZSYHD^QNI7`RmgMF=K~YN*@X z=yrufJ6^N$tj;k}5A3Cb2w?}br0DRu(uQ1P9|+QNc>Rm@LiV*fLPEe`plw&vrb%>Y z2X06r0DlPalDxbjP3D`9^yT>6+XOaW6Di&CF)pZ0kSEud+0bzK6Qvpv9QIjr^!wSj`&UB8UA zg)Q$QUOphYIJrWW`H+HiI6XQQRr69^h#E8zaZ!l=LvAlGdP^;bku1GKe0SWvQb9F8 zb2Ubc7WY~-F#Hik?s?Dx_=NTV9V}eXe!-*r!m>23T;3fby z;psD}{cAO&wLVe{CEDE?^9+MQVDhw_R|uBczh>^+P@PHVg4BZtY(G6Q|FnRMzFC?j zPWY7Sw<JA(E!(rDbtxeDIqSv+!0EY%VTtcm{kNAw0b8Dtxlo`6eC zj(zTeh3Sj)5UiiMWC%`f$pCZCvKRQ^=}?nY*~Oh#`+2^oPZ zPhJGuI9p{fwtytX(HILoBw!iJIM{fntJtPMVyBD#PI2J=BC?I>7a;|}Gn)T*{f;8n z+NNlq@b;VLt|tjOv$!!`@C3t1Zva~?-D0&gvq$|XD_OAM!My$Fp#W6EIR>^6QMgA7 zM0~)Fj^+yna!Ckzy6G5E*Se#zjtc(IEGE(5*|@+?;*u3hDI>eQO!>p2GVd#P2$IIyn}nV{<%H z?N``m^m)!f?$T?D39>=&qL7ey`28E9Ysw%!F?$pAlMETCck&ockXiAEbrJTHHKv)1 z9u@iA*V_%p-RaFtxZ5A4wQbkTJWSG@YT2UQg!@ zrO}D=4oey2sdS$)SIIb1qjA#I7IuJih3W89m~7|}a};Hz25Pu+v977`nKT+d%C(<% z?VdNllXj+>Mjsj|$N2o3L>9JI4EXB}tPp#StTvXD+RC4v$W%P+=Kpiw&fKHOKe2Xl z|7tUu*ivR6SK%1cL0_<<-21D@tnYtmDle^M?YU;Z?FX#>doWooEl00v8Po1YyG?8~ zJYheLwLifWR@r^FSTfaPzn1FOpl1Jvk!nWrRIu897UqfY$OupsJ3q01>^6Td;flc&bRHL~1 zbD`st`_$bZoveF>2EffX;BFtF<%Q>tvFior@4hU-`J8Lr4Mw!IW*Y7u6%~>$5YIW{ zQ8?`sfeQ0j9%^Dl6k>*Qcv;+t#$PlAA_OI4X>jwj+hgmKRJj!|N!;5- z8)w)#TP)TAYt@!8mBpr=rBa&^6S?MA+P=%;9Q6HKPAwE;Js3eH#9%Y2(4T|l`V)_1i7rplpX7M-o;m$y{$VW9oC$9al_SIb1OZOW-OplU0F{OjhOKg@dq zu8K7Ra=GfuS`}vS(^Appq?aKpi61{g9{-TIF25kXg!EiUi0+_`fGTiiwijxv^0*)b zsi;tDi8+IiiTt8iRL+VhPC%qntcTXB1j@tYa1o)?Q3x-k7e=#nFqNQwzJ;CVwdU*e z%wlG2QetKi+pA`>4@&U>&ziKgwDhfKz+`brXR6g}z`&=s$1lClN^_-Vsn3WO#10Um8bq zA6c?w@^~Y|&r5L^xk*$#rm|E?dYic^4h(4op3Yl=j7Yyw0~yLv(tqlAc@*DVeJ$m3*OGxQB#seT|0N^l zCGD78m-jkmDkvd%HR*49s~xLBxKqie2y~(${?C}X#sr7Qv)e_hHA*}_Z}V!3JWe+U zi_C4Oyxe)3OmDv}8pff{==Nq|Tbr@!Scx^w^`sqj|92`d0#V zQpPu6_A9+-s}w;=!@`|IV*bBYlgdXofhaHfLAa|ZBZN`%OWTmV@T<#0qJ zEA=u5M4Ll2)jPp6uRTZ42(^!z_L`LkQ8v}Gb*eIk#j8KpJ5B< znNAINZ66ZeA-~sH(T5j`@ph{xe{JRrt^cY>SjnjAX4`sx0~WlidwxEIogTTKY20_= zwJmxy^OJNGvlF|2x9r*GBnmxRgV3-jI`UVgN=CiB! z-#QatSokz3RCnI*XkOF9Izy=93w&v(r$&E_q{pFw_dMpmG6c?p6HJ5dNItHMh~M~F zi?^RmPR(b)9ad-M;4 zlAbb}NsiQ#bS-Kz`W_y(UIQhHpGKkZq=n+j(j7f8p>vRp+eTu>;@Iq8 zxqRXjV>$@kStlERb{qITysK-%kH%S9So|BGW|n#+N$scbOhm=FwI~>HBIsPAGZAej z1Uul)1^-)Jy|?g4-$7-wsr}d)Dq=>5gs#Es5~#hw#5s}(ah&=M_}2Q$i-~wAh-9cc*9<YJ=}Ao<&e?bAddG$j7E69yFIQ@2Of z^Pn-Ln65L%pzTE`2(gc{W{M-wAf+BlsFRPeiYK3I&UW-+;Z3_OxTK_ zWr-XAl|xxujzB}2&9kHFQ!im%xk(wXtaC^V;Wpvt%8o|A+NY%X+`NzL|NU_lR_H51 zkwR?56cS!+{?M5gvnfH6B>uJi%-weGU$XcI^zbu%V z)Kb|h7ERK}8yg#0%Cn|zzwc)T%2F;l28?-NvjmPj#A2HGI=$BED@e0Bznth)@>&0S3-Q5$-ZBs#>QDAL zM}~-fhW$-aFN-Dpcfbs{r%eAzWsp(kS~;4az~l!&4|{KvQQip_x5vV5sh&1$D+_PL zFi94oORNR~v&W+EF98JT^8+%j=+M>A{$%!LKQ{OIw^(yALkhr_+L6tYS5tet-214) z2+AQ+(pIMK$F_cR59dAEf zL$*5AIl%VQZfaBN1D32r(pg8Sk(DVX|_Y&OB`;WzLA`$t4f57&upUL;r1`*@>macwPQ%>-a8v zX|!^VO$65~_z3~taW{%fJXve=!)#_asJn+ITP}L`Oo69QpgIOAjMX;0cnl-g~-Pj*g8GEEcg5630_Y z-sZ;)92!jy_=`qEzBYTCAjhu}IkG0C#W)Nknl9dUC}0rG0v^sqMqC@= zQ7mmjX5!s_LU}H9!K#n*Z;$+WONHZm8TV*M!tECR!Xp{uw969AzWyxnVc1!wzKy4} zcUwmmI^>e|`OX#OBheese{SauhLqjGWnJPffA?9{SzjmC*Jz#b+3tGh;St1PG}asB zRi=n7FrNGdN)UBDyiif^jR@D8AIn5M?~3&6aqZjzW|ycoU+&-B9Vc4j3(R+8eu}~$ zxPL!wCw2b85rsYETsL5u(lyy~9L}`N=OPeZofhT349$?n1Q#V0}~KCm}4_D+wHCuK|w*lau_;v<_s8!V41i72oTnP z1V~YJwcS#=Dp$_*@bK{F=4L~ZQW=XlH}K4~?@#d*;LkqnK_lRKxFLcHii=6R7N&E! zJ$Z6-a&!&IwY9bDG(I|EfKzhw<0lY}VPRpx;qjQ&N$}kQ_tY96A7{au%1OJ-k&>21 zK}H6)udV*-@X*xWetTv11qTKic;DU+;C;2LHuCcFU0($V{=NyiogN7yM6L*~IwK1< zj8$su|HJxNRQCxZ7A;xksY3(Xq-Q}e_x{T{9mxCu*%cnqql2q2@+s8*ZC@2Rv zx70Bc9Qe}n)aKAo2)5r{t?%X-5bmv@zCzl1{a7N`3{%^p|Ea23oeQ|M-yb~NmF#gXUkeeNDkdqPM z(*^X?Qc@mIpDRS3zP?{9T_L)v>8|^MMHba5P`~X~ficGYKfeky#F!AmWV?;=&py#| zU9Vdb{kAIuUbO~Z1^)g2E8hdW_5T+U`ad3#%N*1fpPQ?vrWR_bQDZ+kHpYkrC*S%z zN6!6ZmQY%H0|DjYZKz$n`HANF45*^sD5R6yN2pIC+I@?I_o7ZYjIo3>uI{2t=!wn$_j9F zfr!(;=!6HE!Hf{W;)%4R9VvSfeFgjLxaUV zhhvz22`+4Dsp~1|YigzX3T|tdS@%W5Wnm)Ykfca~{{T&q`b>L*29k^am?<8AibyS2 zCpWj{^GBdfJ8gbGQaX|;Zp54j7E6CTjWhf=oeBgbX#�wXe<8l4FjVs%o;XYW$p* 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

9tP)6zu$73Y|lrvZ!0 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%0APx==28Mx!1tKd}ePpO2bA>sh!1F<$>hR!f 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 z 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

t7#?Y9#e{u9V!lqtwDo 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ˤ$U11qT9D_^LlG9fTRJ4l3-J@fLUVt1U<_ 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 *L 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 Lm{yOw;&@v?}34e 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/conception.odg b/docs/conception.odg new file mode 100644 index 0000000000000000000000000000000000000000..495c6fac19e875434c5758cc3071d9049722748c GIT binary patch literal 37456 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≥NF+QzCWyR(j)tUW)13s>O6 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�OB{PyvphsFv*eix>SCU$F51UXVu)<*{Y&t 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 + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__AddObject)); + rpc_cpe->method = cwmp_rpc_cpe_addObject; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__AddObjectResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_addObject_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_addObject_response; + rpc_cpe->method_end = cwmp_rpc_cpe_addObject_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:AddObject"; + soap_methods->envelope_response = "cwmp:AddObjectResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__AddObjectResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__AddObjectResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__AddObject; + return rpc_cpe; +} + +int cwmp_rpc_cpe_addObject (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_addObject_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__AddObject *p_soap_cwmp1__AddObject; + struct _cwmp1__AddObjectResponse *p_soap_cwmp1__AddObjectResponse; + struct dm_set_handler *dm_add_handler; + char buf[128]; + int error; + int InstanceNumber; + + dm_add_handler = calloc(1,sizeof(struct dm_set_handler)); + + if (dm_add_handler == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + list_add_tail(&(dm_add_handler->list),&(list_dm_add_handler)); + + INIT_LIST_HEAD (&(dm_add_handler->cmd_list)); + INIT_LIST_HEAD (&(dm_add_handler->cancel_list)); + INIT_LIST_HEAD (&(dm_add_handler->service_list)); + + p_soap_cwmp1__AddObject = (struct _cwmp1__AddObject*)this->method_data; + p_soap_cwmp1__AddObjectResponse = (struct _cwmp1__AddObjectResponse*)this->method_response_data; + + error = cwmp_dm_addObject(cwmp, dm_add_handler, p_soap_cwmp1__AddObject->ObjectName,&InstanceNumber); + + if (error != FAULT_CPE_NO_FAULT_IDX) + { + dm_free_dm_set_handler_queues(dm_add_handler); + if (dm_add_handler!=NULL) + { + list_del(&(dm_add_handler->list)); + free(dm_add_handler); + } + if (cwmp_add_session_rpc_cpe_Fault(session,error)==NULL) + { + return CWMP_GEN_ERR; + } + return CWMP_FAULT_CPE; + } + + CWMP_LOG(INFO,"RUN uci commit"); /* TODO to be removed*/ + sprintf(buf,"%s=%s",UCI_ACS_PARAMETERKEY_PATH,p_soap_cwmp1__AddObject->ParameterKey); + uci_set_value (buf); + uci_commit_value(); + + dm_run_queue_cmd_handler(dm_add_handler,FALSE); + p_soap_cwmp1__AddObjectResponse->InstanceNumber = InstanceNumber; + p_soap_cwmp1__AddObjectResponse->Status = _cwmp1__AddObjectResponse_Status__0; + + if (dm_add_handler->reboot_required==TRUE) + { + CWMP_LOG(INFO,"Add reboot at the end of the session"); + add_session_end_func(session,cwmp_reboot,NULL,TRUE); + p_soap_cwmp1__AddObjectResponse->Status = _cwmp1__AddObjectResponse_Status__1; + } + + if (dm_add_handler->cmd_list.next!=&(dm_add_handler->cmd_list)) + { + add_session_end_func(session,dm_run_queue_cmd_handler_at_end_session,dm_add_handler,FALSE); + p_soap_cwmp1__AddObjectResponse->Status = _cwmp1__AddObjectResponse_Status__1; + return CWMP_OK; + } + + dm_free_dm_set_handler_queues(dm_add_handler); + + if (dm_add_handler!=NULL) + { + list_del(&(dm_add_handler->list)); + free(dm_add_handler); + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_addObject_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send AddObject response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_addObject_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} diff --git a/src/DeleteObject.c b/src/DeleteObject.c new file mode 100644 index 0000000..2558faf --- /dev/null +++ b/src/DeleteObject.c @@ -0,0 +1,157 @@ +/* + DeleteObject.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 20011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include "dm_rpc.h" + +LIST_HEAD(list_dm_del_handler); + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_deleteObject (struct session *session); +int cwmp_rpc_cpe_deleteObject (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_deleteObject_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_deleteObject_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_deleteObject_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); +int cwmp_dm_deleteObject(struct cwmp *cwmp, struct dm_set_handler *dm_set_handler, char *path); +int dm_run_queue_cmd_handler_at_end_session (struct cwmp *cwmp, struct dm_set_handler *dm_set_handler); +int cwmp_reboot(struct cwmp *cwmp,void *v); +int dm_cwmp_config_reload (struct cwmp *cwmp, void *v ); + +struct rpc_cpe *cwmp_add_session_rpc_cpe_deleteObject (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__DeleteObject)); + rpc_cpe->method = cwmp_rpc_cpe_deleteObject; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__DeleteObjectResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_deleteObject_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_deleteObject_response; + rpc_cpe->method_end = cwmp_rpc_cpe_deleteObject_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:DeleteObject"; + soap_methods->envelope_response = "cwmp:DeleteObjectResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__DeleteObjectResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__DeleteObjectResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__DeleteObject; + return rpc_cpe; +} + +int cwmp_rpc_cpe_deleteObject (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_deleteObject_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__DeleteObject *p_soap_cwmp1__DeleteObject; + struct _cwmp1__DeleteObjectResponse *p_soap_cwmp1__DeleteObjectResponse; + struct dm_set_handler *dm_del_handler; + char buf[128]; + int error; + int InstanceNumber; + + dm_del_handler = calloc(1,sizeof(struct dm_set_handler)); + + if (dm_del_handler == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + list_add_tail(&(dm_del_handler->list),&(list_dm_del_handler)); + + INIT_LIST_HEAD (&(dm_del_handler->cmd_list)); + INIT_LIST_HEAD (&(dm_del_handler->cancel_list)); + INIT_LIST_HEAD (&(dm_del_handler->service_list)); + + p_soap_cwmp1__DeleteObject = (struct _cwmp1__DeleteObject*)this->method_data; + p_soap_cwmp1__DeleteObjectResponse = (struct _cwmp1__DeleteObjectResponse*)this->method_response_data; + + error = cwmp_dm_deleteObject(cwmp, dm_del_handler, p_soap_cwmp1__DeleteObject->ObjectName); + + if (error != FAULT_CPE_NO_FAULT_IDX) + { + dm_free_dm_set_handler_queues(dm_del_handler); + if (dm_del_handler!=NULL) + { + list_del(&(dm_del_handler->list)); + free(dm_del_handler); + } + if (cwmp_add_session_rpc_cpe_Fault(session,error)==NULL) + { + return CWMP_GEN_ERR; + } + return CWMP_FAULT_CPE; + } + + CWMP_LOG(INFO,"RUN uci commit"); /* TODO to be removed*/ + sprintf(buf,"%s=%s",UCI_ACS_PARAMETERKEY_PATH,p_soap_cwmp1__DeleteObject->ParameterKey); + uci_set_value (buf); + uci_commit_value(); + + dm_run_queue_cmd_handler(dm_del_handler,FALSE); + + p_soap_cwmp1__DeleteObjectResponse->Status = _cwmp1__DeleteObjectResponse_Status__0; + + if (dm_del_handler->reboot_required==TRUE) + { + CWMP_LOG(INFO,"Add reboot at the end of the session"); + add_session_end_func(session,cwmp_reboot,NULL,TRUE); + p_soap_cwmp1__DeleteObjectResponse->Status = _cwmp1__DeleteObjectResponse_Status__1; + } + + if (dm_del_handler->cmd_list.next!=&(dm_del_handler->cmd_list)) + { + add_session_end_func(session,dm_run_queue_cmd_handler_at_end_session,dm_del_handler,FALSE); + p_soap_cwmp1__DeleteObjectResponse->Status = _cwmp1__DeleteObjectResponse_Status__1; + return CWMP_OK; + } + + dm_free_dm_set_handler_queues(dm_del_handler); + + if (dm_del_handler!=NULL) + { + list_del(&(dm_del_handler->list)); + free(dm_del_handler); + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_deleteObject_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send DeleteObject response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_deleteObject_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} diff --git a/src/Download.c b/src/Download.c new file mode 100644 index 0000000..b20c38d --- /dev/null +++ b/src/Download.c @@ -0,0 +1,639 @@ +/* + Download.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include +#include +#include +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "backupSession.h" + +#if LIBCURL_VERSION_NUM < 0x070907 +#error LIBCURL version should be >= 7.9.7 +#endif + +LIST_HEAD(list_download); +static struct download_end_func *download_end_func = NULL; +static pthread_mutex_t mutex_download; +static pthread_cond_t threshold_download; +static bool thread_download_is_working = FALSE; +int count_download_queue = 0; +extern struct cwmp cwmp_main; + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_download (struct session *session); +int cwmp_rpc_cpe_download (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_download_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_download_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_download_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); +struct _cwmp1__TransferComplete *cwmp_set_data_rpc_acs_transferComplete(); +int cwmp_reboot(struct cwmp *cwmp,void *v); +size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream); +int cwmp_launch_download(struct cwmp *cwmp, struct session *session, struct download *pDownload); +int cwmp_download_firmware(struct cwmp *cwmp, struct session *session); +int cwmp_download_web_content(struct cwmp *cwmp, struct session *session); +int cwmp_download_configuration_file(struct cwmp *cwmp, struct session *session); +void backup_session_insert_download(char *commandKey, char *url, time_t id); +void backup_session_delete_download(char *commandKey, char *url, time_t id); +void backup_session_insert_parameter_download(char *name, char *value, char *url, int id, char *commandKey); + +typedef struct FILE_DOWNLOAD_TYPE +{ + char *FILE_TYPE; + char *FILE_NAME; + unsigned short APPLY_AFTER_REBOOT; + unsigned int CHECK_SIZE; + long int *MEMORY_SIZE; + int (*UPDATE_VALUE)(); + int (*DOWNLOAD)(struct cwmp *cwmp, struct session *session); +} FILE_DOWNLOAD_TYPE; + +const struct FILE_DOWNLOAD_TYPE FILE_DOWNLOAD_TYPE_ARRAY [] = { + {"1 Firmware Upgrade Image" ,DOWNLOADED_FIRMWARE_FILE ,1,ENABLE_CHECK_SIZE ,&(cwmp_main.env.max_firmware_size),NULL,cwmp_download_firmware}, + {"2 Web Content" ,DOWNLOADED_WEBCONTENT_FILE,0,DISABLE_CHECK_SIZE,0 ,NULL,cwmp_download_web_content}, + {"3 Vendor Configuration File",DOWNLOADED_CONFIG_FILE ,1,DISABLE_CHECK_SIZE,0 ,NULL,cwmp_download_configuration_file} +}; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_download (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__Download)); + rpc_cpe->method = cwmp_rpc_cpe_download; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__DownloadResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_download_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_download_response; + rpc_cpe->method_end = cwmp_rpc_cpe_download_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:Download"; + soap_methods->envelope_response = "cwmp:DownloadResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__DownloadResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__DownloadResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__Download; + return rpc_cpe; +} + +void *thread_cwmp_rpc_cpe_download (void *v) +{ + struct cwmp *cwmp = (struct cwmp *)v; + struct download *download; + struct timespec download_timeout = {0, 0}; + time_t current_time; + int error = FAULT_CPE_NO_FAULT_IDX; + time_t download_startTime; + time_t download_completeTime; + char startTime[64]; + char completeTime[64]; + struct _cwmp1__TransferComplete *p_soap_cwmp1__TransferComplete; + extern struct FAULT_CPE FAULT_CPE_ARRAY [FAULT_CPE_ARRAY_SIZE]; + long int time_of_grace = 3600,timeout; + + thread_download_is_working = TRUE; + while (list_download.next!=&(list_download)) + { + download = list_entry(list_download.next,struct download, list); + current_time = time(NULL); + timeout = current_time - download->scheduled_time; + if((timeout >= 0)&&(timeout > time_of_grace)) + { + pthread_mutex_lock (&mutex_download); + backup_session_delete_download(download->CommandKey,download->URL,download->scheduled_time); + p_soap_cwmp1__TransferComplete = cwmp_set_data_rpc_acs_transferComplete (); + if(p_soap_cwmp1__TransferComplete != NULL) + { + error = FAULT_CPE_DOWNLOAD_FAILURE_IDX; + download_completeTime = time((time_t*)NULL); + + p_soap_cwmp1__TransferComplete->CommandKey = strdup(download->CommandKey); + p_soap_cwmp1__TransferComplete->StartTime = time((time_t*)NULL); + p_soap_cwmp1__TransferComplete->CompleteTime = p_soap_cwmp1__TransferComplete->StartTime; + + sprintf(startTime,"%li",p_soap_cwmp1__TransferComplete->StartTime); + backup_session_insert_rpc("TransferComplete",p_soap_cwmp1__TransferComplete->CommandKey,RPC_NO_STATUS); + backup_session_insert_parameter("StartTime",startTime,"rpc","TransferComplete",-1,p_soap_cwmp1__TransferComplete->CommandKey); + backup_session_insert_parameter("CompleteTime",startTime,"rpc","TransferComplete",-1,p_soap_cwmp1__TransferComplete->CommandKey); + + p_soap_cwmp1__TransferComplete->FaultStruct = calloc(1,sizeof(struct cwmp1__FaultStruct)); + p_soap_cwmp1__TransferComplete->FaultStruct->FaultCode = strdup(FAULT_CPE_ARRAY[error].CODE); + p_soap_cwmp1__TransferComplete->FaultStruct->FaultString = strdup(FAULT_CPE_ARRAY[error].DESCRIPTION); + + backup_session_insert_parameter("FaultCode",p_soap_cwmp1__TransferComplete->FaultStruct->FaultCode,"rpc","TransferComplete",-1,p_soap_cwmp1__TransferComplete->CommandKey); + cwmp_root_cause_TransferComplete (cwmp); + } + list_del (&(download->list)); + count_download_queue--; + cwmp_free_download_request(download); + pthread_mutex_unlock (&mutex_download); + } + if((timeout >= 0)&&(timeout <= time_of_grace)) + { + pthread_mutex_lock (&(cwmp->mutex_session_send)); + CWMP_LOG(INFO,"Launch download file %s",download->URL); + error = cwmp_launch_download(cwmp,NULL,download); + if((error != FAULT_CPE_NO_FAULT_IDX)||(download_end_func == NULL)) + { + cwmp_root_cause_TransferComplete (cwmp); + } + run_download_end_func (cwmp); + pthread_mutex_unlock (&(cwmp->mutex_session_send)); + pthread_cond_signal (&(cwmp->threshold_session_send)); + pthread_mutex_lock (&mutex_download); + list_del (&(download->list)); + count_download_queue--; + cwmp_free_download_request(download); + pthread_mutex_unlock (&mutex_download); + continue; + } + pthread_mutex_lock (&mutex_download); + download_timeout.tv_sec = download->scheduled_time; + pthread_cond_timedwait(&threshold_download, &mutex_download, &download_timeout); + pthread_mutex_unlock (&mutex_download); + } + thread_download_is_working = FALSE; + return CWMP_OK; +} + +size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + size_t written; + + written = fwrite(ptr, size, nmemb, stream); + return written; +} + +int cwmp_rpc_cpe_download (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__DownloadResponse *p_soap_cwmp1__DownloadResponse; + struct _cwmp1__Download *p_soap_cwmp1__Download; + int error = FAULT_CPE_NO_FAULT_IDX; + int i; + char *url; + long int check_size; + struct download *download; + time_t scheduled_time; + struct list_head *ilist; + bool cond_signal = FALSE; + pthread_t download_thread; + char scheduledTime[64]; + char delaySeconds[64]; + bool valid_file_type = FALSE; + + p_soap_cwmp1__Download = (struct _cwmp1__Download *)this->method_data; + p_soap_cwmp1__DownloadResponse = (struct _cwmp1__DownloadResponse *)this->method_response_data; + url = p_soap_cwmp1__Download->URL; + p_soap_cwmp1__DownloadResponse->Status = _cwmp1__DownloadResponse_Status__1; + + for(i=0;iFileType) == 0) + { + valid_file_type = TRUE; + if(FILE_DOWNLOAD_TYPE_ARRAY[i].CHECK_SIZE == ENABLE_CHECK_SIZE) + { + if(FILE_DOWNLOAD_TYPE_ARRAY[i].UPDATE_VALUE != NULL) + { + FILE_DOWNLOAD_TYPE_ARRAY[i].UPDATE_VALUE(); + } + check_size = *(FILE_DOWNLOAD_TYPE_ARRAY[i].MEMORY_SIZE); + } + break; + } + } + if((FILE_DOWNLOAD_TYPE_ARRAY[i].CHECK_SIZE == ENABLE_CHECK_SIZE) && + ((check_size>0)&&(check_size < (long int)p_soap_cwmp1__Download->FileSize))) + { + error = FAULT_CPE_DOWNLOAD_FAILURE_IDX; + } + else if(count_download_queue>=MAX_DOWNLOAD_QUEUE) + { + error = FAULT_CPE_RESOURCES_EXCEEDED_IDX; + } + else if((url == NULL || ((url != NULL) && (strcmp(url,"")==0)))|| + (!valid_file_type)) + { + error = FAULT_CPE_REQUEST_DENIED_IDX; + } + else if(strstr(url,"@") != NULL) + { + error = FAULT_CPE_INVALID_ARGUMENTS_IDX; + } + else if(strncmp(url,DOWNLOAD_PROTOCOL_HTTP,strlen(DOWNLOAD_PROTOCOL_HTTP))!=0 && + strncmp(url,DOWNLOAD_PROTOCOL_FTP,strlen(DOWNLOAD_PROTOCOL_FTP))!=0) + { + error = FAULT_CPE_FILE_TRANSFER_UNSUPPORTED_PROTOCOL_IDX; + } + + if(error != FAULT_CPE_NO_FAULT_IDX) + { + if (cwmp_add_session_rpc_cpe_Fault(session,error) == NULL) + { + return CWMP_GEN_ERR; + } + return CWMP_FAULT_CPE; + } + + if(p_soap_cwmp1__Download->DelaySeconds == 0) + { + download = calloc (1,sizeof(struct download)); + if (download == NULL) + { + return CWMP_GEN_ERR; + } + download->CommandKey = strdup(p_soap_cwmp1__Download->CommandKey); + download->FileType = strdup(p_soap_cwmp1__Download->FileType); + download->URL = strdup(p_soap_cwmp1__Download->URL); + download->Username = strdup(p_soap_cwmp1__Download->Username); + download->Password = strdup(p_soap_cwmp1__Download->Password); + download->scheduled_time = 0; + + error = cwmp_launch_download(cwmp,session,download); + if((error != FAULT_CPE_NO_FAULT_IDX)||(FILE_DOWNLOAD_TYPE_ARRAY[i].APPLY_AFTER_REBOOT == 0)) + { + if(cwmp_root_cause_TransferComplete (cwmp) != CWMP_OK) + { + cwmp_free_download_request(download); + return CWMP_GEN_ERR; + } + } + cwmp_free_download_request(download); + } + else + { + pthread_mutex_lock (&mutex_download); + + scheduled_time = time(NULL) + p_soap_cwmp1__Download->DelaySeconds; + __list_for_each(ilist,&(list_download)) + { + download = list_entry(ilist,struct download, list); + if (download->scheduled_time == scheduled_time) + { + pthread_mutex_unlock (&mutex_download); + return CWMP_OK; + } + if (download->scheduled_time > scheduled_time) + { + cond_signal = TRUE; + break; + } + } + CWMP_LOG(INFO,"Download will start in %us",p_soap_cwmp1__Download->DelaySeconds); + download = calloc (1,sizeof(struct download)); + if (download == NULL) + { + pthread_mutex_unlock (&mutex_download); + return CWMP_OK; + } + + download->CommandKey = strdup(p_soap_cwmp1__Download->CommandKey); + download->FileType = strdup(p_soap_cwmp1__Download->FileType); + download->URL = strdup(p_soap_cwmp1__Download->URL); + download->Username = strdup(p_soap_cwmp1__Download->Username); + download->Password = strdup(p_soap_cwmp1__Download->Password); + download->scheduled_time = scheduled_time; + + backup_session_insert_download(download->CommandKey,download->URL,download->scheduled_time); + backup_session_insert_parameter_download("Password",download->Password,download->URL,download->scheduled_time,download->CommandKey); + backup_session_insert_parameter_download("Username",download->Username,download->URL,download->scheduled_time,download->CommandKey); + backup_session_insert_parameter_download("FileType",download->FileType,download->URL,download->scheduled_time,download->CommandKey); + + list_add (&(download->list), ilist->prev); + count_download_queue++; + if (cond_signal) + { + pthread_cond_signal(&threshold_download); + } + pthread_mutex_unlock (&mutex_download); + + if (!thread_download_is_working) + { + thread_download_is_working = TRUE; + error = pthread_create(&download_thread, NULL, &thread_cwmp_rpc_cpe_download, (void *)cwmp); + if (error<0) + { + CWMP_LOG(ERROR,"Error when creating the download thread!"); + thread_download_is_working = FALSE; + return CWMP_OK; + } + } + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_download_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_download_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_download_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_launch_download(struct cwmp *cwmp, struct session *session, struct download *pDownload) +{ + CURL *curl; + FILE *fp; + CURLcode res; + int error = FAULT_CPE_NO_FAULT_IDX; + int i; + char filename[256]; + int (*doDownload)(struct cwmp *cwmp, struct session *session); + time_t download_startTime; + time_t download_completeTime; + char startTime[64]; + char completeTime[64]; + struct _cwmp1__TransferComplete *p_soap_cwmp1__TransferComplete; + extern struct FAULT_CPE FAULT_CPE_ARRAY [FAULT_CPE_ARRAY_SIZE]; + char userpwd[256]; + + download_startTime = time((time_t*)NULL); + + if(pDownload->scheduled_time != 0) + { + backup_session_delete_download(pDownload->CommandKey,pDownload->URL,pDownload->scheduled_time); + } + + for(i=0;iFileType) == 0) + { + doDownload = FILE_DOWNLOAD_TYPE_ARRAY[i].DOWNLOAD; + strcpy(filename,FILE_DOWNLOAD_TYPE_ARRAY[i].FILE_NAME); + break; + } + } + + curl = curl_easy_init(); + + if (curl) + { + fp = fopen(filename,"wb"); + if((strcmp(pDownload->URL,"") != 0)&& + (pDownload->URL != NULL)) + { + +#if LIBCURL_VERSION_NUM >= 0x071301 + if((strcmp(pDownload->Username,"") != 0)&& + (pDownload->Username != NULL)) + { + curl_easy_setopt(curl, CURLOPT_USERNAME, pDownload->Username); + } + if((strcmp(pDownload->Password,"") != 0)&& + (pDownload->Password != NULL)) + { + curl_easy_setopt(curl, CURLOPT_PASSWORD, pDownload->Password); + } +#else + if(((strcmp(pDownload->Username,"") != 0)&&(pDownload->Username != NULL))&& + (strcmp(pDownload->Password,"") != 0)&&(pDownload->Password != NULL)) + { + sprintf(userpwd,"%s:%s",pDownload->Username,pDownload->Password); + curl_easy_setopt(curl, CURLOPT_USERPWD, userpwd); + } +#endif + curl_easy_setopt(curl, CURLOPT_URL, pDownload->URL); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, TRUE); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + } + fclose(fp); + } + + if(res != CURLE_OK) + { + remove(filename); + } + + switch(res) + { + case CURLE_OK: + error = FAULT_CPE_NO_FAULT_IDX; /** No fault code **/ + break; + case CURLE_UNSUPPORTED_PROTOCOL: +#if LIBCURL_VERSION_NUM >= 0x071100 + case CURLE_REMOTE_ACCESS_DENIED: +#endif + error = FAULT_CPE_REQUEST_DENIED_IDX; /** Request denied **/ + break; + case CURLE_OUT_OF_MEMORY: + error = FAULT_CPE_INTERNAL_ERROR_IDX; /** Internal error **/ + break; + case CURLE_FTP_CANT_GET_HOST: + case CURLE_URL_MALFORMAT: + case CURLE_COULDNT_RESOLVE_HOST: + case CURLE_COULDNT_CONNECT: + error = FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER_IDX; /** Download failure: unable to contact file server **/ + break; + case CURLE_FTP_COULDNT_RETR_FILE: +#if LIBCURL_VERSION_NUM >= 0x071001 + case CURLE_REMOTE_FILE_NOT_FOUND: +#endif +#if LIBCURL_VERSION_NUM >= 0x070a03 + case CURLE_HTTP_RETURNED_ERROR: +#endif +#if LIBCURL_VERSION_NUM >= 0x071500 + case CURLE_FTP_BAD_FILE_LIST: +#endif +#if LIBCURL_VERSION_NUM >= 0x070901 + case CURLE_GOT_NOTHING: +#endif + error = FAULT_CPE_DOWNLOAD_FAIL_ACCESS_FILE_IDX; /** Download failure: unable to access file **/ + break; +#if LIBCURL_VERSION_NUM >= 0x070a02 + case CURLE_OPERATION_TIMEDOUT: + error = FAULT_CPE_DOWNLOAD_FAIL_COMPLETE_DOWNLOAD_IDX; /** Download failure: unable to complete download **/ + break; +#endif +#if LIBCURL_VERSION_NUM >= 0x070d01 + case CURLE_LOGIN_DENIED: + error = FAULT_CPE_DOWNLOAD_FAIL_FILE_AUTHENTICATION_IDX; /** Download failure: file authentication failure **/ + break; +#endif + default: + error = FAULT_CPE_DOWNLOAD_FAILURE_IDX; /** Download failure **/ + break; + } + + if(error == FAULT_CPE_NO_FAULT_IDX) + { + error = doDownload (cwmp,session); + } + + p_soap_cwmp1__TransferComplete = cwmp_set_data_rpc_acs_transferComplete (); + if(p_soap_cwmp1__TransferComplete == NULL) + { + error = FAULT_CPE_INTERNAL_ERROR_IDX; + return error; + } + download_completeTime = time((time_t*)NULL); + + p_soap_cwmp1__TransferComplete->CommandKey = strdup(pDownload->CommandKey); + p_soap_cwmp1__TransferComplete->StartTime = download_startTime; + p_soap_cwmp1__TransferComplete->CompleteTime = download_completeTime; + + sprintf(startTime,"%li",p_soap_cwmp1__TransferComplete->StartTime); + sprintf(completeTime,"%li",download_completeTime); + + backup_session_insert_rpc("TransferComplete",p_soap_cwmp1__TransferComplete->CommandKey,RPC_NO_STATUS); + backup_session_insert_parameter("StartTime",startTime,"rpc","TransferComplete",-1,p_soap_cwmp1__TransferComplete->CommandKey); + backup_session_insert_parameter("CompleteTime",completeTime,"rpc","TransferComplete",-1,p_soap_cwmp1__TransferComplete->CommandKey); + + if(error != FAULT_CPE_NO_FAULT_IDX) + { + p_soap_cwmp1__TransferComplete->FaultStruct = calloc(1,sizeof(struct cwmp1__FaultStruct)); + p_soap_cwmp1__TransferComplete->FaultStruct->FaultCode = strdup(FAULT_CPE_ARRAY[error].CODE); + p_soap_cwmp1__TransferComplete->FaultStruct->FaultString = strdup(FAULT_CPE_ARRAY[error].DESCRIPTION); + + backup_session_insert_parameter("FaultCode",p_soap_cwmp1__TransferComplete->FaultStruct->FaultCode,"rpc","TransferComplete",-1,p_soap_cwmp1__TransferComplete->CommandKey); + } + + return error; +} + +int cwmp_download_firmware (struct cwmp *cwmp, struct session *session) +{ + int error = FAULT_CPE_NO_FAULT_IDX; + + error = uci_upgrade_image(cwmp,session); + + return error; +} + +int cwmp_download_web_content (struct cwmp *cwmp, struct session *session) +{ + int error = FAULT_CPE_NO_FAULT_IDX; + + error = uci_apply_web_packages(); + + return error; +} + +int cwmp_download_configuration_file (struct cwmp *cwmp, struct session *session) +{ + int error = FAULT_CPE_NO_FAULT_IDX; + + error = uci_apply_configuration(); + if(error == FAULT_CPE_NO_FAULT_IDX) + { + if(session != NULL) + { + add_session_end_func(session,cwmp_reboot,NULL,TRUE); + } + else + { + add_download_end_func(cwmp_reboot,NULL); + } + } + + return error; +} + +int cwmp_free_download_request(struct download *download) +{ + if(download != NULL) + { + if(download->CommandKey != NULL) + { + free(download->CommandKey); + } + if(download->FileType != NULL) + { + free(download->FileType); + } + if(download->URL != NULL) + { + free(download->URL); + } + if(download->Username != NULL) + { + free(download->Username); + } + if(download->Password != NULL) + { + free(download->Password); + } + free(download); + } + return CWMP_OK; +} + +int add_download_end_func (int (*func)(struct cwmp *cwmp, void *input),void *input) +{ + download_end_func = calloc(1,sizeof(struct download_end_func)); + if(download_end_func == NULL) + { + return CWMP_MEM_ERR; + } + download_end_func->func = func; + download_end_func->input = input; + + return CWMP_OK; +} + +int run_download_end_func (struct cwmp *cwmp) +{ + int error = CWMP_OK; + + if(download_end_func != NULL) + { + error = download_end_func->func(cwmp,download_end_func->input); + free (download_end_func); + download_end_func = NULL; + } + + return error; +} + +int cwmp_scheduledDownload_remove_all() +{ + struct download *download; + + pthread_mutex_lock (&mutex_download); + while (list_download.next!=&(list_download)) + { + download = list_entry(list_download.next,struct download, list); + list_del (&(download->list)); + backup_session_delete_download(download->CommandKey,download->URL,download->scheduled_time); + count_download_queue--; + cwmp_free_download_request(download); + } + pthread_mutex_unlock (&mutex_download); + + return CWMP_OK; +} diff --git a/src/FactoryReset.c b/src/FactoryReset.c new file mode 100644 index 0000000..c7bf1ce --- /dev/null +++ b/src/FactoryReset.c @@ -0,0 +1,79 @@ +/* + FactoryReset.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include "soapH.h" +#include "cwmp.h" + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_factoryReset (struct session *session); +int cwmp_rpc_cpe_factoryReset (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_factoryReset_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_factoryReset_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_factoryReset_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +int cwmp_reset_factory(struct cwmp *cwmp,void *v); + +struct rpc_cpe *cwmp_add_session_rpc_cpe_factoryReset (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__FactoryReset)); + rpc_cpe->method = cwmp_rpc_cpe_factoryReset; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__FactoryResetResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_factoryReset_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_factoryReset_response; + rpc_cpe->method_end = cwmp_rpc_cpe_factoryReset_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:FactoryReset"; + soap_methods->envelope_response = "cwmp:FactoryResetResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__FactoryReset; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__FactoryReset; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__FactoryReset; + return rpc_cpe; +} + +int cwmp_rpc_cpe_factoryReset (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + add_session_end_func(session,cwmp_reset_factory,NULL,TRUE); + return CWMP_OK; +} + +int cwmp_rpc_cpe_factoryReset_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_factoryReset_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_factoryReset_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} diff --git a/src/Fault_cpe.c b/src/Fault_cpe.c new file mode 100644 index 0000000..b68c211 --- /dev/null +++ b/src/Fault_cpe.c @@ -0,0 +1,211 @@ +/* + Fault_cpe.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" + +#define FAULT_CPE_TYPE_CLIENT 0 +#define FAULT_CPE_TYPE_SERVER 1 + +char *FAULT_CPE_ARRAY_TYPE [] = { + [FAULT_CPE_TYPE_CLIENT] = "Client", + [FAULT_CPE_TYPE_SERVER] = "Server" +}; + +struct FAULT_CPE FAULT_CPE_ARRAY [] = { + [FAULT_CPE_NO_FAULT_IDX] = {NULL, 0, NULL}, + [FAULT_CPE_METHOD_NOT_SUPPORTED_IDX] = {"9000",FAULT_CPE_TYPE_SERVER, "Method not supported"}, + [FAULT_CPE_REQUEST_DENIED_IDX] = {"9001",FAULT_CPE_TYPE_SERVER, "Request denied (no reason specified)"}, + [FAULT_CPE_INTERNAL_ERROR_IDX] = {"9002",FAULT_CPE_TYPE_SERVER, "Internal error"}, + [FAULT_CPE_INVALID_ARGUMENTS_IDX] = {"9003",FAULT_CPE_TYPE_CLIENT, "Invalid arguments"}, + [FAULT_CPE_RESOURCES_EXCEEDED_IDX] = {"9004",FAULT_CPE_TYPE_SERVER, "Resources exceeded"}, + [FAULT_CPE_INVALID_PARAMETER_NAME_IDX] = {"9005",FAULT_CPE_TYPE_CLIENT, "Invalid parameter name"}, + [FAULT_CPE_INVALID_PARAMETER_TYPE_IDX] = {"9006",FAULT_CPE_TYPE_CLIENT, "Invalid parameter type"}, + [FAULT_CPE_INVALID_PARAMETER_VALUE_IDX] = {"9007",FAULT_CPE_TYPE_CLIENT, "Invalid parameter value"}, + [FAULT_CPE_NON_WRITABLE_PARAMETER_IDX] = {"9008",FAULT_CPE_TYPE_CLIENT, "Attempt to set a non-writable parameter"}, + [FAULT_CPE_NOTIFICATION_REJECTED_IDX] = {"9009",FAULT_CPE_TYPE_SERVER, "Notification request rejected"}, + [FAULT_CPE_DOWNLOAD_FAILURE_IDX] = {"9010",FAULT_CPE_TYPE_SERVER, "Download failure"}, + [FAULT_CPE_UPLOAD_FAILURE_IDX] = {"9011",FAULT_CPE_TYPE_SERVER, "Upload failure"}, + [FAULT_CPE_FILE_TRANSFER_AUTHENTICATION_FAILURE_IDX]= {"9012",FAULT_CPE_TYPE_SERVER, "File transfer server authentication failure"}, + [FAULT_CPE_FILE_TRANSFER_UNSUPPORTED_PROTOCOL_IDX] = {"9013",FAULT_CPE_TYPE_SERVER, "Unsupported protocol for file transfer"}, + [FAULT_CPE_DOWNLOAD_FAIL_MULTICAST_GROUP_IDX] = {"9014",FAULT_CPE_TYPE_SERVER, "Download failure: unable to join multicast group"}, + [FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER_IDX] = {"9015",FAULT_CPE_TYPE_SERVER, "Download failure: unable to contact file server"}, + [FAULT_CPE_DOWNLOAD_FAIL_ACCESS_FILE_IDX] = {"9016",FAULT_CPE_TYPE_SERVER, "Download failure: unable to access file"}, + [FAULT_CPE_DOWNLOAD_FAIL_COMPLETE_DOWNLOAD_IDX] = {"9017",FAULT_CPE_TYPE_SERVER, "Download failure: unable to complete download"}, + [FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX] = {"9018",FAULT_CPE_TYPE_SERVER, "Download failure: file corrupted"}, + [FAULT_CPE_DOWNLOAD_FAIL_FILE_AUTHENTICATION_IDX] = {"9019",FAULT_CPE_TYPE_SERVER, "Download failure: file authentication failure"} +}; + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); + +int cwmp_rpc_cpe_fault (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_fault_response_data_init (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_fault_response (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_fault_end (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_fault_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type); + +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + struct fault *fault; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + fault = &(rpc_cpe->fault); + rpc_cpe->method_data = NULL; + rpc_cpe->method = cwmp_rpc_cpe_fault; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct SOAP_ENV__Fault)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_fault_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_fault_response; + rpc_cpe->method_end = cwmp_rpc_cpe_fault_end; + rpc_cpe->destructor = cwmp_rpc_cpe_fault_destructor; + soap_methods->envelope = ""; + soap_methods->envelope_response = "SOAP-ENV:Fault"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize_SOAP_ENV__Fault; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put_SOAP_ENV__Fault; + soap_methods->soap_get_cwmp1__rpc_received_data = NULL; + fault->code_idx = idx; + return rpc_cpe; +} + +int cwmp_rpc_cpe_fault (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_fault_response_data_init (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + + struct SOAP_ENV__Fault *p_soap_Fault; + struct _cwmp1__Fault *fault; + struct fault *rpc_fault; + struct SOAP_ENV__Detail *detail; + int type_idx; + + if (session==NULL || this==NULL) + { + return CWMP_GEN_ERR; + } + + p_soap_Fault = (struct SOAP_ENV__Fault *) this->method_response_data; + rpc_fault = &(this->fault); + type_idx = FAULT_CPE_ARRAY[rpc_fault->code_idx].TYPE; + p_soap_Fault->faultcode = FAULT_CPE_ARRAY_TYPE[type_idx]; + p_soap_Fault->faultstring = "CWMP fault"; + p_soap_Fault->detail = (struct SOAP_ENV__Detail *) calloc(1, sizeof(struct SOAP_ENV__Detail)); + if (p_soap_Fault->detail == NULL) + { + return CWMP_MEM_ERR; + } + detail = p_soap_Fault->detail; + detail->__type = SOAP_TYPE__cwmp1__Fault; + detail->fault = (struct _cwmp1__Fault *) calloc(1, sizeof(struct _cwmp1__Fault)); + if (detail->fault == NULL) + { + return CWMP_MEM_ERR; + } + fault = (struct _cwmp1__Fault *) detail->fault; + fault->FaultCode = FAULT_CPE_ARRAY[rpc_fault->code_idx].CODE; + fault->FaultString = FAULT_CPE_ARRAY[rpc_fault->code_idx].DESCRIPTION; + if (rpc_fault->parameter_cause!=NULL) + { + fault->SetParameterValuesFault = (struct _cwmp1__Fault_SetParameterValuesFault *) calloc(1, sizeof(struct _cwmp1__Fault_SetParameterValuesFault)); + fault->SetParameterValuesFault->FaultCode = strdup(FAULT_CPE_ARRAY[rpc_fault->code_idx].CODE); + fault->SetParameterValuesFault->FaultString = strdup(FAULT_CPE_ARRAY[rpc_fault->code_idx].DESCRIPTION); + fault->SetParameterValuesFault->ParameterName = rpc_fault->parameter_cause; + fault->__sizeSetParameterValuesFault = 1; + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_fault_response (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send Fault response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_Fault_parameter_cause (struct rpc_cpe *this, char *parameter) +{ + this->fault.parameter_cause = strdup(parameter); + return CWMP_OK; +} + +int cwmp_rpc_cpe_fault_end (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct SOAP_ENV__Fault *p_soap_Fault; + struct _cwmp1__Fault *fault; + struct SOAP_ENV__Detail *detail; + + p_soap_Fault = (struct SOAP_ENV__Fault *) this->method_response_data; + if (p_soap_Fault!=NULL) + { + detail = p_soap_Fault->detail; + if (detail!=NULL) + { + fault = (struct _cwmp1__Fault *)detail->fault; + if (fault->SetParameterValuesFault!=NULL) + { + if (fault->SetParameterValuesFault->FaultCode!=NULL) + { + free (fault->SetParameterValuesFault->FaultCode); + } + if (fault->SetParameterValuesFault->FaultString!=NULL) + { + free (fault->SetParameterValuesFault->FaultString); + } + free (fault->SetParameterValuesFault); + } + if (fault!=NULL) + { + free (fault); + } + free (detail); + } + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_fault_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct SOAP_ENV__Fault *p_soap_Fault; + + p_soap_Fault = (struct SOAP_ENV__Fault *) this->method_response_data; + if (p_soap_Fault!=NULL) + { + free (p_soap_Fault); + } + if (this->fault.parameter_cause!=NULL) + { + free (this->fault.parameter_cause); + } + list_del(&(this->list)); + free (this); + return CWMP_OK; +} diff --git a/src/GetParameterAttributes.c b/src/GetParameterAttributes.c new file mode 100644 index 0000000..96a9d55 --- /dev/null +++ b/src/GetParameterAttributes.c @@ -0,0 +1,216 @@ +/* + GetParameterAttributes.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 20011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include "dm_rpc.h" + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterAttributes (struct session *session); +int cwmp_rpc_cpe_getParameterAttributes (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterAttributes_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterAttributes_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterAttributes_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); +int cwmp_dm_getParameterAttributes(struct cwmp *cwmp, char *path, struct list_head *list, int *n); +int free_list_getParameterAttributes(struct list_head *list); + +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterAttributes (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__GetParameterAttributes)); + rpc_cpe->method = cwmp_rpc_cpe_getParameterAttributes; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__GetParameterAttributesResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_getParameterAttributes_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_getParameterAttributes_response; + rpc_cpe->method_end = cwmp_rpc_cpe_getParameterAttributes_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:GetParameterAttributes"; + soap_methods->envelope_response = "cwmp:GetParameterAttributesResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__GetParameterAttributesResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__GetParameterAttributesResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__GetParameterAttributes; + return rpc_cpe; +} + +int cwmp_rpc_cpe_getParameterAttributes (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_getParameterAttributes_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetParameterAttributes *p_soap_cwmp1__GetParameterAttributes; + struct _cwmp1__GetParameterAttributesResponse *p_soap_cwmp1__GetParameterAttributesResponse; + struct cwmp1__ParameterAttributeStruct **ptr_ParameterAttributeStruct; + struct cwmp1ParameterAttributeList *ParameterList; + char **name; + int i,n,size,error; + int size_response = 0; + LIST_HEAD(list_ParameterAttributesStruct); + + p_soap_cwmp1__GetParameterAttributes = (struct _cwmp1__GetParameterAttributes *)this->method_data; + p_soap_cwmp1__GetParameterAttributesResponse = (struct _cwmp1__GetParameterAttributesResponse *)this->method_response_data; + name = p_soap_cwmp1__GetParameterAttributes->ParameterNames->__ptrstring; + size = p_soap_cwmp1__GetParameterAttributes->ParameterNames->__size; + + for(i=0;i__size = size_response; + ParameterList->__ptrParameterAttributeStruct = ptr_ParameterAttributeStruct; + p_soap_cwmp1__GetParameterAttributesResponse->ParameterList = ParameterList; + + while(!list_empty(&list_ParameterAttributesStruct)) + { + struct handler_ParameterAttributeStruct *handler_ParameterAttributeStruct; + handler_ParameterAttributeStruct = list_entry (list_ParameterAttributesStruct.next, struct handler_ParameterAttributeStruct, list); + *ptr_ParameterAttributeStruct = handler_ParameterAttributeStruct->ParameterAttributeStruct; + ptr_ParameterAttributeStruct++; + list_del(list_ParameterAttributesStruct.next); + free(handler_ParameterAttributeStruct); + } + return CWMP_OK; +} + +int cwmp_rpc_cpe_getParameterAttributes_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send GetParameterAttributes response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} +int cwmp_rpc_cpe_getParameterAttributes_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetParameterAttributesResponse *p_soap_cwmp1__GetParameterAttributesResponse; + struct cwmp1__ParameterAttributeStruct **ptrParameterAttributeStruct,*pParameterAttributeStruct; + char **ptrAccessList,*pAccessList; + int i,j,size_ParameterAttributeStruct,size_AccessList; + + p_soap_cwmp1__GetParameterAttributesResponse = (struct _cwmp1__GetParameterAttributesResponse *)this->method_response_data; + + if(p_soap_cwmp1__GetParameterAttributesResponse->ParameterList != NULL) + { + size_ParameterAttributeStruct = p_soap_cwmp1__GetParameterAttributesResponse->ParameterList->__size; + ptrParameterAttributeStruct = p_soap_cwmp1__GetParameterAttributesResponse->ParameterList->__ptrParameterAttributeStruct; + + for(i=0;iName != NULL) + { + free(pParameterAttributeStruct->Name); + } + if(pParameterAttributeStruct->AccessList != NULL) + { + size_AccessList = pParameterAttributeStruct->AccessList->__size; + ptrAccessList = pParameterAttributeStruct->AccessList->__ptrstring; + for(j=0;jAccessList); + } + + ptrParameterAttributeStruct++; + free(pParameterAttributeStruct); + } + } + free(p_soap_cwmp1__GetParameterAttributesResponse->ParameterList); + } + + return CWMP_OK; +} + +int free_list_getParameterAttributes(struct list_head *list) +{ + struct handler_ParameterAttributeStruct *handler_ParameterAttributeStruct; + struct cwmp1__ParameterAttributeStruct *ParameterAttributeStruct; + int i; + char **pAccessList; + + while(list->next!=list) + { + handler_ParameterAttributeStruct = list_entry (list->next, struct handler_ParameterAttributeStruct, list); + ParameterAttributeStruct = handler_ParameterAttributeStruct->ParameterAttributeStruct; + if (ParameterAttributeStruct!=NULL) + { + if (ParameterAttributeStruct->Name!=NULL) + { + free(ParameterAttributeStruct->Name); + } + if (ParameterAttributeStruct->AccessList!=NULL) + { + if (ParameterAttributeStruct->AccessList->__ptrstring!=NULL) + { + pAccessList = ParameterAttributeStruct->AccessList->__ptrstring; + for(i=0;iAccessList->__size;i++,pAccessList++) + { + if(*pAccessList!=NULL) + { + free(*pAccessList); + } + } + free(ParameterAttributeStruct->AccessList->__ptrstring); + } + free(ParameterAttributeStruct->AccessList); + } + free(ParameterAttributeStruct); + } + list_del(list->next); + free (handler_ParameterAttributeStruct); + } + return CWMP_OK; +} diff --git a/src/GetParameterNames.c b/src/GetParameterNames.c new file mode 100644 index 0000000..f680718 --- /dev/null +++ b/src/GetParameterNames.c @@ -0,0 +1,180 @@ +/* + GetParameterNames.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include "dm_rpc.h" + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterNames (struct session *session); +int cwmp_rpc_cpe_getParameterNames (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterNames_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterNames_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterNames_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_dm_getParameterNames(struct cwmp *cwmp, char *path, struct list_head *list, int *n, enum xsd__boolean NextLevel); +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); +static int free_list_getParameterNames(struct list_head *list); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); + +extern const struct CPE_METHOD_CONSTRUCTORS CPE_METHOD_CONSTRUCTORS_ARRAY [COUNT_RPC_CPE]; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterNames (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__GetParameterNames)); + rpc_cpe->method = cwmp_rpc_cpe_getParameterNames; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__GetParameterNamesResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_getParameterNames_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_getParameterNames_response; + rpc_cpe->method_end = cwmp_rpc_cpe_getParameterNames_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:GetParameterNames"; + soap_methods->envelope_response = "cwmp:GetParameterNamesResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__GetParameterNamesResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__GetParameterNamesResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__GetParameterNames; + return rpc_cpe; +} + +int cwmp_rpc_cpe_getParameterNames (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetParameterNames *p_soap_cwmp1__GetParameterNames; + struct _cwmp1__GetParameterNamesResponse *p_soap_cwmp1__GetParameterNamesResponse; + struct cwmp1ParameterInfoList *ParameterList; + struct cwmp1__ParameterInfoStruct **ptrParameterInfoStruct; + char *ParameterPath; + enum xsd__boolean NextLevel; + int i,size,error; + LIST_HEAD(list_ParameterInfoStruct); + + p_soap_cwmp1__GetParameterNames = (struct _cwmp1__GetParameterNames *)this->method_data; + p_soap_cwmp1__GetParameterNamesResponse = (struct _cwmp1__GetParameterNamesResponse *)this->method_response_data; + ParameterPath = *(p_soap_cwmp1__GetParameterNames->ParameterPath); + NextLevel = p_soap_cwmp1__GetParameterNames->NextLevel; + + CWMP_LOG(INFO,"ParameterPath = \"%s\"", ParameterPath); + error = cwmp_dm_getParameterNames(cwmp, ParameterPath, &list_ParameterInfoStruct, &size,NextLevel); + if (error != FAULT_CPE_NO_FAULT_IDX) + { + free_list_getParameterNames(&list_ParameterInfoStruct); + if (cwmp_add_session_rpc_cpe_Fault(session,error)==NULL) + { + return CWMP_GEN_ERR; + } + return CWMP_FAULT_CPE; + } + + ParameterList = calloc(1,sizeof(struct cwmp1ParameterInfoList)); + ptrParameterInfoStruct = calloc(size,sizeof(struct cwmp1__ParameterInfoStruct *)); + if (ParameterList == NULL || + ptrParameterInfoStruct == NULL) + { + return CWMP_MEM_ERR; + } + ParameterList->__size = size; + ParameterList->__ptrParameterInfoStruct = ptrParameterInfoStruct; + p_soap_cwmp1__GetParameterNamesResponse->ParameterList = ParameterList; + while(list_ParameterInfoStruct.next!=&list_ParameterInfoStruct) + { + struct handler_ParameterInfoStruct *handler_ParameterInfoStruct; + handler_ParameterInfoStruct = list_entry(list_ParameterInfoStruct.next,struct handler_ParameterInfoStruct,list); + *ptrParameterInfoStruct = handler_ParameterInfoStruct->ParameterInfoStruct; + ptrParameterInfoStruct++; + list_del(list_ParameterInfoStruct.next); + free (handler_ParameterInfoStruct); + } + return CWMP_OK; +} + +int cwmp_rpc_cpe_getParameterNames_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} +int cwmp_rpc_cpe_getParameterNames_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send GetParameterNames response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} +int cwmp_rpc_cpe_getParameterNames_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetParameterNames *p_soap_cwmp1__GetParameterNames; + struct _cwmp1__GetParameterNamesResponse *p_soap_cwmp1__GetParameterNamesResponse; + struct cwmp1ParameterInfoList *ParameterList; + struct cwmp1__ParameterInfoStruct **ptrParameterInfoStruct,*ParameterInfoStruct; + int i; + + p_soap_cwmp1__GetParameterNamesResponse = (struct _cwmp1__GetParameterNamesResponse *)this->method_response_data; + if (p_soap_cwmp1__GetParameterNamesResponse!=NULL) + { + if (p_soap_cwmp1__GetParameterNamesResponse->ParameterList != NULL) + { + if(p_soap_cwmp1__GetParameterNamesResponse->ParameterList->__ptrParameterInfoStruct != NULL) + { + ptrParameterInfoStruct = p_soap_cwmp1__GetParameterNamesResponse->ParameterList->__ptrParameterInfoStruct; + for (i=0;iParameterList->__size;i++,ptrParameterInfoStruct++) + { + ParameterInfoStruct = *ptrParameterInfoStruct; + if (ParameterInfoStruct!=NULL) + { + if (ParameterInfoStruct->Name!=NULL) + { + free(ParameterInfoStruct->Name); + } + free(ParameterInfoStruct); + } + } + free (p_soap_cwmp1__GetParameterNamesResponse->ParameterList->__ptrParameterInfoStruct); + } + free (p_soap_cwmp1__GetParameterNamesResponse->ParameterList); + } + } + return CWMP_OK; +} + +static int free_list_getParameterNames(struct list_head *list) +{ + struct handler_ParameterInfoStruct *handler_ParameterInfoStruct; + struct cwmp1__ParameterInfoStruct *ParameterInfoStruct; + while(list->next!=list) + { + handler_ParameterInfoStruct = list_entry(list->next,struct handler_ParameterInfoStruct,list); + ParameterInfoStruct = handler_ParameterInfoStruct->ParameterInfoStruct; + if (ParameterInfoStruct!=NULL) + { + if (ParameterInfoStruct->Name!=NULL) + { + free(ParameterInfoStruct->Name); + } + free(ParameterInfoStruct); + } + list_del(list->next); + free (handler_ParameterInfoStruct); + } + return CWMP_OK; +} diff --git a/src/GetParameterValues.c b/src/GetParameterValues.c new file mode 100644 index 0000000..656b236 --- /dev/null +++ b/src/GetParameterValues.c @@ -0,0 +1,190 @@ +/* + GetParameterValues.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 20011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include "dm_rpc.h" + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterValues (struct session *session); +int cwmp_rpc_cpe_getParameterValues (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterValues_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterValues_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getParameterValues_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_dm_getParameterValues(struct cwmp *cwmp, char *name, struct list_head *list, int *n); +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); +int free_list_getParameterValues(struct list_head *list); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); + +extern const struct CPE_METHOD_CONSTRUCTORS CPE_METHOD_CONSTRUCTORS_ARRAY [COUNT_RPC_CPE]; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterValues (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__GetParameterValues)); + rpc_cpe->method = cwmp_rpc_cpe_getParameterValues; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__GetParameterValuesResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_getParameterValues_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_getParameterValues_response; + rpc_cpe->method_end = cwmp_rpc_cpe_getParameterValues_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:GetParameterValues"; + soap_methods->envelope_response = "cwmp:GetParameterValuesResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__GetParameterValuesResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__GetParameterValuesResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__GetParameterValues; + return rpc_cpe; +} + +int cwmp_rpc_cpe_getParameterValues (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetParameterValues *p_soap_cwmp1__GetParameterValues; + struct _cwmp1__GetParameterValuesResponse *p_soap_cwmp1__GetParameterValuesResponse; + struct cwmp1ParameterValueList *ParameterList; + struct cwmp1__ParameterValueStruct **ptr_ParameterValueStruct; + char **name; + int i,n,size,error; + int size_resp=0; + LIST_HEAD(list_ParameterValueStruct); + + p_soap_cwmp1__GetParameterValues = (struct _cwmp1__GetParameterValues *)this->method_data; + p_soap_cwmp1__GetParameterValuesResponse = (struct _cwmp1__GetParameterValuesResponse *)this->method_response_data; + name = p_soap_cwmp1__GetParameterValues->ParameterNames->__ptrstring; + size = p_soap_cwmp1__GetParameterValues->ParameterNames->__size; + + for (i=0;i__size = size_resp; + ParameterList->__ptrParameterValueStruct = ptr_ParameterValueStruct; + p_soap_cwmp1__GetParameterValuesResponse->ParameterList = ParameterList; + while(list_ParameterValueStruct.next!=&list_ParameterValueStruct) + { + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + handler_ParameterValueStruct = list_entry(list_ParameterValueStruct.next,struct handler_ParameterValueStruct,list); + *ptr_ParameterValueStruct = handler_ParameterValueStruct->ParameterValueStruct; + ptr_ParameterValueStruct++; + list_del(list_ParameterValueStruct.next); + free (handler_ParameterValueStruct); + } + return CWMP_OK; +} + +int cwmp_rpc_cpe_getParameterValues_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} +int cwmp_rpc_cpe_getParameterValues_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send GetParameterValues response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} +int cwmp_rpc_cpe_getParameterValues_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetParameterValues *p_soap_cwmp1__GetParameterValues; + struct _cwmp1__GetParameterValuesResponse *p_soap_cwmp1__GetParameterValuesResponse; + struct cwmp1__ParameterValueStruct **ptr_ParameterValueStruct,*ParameterValueStruct; + int i; + + p_soap_cwmp1__GetParameterValuesResponse = (struct _cwmp1__GetParameterValuesResponse *)this->method_response_data; + if (p_soap_cwmp1__GetParameterValuesResponse!=NULL) + { + if (p_soap_cwmp1__GetParameterValuesResponse->ParameterList != NULL) + { + if(p_soap_cwmp1__GetParameterValuesResponse->ParameterList->__ptrParameterValueStruct != NULL) + { + ptr_ParameterValueStruct = p_soap_cwmp1__GetParameterValuesResponse->ParameterList->__ptrParameterValueStruct; + for (i=0;iParameterList->__size;i++,ptr_ParameterValueStruct++) + { + ParameterValueStruct = *ptr_ParameterValueStruct; + if (ParameterValueStruct!=NULL) + { + if (ParameterValueStruct->Name!=NULL) + { + free(ParameterValueStruct->Name); + } + if (ParameterValueStruct->Value!=NULL) + { + free(ParameterValueStruct->Value); + } + free(ParameterValueStruct); + } + } + free (p_soap_cwmp1__GetParameterValuesResponse->ParameterList->__ptrParameterValueStruct); + } + free (p_soap_cwmp1__GetParameterValuesResponse->ParameterList); + } + } + return CWMP_OK; +} + +int free_list_getParameterValues(struct list_head *list) +{ + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + struct cwmp1__ParameterValueStruct *ParameterValueStruct; + while(list->next!=list) + { + handler_ParameterValueStruct = list_entry(list->next,struct handler_ParameterValueStruct,list); + ParameterValueStruct = handler_ParameterValueStruct->ParameterValueStruct; + if (ParameterValueStruct!=NULL) + { + if (ParameterValueStruct->Name!=NULL) + { + free(ParameterValueStruct->Name); + } + if (ParameterValueStruct->Value!=NULL) + { + free(ParameterValueStruct->Value); + } + free(ParameterValueStruct); + } + list_del(list->next); + free (handler_ParameterValueStruct); + } + return CWMP_OK; +} diff --git a/src/GetRPCMethods_acs.c b/src/GetRPCMethods_acs.c new file mode 100644 index 0000000..a2b5f5a --- /dev/null +++ b/src/GetRPCMethods_acs.c @@ -0,0 +1,88 @@ +/* + GetRPCMethods_acs.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" + +int cwmp_rpc_acs_getRPCMethods_data_init (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_getRPCMethods_remote_call (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_getRPCMethods_response (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_getRPCMethods_end (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_getRPCMethods_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); + +void soap_serialize__cwmp1__GetRPCMethods(struct soap *soap, const struct _cwmp1__GetRPCMethods *a); +int soap_put__cwmp1__GetRPCMethods(struct soap *soap, const struct _cwmp1__GetRPCMethods *a, const char *tag, const char *type); +struct _cwmp1__GetRPCMethodsResponse * soap_get__cwmp1__GetRPCMethodsResponse(struct soap *soap, struct _cwmp1__GetRPCMethodsResponse *p, const char *tag, const char *type); + +struct rpc_acs *cwmp_add_session_rpc_acs (struct session *session); + +struct rpc_acs *cwmp_add_session_rpc_acs_getRPCMethods (struct session *session) +{ + struct rpc_acs *rpc_acs; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_acs = cwmp_add_session_rpc_acs (session); + if (rpc_acs == NULL) + { + return NULL; + } + soap_methods = &(rpc_acs->soap_methods); + rpc_acs->method_data = (void *) calloc (1,sizeof(struct _cwmp1__GetRPCMethods)); + rpc_acs->method_data_init = cwmp_rpc_acs_getRPCMethods_data_init; + rpc_acs->method_remote_call = cwmp_rpc_acs_getRPCMethods_remote_call; + rpc_acs->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__GetRPCMethodsResponse)); + rpc_acs->method_response = cwmp_rpc_acs_getRPCMethods_response; + rpc_acs->method_end = cwmp_rpc_acs_getRPCMethods_end; + rpc_acs->destructor = cwmp_rpc_acs_getRPCMethods_destructor; + rpc_acs->type = RPC_ACS_GETRPCMETHODS_IDX; + soap_methods->envelope = "cwmp:GetRPCMethods"; + soap_methods->envelope_response = "cwmp:GetRPCMethodsResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__GetRPCMethods; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__GetRPCMethods; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__GetRPCMethodsResponse; + + return rpc_acs; +} + +int cwmp_rpc_acs_getRPCMethods_data_init (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_getRPCMethods_remote_call (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + CWMP_LOG (INFO,"Trying to call the GetRPCMethods remote method"); + cwmp_soap_call_rpc_acs (cwmp, session, this); + return CWMP_OK; +} + +int cwmp_rpc_acs_getRPCMethods_response (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_getRPCMethods_end (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_getRPCMethods_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + cwmp_session_rpc_acs_destructor (cwmp, session, this); + return CWMP_OK; +} diff --git a/src/GetRPCMethods_cpe.c b/src/GetRPCMethods_cpe.c new file mode 100644 index 0000000..362537f --- /dev/null +++ b/src/GetRPCMethods_cpe.c @@ -0,0 +1,119 @@ +/* + GetRPCMethods_cpe.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ +#include "soapH.h" +#include "cwmp.h" +#include "list.h" + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getRPCMethods (struct session *session); +int cwmp_rpc_cpe_getRPCMethods (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getRPCMethods_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getRPCMethods_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_getRPCMethods_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +extern const struct CPE_METHOD_CONSTRUCTORS CPE_METHOD_CONSTRUCTORS_ARRAY [COUNT_RPC_CPE]; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_getRPCMethods (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__GetRPCMethods)); + rpc_cpe->method = cwmp_rpc_cpe_getRPCMethods; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__GetRPCMethodsResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_getRPCMethods_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_getRPCMethods_response; + rpc_cpe->method_end = cwmp_rpc_cpe_getRPCMethods_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:GetRPCMethods"; + soap_methods->envelope_response = "cwmp:GetRPCMethodsResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__GetRPCMethodsResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__GetRPCMethodsResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__GetRPCMethods; + return rpc_cpe; +} + +int cwmp_rpc_cpe_getRPCMethods (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_getRPCMethods_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int i; + struct cwmp1MethodList *MethodList; + char **mlstruct; + struct _cwmp1__GetRPCMethodsResponse *p_soap_cwmp1__GetRPCMethodsResponse; + + MethodList = calloc(1,sizeof(struct cwmp1MethodList)); + mlstruct = calloc(COUNT_RPC_CPE,sizeof(char *)); + if(MethodList == NULL || + mlstruct == NULL) + { + return CWMP_MEM_ERR; + } + MethodList->__ptrstring = mlstruct; + for(i=0;i__size++; + mlstruct++; + } + } + + + p_soap_cwmp1__GetRPCMethodsResponse = (struct _cwmp1__GetRPCMethodsResponse *)this->method_response_data; + p_soap_cwmp1__GetRPCMethodsResponse->MethodList = MethodList; + return CWMP_OK; +} + +int cwmp_rpc_cpe_getRPCMethods_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send GetRPCMethods response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_getRPCMethods_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__GetRPCMethodsResponse *p_soap_cwmp1__GetRPCMethodsResponse; + + p_soap_cwmp1__GetRPCMethodsResponse = (struct _cwmp1__GetRPCMethodsResponse *)this->method_response_data; + if (p_soap_cwmp1__GetRPCMethodsResponse!=NULL) + { + if (p_soap_cwmp1__GetRPCMethodsResponse->MethodList != NULL) + { + if(p_soap_cwmp1__GetRPCMethodsResponse->MethodList->__ptrstring != NULL) + { + free (p_soap_cwmp1__GetRPCMethodsResponse->MethodList->__ptrstring); + } + free (p_soap_cwmp1__GetRPCMethodsResponse->MethodList); + } + } + + return CWMP_OK; +} + diff --git a/src/Inform.c b/src/Inform.c new file mode 100644 index 0000000..f654828 --- /dev/null +++ b/src/Inform.c @@ -0,0 +1,413 @@ +/* + inform.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include +#include "soapH.h" +#include "list.h" +#include "cwmp.h" +#include "dm.h" +#include "dm_rpc.h" +#include +#include "backupSession.h" + +struct rpc_acs *cwmp_add_session_rpc_acs (struct session *session); +struct rpc_acs *cwmp_add_session_rpc_acs_head (struct session *session); + +int cwmp_rpc_acs_inform_data_init (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_inform_remote_call (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_inform_response (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_inform_end (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_session_rpc_acs_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *rpc_acs); +int cwmp_rpc_acs_inform_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int event_remove_all_event_container(struct session *session, int rem_from); + +void soap_serialize_cwmp1__Inform (struct soap *soap, const struct cwmp1__Inform *a); +int soap_put_cwmp1__Inform (struct soap *soap, const struct cwmp1__Inform *a, const char *tag, const char *type); +int free_list_getParameterValues(struct list_head *list); +struct cwmp1__InformResponse *soap_get_cwmp1__InformResponse (struct soap *soap, struct cwmp1__InformResponse *p, const char *tag, const char *type); + +extern struct list_head forced_inform_parameter_list; +static int forced_inform_parameter_size=0; +static LIST_HEAD(forced_inform_parameter_indice_list); +extern char *TYPE_VALUES_ARRAY [COUNT_TYPE_VALUES]; + +struct rpc_acs *cwmp_add_session_rpc_acs_inform (struct session *session) +{ + struct rpc_acs *rpc_acs; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_acs = cwmp_add_session_rpc_acs_head (session); /* Only the inform rpc should be added in the head of the rpc acs list*/ + if (rpc_acs == NULL) + { + return NULL; + } + soap_methods = &(rpc_acs->soap_methods); + rpc_acs->method_data = (void *) calloc (1,sizeof(struct cwmp1__Inform)); + rpc_acs->method_data_init = cwmp_rpc_acs_inform_data_init; + rpc_acs->method_remote_call = cwmp_rpc_acs_inform_remote_call; + rpc_acs->method_response_data = (void *) calloc (1,sizeof(struct cwmp1__InformResponse)); + rpc_acs->method_response = cwmp_rpc_acs_inform_response; + rpc_acs->method_end = cwmp_rpc_acs_inform_end; + rpc_acs->destructor = cwmp_rpc_acs_inform_destructor; + rpc_acs->type = RPC_ACS_INFORM_IDX; + soap_methods->envelope = "cwmp:Inform"; + soap_methods->envelope_response = "cwmp:InformResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize_cwmp1__Inform; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put_cwmp1__Inform; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get_cwmp1__InformResponse; + return rpc_acs; +} + +int cwmp_rpc_acs_inform_data_init (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + struct cwmp1__Inform *p_soap_cwmp1__Inform; + struct cwmp1__DeviceIdStruct *DeviceIdStruct; + struct cwmp1__EventStruct **pEventStruct; + struct cwmp1__ParameterValueStruct *ParameterValueStructForce, **ptr_ParameterValueStruct, *p,**pp; + struct event_container *event_container; + struct paramater_container *paramater_container; + struct forced_inform_parameter *fip; + int i, j, size, force_size = 0 , error; + struct list_head *ilist,*jlist; + + + if (session==NULL || this==NULL) + { + return CWMP_GEN_ERR; + } + + DeviceIdStruct = calloc(1,sizeof(struct cwmp1__DeviceIdStruct)); + if (DeviceIdStruct == NULL) + { + return CWMP_MEM_ERR; + } + dm_get_deviceId_manufacturer(cwmp,&(DeviceIdStruct->Manufacturer)); + dm_get_deviceId_oui(cwmp,&(DeviceIdStruct->OUI)); + dm_get_deviceId_productClass(cwmp,&(DeviceIdStruct->ProductClass)); + dm_get_deviceId_serialNumber(cwmp,&(DeviceIdStruct->SerialNumber)); + p_soap_cwmp1__Inform = (struct cwmp1__Inform *) this->method_data; + p_soap_cwmp1__Inform->DeviceId = DeviceIdStruct; + p_soap_cwmp1__Inform->CurrentTime = time((time_t*)NULL); + p_soap_cwmp1__Inform->RetryCount = cwmp->retry_count_session; + p_soap_cwmp1__Inform->MaxEnvelopesI = 1; + __list_for_each(ilist, &(forced_inform_parameter_list)) + { + fip = list_entry (ilist, struct forced_inform_parameter,list); + if (strstr(fip->name,"{i}")==NULL) + { + force_size++; + } + else + { + int n = 0; + inform_dm_getParameterPaths_by_correspondence(cwmp,fip->name,&forced_inform_parameter_indice_list,&n); + force_size += n; + } + } + forced_inform_parameter_size = force_size; + size = force_size + session->parameter_size; + p_soap_cwmp1__Inform->ParameterList = calloc(1,sizeof(struct cwmp1ParameterValueList)); + ParameterValueStructForce = calloc(force_size,sizeof(struct cwmp1__ParameterValueStruct)); + ptr_ParameterValueStruct = calloc(size,sizeof(struct cwmp1__ParameterValueStruct *)); + p_soap_cwmp1__Inform->Event = calloc(1,sizeof(struct cwmp1EventList)); + pEventStruct = calloc(session->event_size,sizeof(struct cwmp1__EventStruct *)); + if (p_soap_cwmp1__Inform->ParameterList == NULL || + ParameterValueStructForce == NULL || + ptr_ParameterValueStruct == NULL || + p_soap_cwmp1__Inform->Event == NULL || + pEventStruct==NULL) + { + return CWMP_MEM_ERR; + } + p_soap_cwmp1__Inform->ParameterList->__ptrParameterValueStruct = ptr_ParameterValueStruct; + p_soap_cwmp1__Inform->Event->__size = session->event_size; + p_soap_cwmp1__Inform->Event->__ptrEventStruct = pEventStruct; + i = 0; + __list_for_each(ilist, &(forced_inform_parameter_list)) + { + fip = list_entry (ilist, struct forced_inform_parameter,list); + if (strstr(fip->name,"{i}")==NULL) + { + if (i!=0) + { + ParameterValueStructForce++; + ptr_ParameterValueStruct++; + } + i++; + ParameterValueStructForce->Name = strdup (fip->name); + ParameterValueStructForce->Type = TYPE_VALUES_ARRAY [fip->node->value_type]; + if (error = get_node_paramater_value(fip->node,NULL,0,&(ParameterValueStructForce->Value))) + { + char t[1]; + t[0] = 0; + ParameterValueStructForce->Value = strdup(t); + } + *ptr_ParameterValueStruct = ParameterValueStructForce; + } + } + __list_for_each(ilist, &(forced_inform_parameter_indice_list)) + { + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + if (i!=0) + { + ParameterValueStructForce++; + ptr_ParameterValueStruct++; + } + i++; + handler_ParameterValueStruct = list_entry(ilist,struct handler_ParameterValueStruct,list); + ParameterValueStructForce->Name = handler_ParameterValueStruct->ParameterValueStruct->Name; + ParameterValueStructForce->Value = handler_ParameterValueStruct->ParameterValueStruct->Value; + ParameterValueStructForce->Type = handler_ParameterValueStruct->ParameterValueStruct->Type; + *ptr_ParameterValueStruct = ParameterValueStructForce; + ilist = ilist->prev; + list_del(&(handler_ParameterValueStruct->list)); + free (handler_ParameterValueStruct->ParameterValueStruct); + free (handler_ParameterValueStruct); + } + pp = p_soap_cwmp1__Inform->ParameterList->__ptrParameterValueStruct; + size = 0; + error = 1; + __list_for_each(ilist,&(session->head_event_container)) + { + event_container = list_entry(ilist, struct event_container, list); + *pEventStruct = &(event_container->event); + pEventStruct ++; + + __list_for_each(jlist,&(event_container->head_paramater_container)) + { + paramater_container = list_entry(jlist, struct paramater_container, list); + for (j=0;j<(size+force_size);j++) + { + p = *(pp+j); + if ((error = strcmp(paramater_container->paramater.Name,p->Name))==0) + { + break; + } + } + if (error==0) + { + continue; + } + if (i!=0) + { + ptr_ParameterValueStruct++; + } + i++; + inform_dm_get_value_by_path (cwmp, paramater_container->paramater.Name, &(paramater_container->paramater.Value), &(paramater_container->paramater.Type)); + *ptr_ParameterValueStruct = &(paramater_container->paramater); + size++; + } + } + p_soap_cwmp1__Inform->ParameterList->__size = size + force_size; + + return CWMP_OK; +} + +int cwmp_rpc_acs_inform_remote_call (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + CWMP_LOG(INFO, "Trying to call the Inform remote method"); + cwmp_soap_call_rpc_acs (cwmp, session, this); + return CWMP_OK; +} + +int cwmp_rpc_acs_inform_response (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_inform_end (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + struct cwmp1__Inform *p_soap_cwmp1__Inform; + struct cwmp1__InformResponse *p_soap_cwmp1__InformResponse; + int force_size; + + force_size = forced_inform_parameter_size; + p_soap_cwmp1__Inform = (struct cwmp1__Inform *)this->method_data; + + if (p_soap_cwmp1__Inform!=NULL) + { + if (p_soap_cwmp1__Inform->DeviceId!=NULL) + { + if (p_soap_cwmp1__Inform->DeviceId->Manufacturer!=NULL) + { + free (p_soap_cwmp1__Inform->DeviceId->Manufacturer); + } + if (p_soap_cwmp1__Inform->DeviceId->OUI!=NULL) + { + free (p_soap_cwmp1__Inform->DeviceId->OUI); + } + if (p_soap_cwmp1__Inform->DeviceId->ProductClass!=NULL) + { + free (p_soap_cwmp1__Inform->DeviceId->ProductClass); + } + if (p_soap_cwmp1__Inform->DeviceId->SerialNumber!=NULL) + { + free (p_soap_cwmp1__Inform->DeviceId->SerialNumber); + } + free (p_soap_cwmp1__Inform->DeviceId); + } + if (p_soap_cwmp1__Inform->Event!=NULL) + { + if (p_soap_cwmp1__Inform->Event->__ptrEventStruct!=NULL) + { + free (p_soap_cwmp1__Inform->Event->__ptrEventStruct); + } + free (p_soap_cwmp1__Inform->Event); + } + if (p_soap_cwmp1__Inform->ParameterList!=NULL) + { + struct cwmp1__ParameterValueStruct *ParameterValueStructForce,*p; + int i = 0; + if (p_soap_cwmp1__Inform->ParameterList->__ptrParameterValueStruct!= NULL) + { + if (force_size>0) + { + ParameterValueStructForce = *(p_soap_cwmp1__Inform->ParameterList->__ptrParameterValueStruct); + p = ParameterValueStructForce; + while (p!=NULL && iName!=NULL) + { + free (p->Name); + } + if (p->Value!=NULL) + { + free (p->Value); + } + p++; + i++; + } + if (ParameterValueStructForce!=NULL) + { + free (ParameterValueStructForce); + } + } + free(p_soap_cwmp1__Inform->ParameterList->__ptrParameterValueStruct); + } + free (p_soap_cwmp1__Inform->ParameterList); + } + } + return CWMP_OK; +} + +int cwmp_rpc_acs_inform_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + + cwmp_session_rpc_acs_destructor (cwmp, session, this); + event_remove_all_event_container (session,RPC_SEND); + return CWMP_OK; +} + +/* + * Get Device ID values + */ + +int dm_get_deviceId_manufacturer(struct cwmp *cwmp, char **value) +{ + *value = strdup("Inteno"); + return CWMP_OK; +} + +int inform_dm_get_value_by_path (struct cwmp *cwmp, char *path, char **value, char **type) +{ + int n,error; + LIST_HEAD(list_ParameterValueStruct); + + *value = NULL; + *type = NULL; + error = cwmp_dm_getParameterValues(cwmp, path, &list_ParameterValueStruct,&n); + if (error == FAULT_CPE_NO_FAULT_IDX) + { + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + if (list_ParameterValueStruct.next!=&list_ParameterValueStruct) + { + handler_ParameterValueStruct = list_entry(list_ParameterValueStruct.next,struct handler_ParameterValueStruct,list); + *value = strdup(handler_ParameterValueStruct->ParameterValueStruct->Value); + *type = handler_ParameterValueStruct->ParameterValueStruct->Type; + } + } + if (*value==NULL) + { + char t[1]; + t[0] = 0; + *value = strdup(t); + } + if (*type==NULL) + { + *type = TYPE_VALUES_ARRAY[TYPE_VALUE_string_IDX]; + } + free_list_getParameterValues(&list_ParameterValueStruct); + return CWMP_OK; +} + +int dm_get_deviceId_oui(struct cwmp *cwmp, char **value) +{ + int error; + char *type; + error = inform_dm_get_value_by_path (cwmp, "InternetGatewayDevice.DeviceInfo.ManufacturerOUI", value, &type); + return error; +} + +int dm_get_deviceId_productClass(struct cwmp *cwmp, char **value) +{ + int error; + char *type; + error = inform_dm_get_value_by_path (cwmp, "InternetGatewayDevice.DeviceInfo.ProductClass", value, &type); + return error; +} + +int dm_get_deviceId_serialNumber(struct cwmp *cwmp, char **value) +{ + int error; + char *type; + error = inform_dm_get_value_by_path (cwmp, "InternetGatewayDevice.DeviceInfo.SerialNumber", value, &type); + return error; +} + +/* + * End Get Device ID values + */ + +int inform_dm_getParameterPaths_by_correspondence(struct cwmp *cwmp, char *path, struct list_head *list, int *n) +{ + + char *prefix_path=NULL; + char **argv; + struct sub_path *sub_path; + int i,sub_path_size; + + argv = calloc (1,sizeof(char *)); + sub_path = calloc (DM_MAX_INDICE,sizeof(struct sub_path)); + argv[0] = path; + cwmp_dm_get_sub_indice_path(1,argv,&prefix_path,sub_path,&sub_path_size); + cwmp_dm_getParameterPaths_by_correspondence(cwmp,prefix_path,sub_path,sub_path_size,list,n,TRUE,FALSE,&i); + for (i=0;i +#include + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_reboot (struct session *session); +int cwmp_rpc_cpe_reboot (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_reboot_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_reboot_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_reboot_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key); +void cwmp_save_event_container (struct cwmp *cwmp,struct event_container *event_container); + +struct rpc_cpe *cwmp_add_session_rpc_cpe_reboot (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__Reboot)); + rpc_cpe->method = cwmp_rpc_cpe_reboot; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__RebootResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_reboot_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_reboot_response; + rpc_cpe->method_end = cwmp_rpc_cpe_reboot_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:Reboot"; + soap_methods->envelope_response = "cwmp:RebootResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__RebootResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__RebootResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__Reboot; + return rpc_cpe; +} + +int cwmp_reboot(struct cwmp *cwmp,void *v) +{ + CWMP_LOG(INFO,"RUN reboot function"); + /** flush file system buffers **/ + sync(); + return reboot(RB_AUTOBOOT); +} + +int cwmp_rpc_cpe_reboot (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct event_container *event_container; + struct _cwmp1__Reboot *p; + + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + p = (struct _cwmp1__Reboot *) this->method_data; + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_M_Reboot, p->CommandKey); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + cwmp_save_event_container (cwmp,event_container); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + add_session_end_func(session,cwmp_reboot,NULL,TRUE); + return CWMP_OK; +} + +int cwmp_rpc_cpe_reboot_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_reboot_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send Reboot response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_reboot_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + diff --git a/src/ScheduleInform.c b/src/ScheduleInform.c new file mode 100644 index 0000000..fd9a6bc --- /dev/null +++ b/src/ScheduleInform.c @@ -0,0 +1,232 @@ +/* + ScheduleInform.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include "soapH.h" +#include "cwmp.h" +#include "list.h" + +LIST_HEAD(list_schedule_inform); +static pthread_mutex_t mutex_schedule_inform; +static pthread_cond_t threshold_schedule_inform; +static bool thread_is_working=FALSE; + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +int cwmp_rpc_cpe_scheduleInform (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_scheduleInform_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_scheduleInform_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_scheduleInform_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key); +void cwmp_save_event_container (struct cwmp *cwmp,struct event_container *event_container); +void backup_session_insert_schedule_time(time_t schedule_time,char *commandKey); +void backup_session_delete_schedule_time(time_t schedule_time,char *commandKey); +void backup_session_delete_scheduled_inform(); + +struct rpc_cpe *cwmp_add_session_rpc_cpe_scheduleInform (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__ScheduleInform)); + rpc_cpe->method = cwmp_rpc_cpe_scheduleInform; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__ScheduleInformResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_scheduleInform_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_scheduleInform_response; + rpc_cpe->method_end = cwmp_rpc_cpe_scheduleInform_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:ScheduleInform"; + soap_methods->envelope_response = "cwmp:ScheduleInformResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__ScheduleInformResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__ScheduleInformResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__ScheduleInform; + return rpc_cpe; +} + +void *thread_cwmp_rpc_cpe_scheduleInform (void *v) +{ + struct cwmp *cwmp = (struct cwmp *)v; + struct event_container *event_container; + struct schedule_inform *schedule_inform; + struct timespec si_timeout = {0, 0}; + time_t current_time; + bool add_event_same_time = FALSE; + + thread_is_working = TRUE; + while (list_schedule_inform.next!=&(list_schedule_inform)) + { + schedule_inform = list_entry(list_schedule_inform.next,struct schedule_inform, list); + current_time = time(NULL); + if (current_time >= schedule_inform->scheduled_time) + { + if (add_event_same_time) + { + pthread_mutex_lock (&mutex_schedule_inform); + list_del (&(schedule_inform->list)); + if (schedule_inform->commandKey!=NULL) + { + backup_session_delete_schedule_time(schedule_inform->scheduled_time,schedule_inform->commandKey); + free (schedule_inform->commandKey); + } + free(schedule_inform); + pthread_mutex_unlock (&mutex_schedule_inform); + continue; + } + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + CWMP_LOG(INFO,"Schedule Inform thread: add ScheduleInform event in the queue"); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_3SCHEDULED, ""); + if (event_container != NULL) + { + cwmp_save_event_container (cwmp,event_container); + } + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_M_ScheduleInform, schedule_inform->commandKey); + if (event_container != NULL) + { + cwmp_save_event_container (cwmp,event_container); + } + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + pthread_cond_signal(&(cwmp->threshold_session_send)); + pthread_mutex_lock (&mutex_schedule_inform); + list_del (&(schedule_inform->list)); + if (schedule_inform->commandKey!=NULL) + { + backup_session_delete_schedule_time(schedule_inform->scheduled_time,schedule_inform->commandKey); + free (schedule_inform->commandKey); + } + free(schedule_inform); + pthread_mutex_unlock (&mutex_schedule_inform); + add_event_same_time = TRUE; + continue; + } + add_event_same_time = FALSE; + pthread_mutex_lock (&mutex_schedule_inform); + si_timeout.tv_sec = schedule_inform->scheduled_time; + pthread_cond_timedwait(&threshold_schedule_inform, &mutex_schedule_inform, &si_timeout); + pthread_mutex_unlock (&mutex_schedule_inform); + } + thread_is_working = FALSE; + return CWMP_OK; +} + +int cwmp_rpc_cpe_scheduleInform (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct event_container *event_container; + struct _cwmp1__ScheduleInform *p; + struct schedule_inform *schedule_inform; + time_t scheduled_time; + struct list_head *ilist; + bool cond_signal=FALSE; + pthread_t scheduleInform_thread; + int error; + + pthread_mutex_lock (&mutex_schedule_inform); + p = (struct _cwmp1__ScheduleInform *) this->method_data; + scheduled_time = time(NULL) + p->DelaySeconds; + __list_for_each(ilist,&(list_schedule_inform)) + { + schedule_inform = list_entry(ilist,struct schedule_inform, list); + if (schedule_inform->scheduled_time == scheduled_time) + { + pthread_mutex_unlock (&mutex_schedule_inform); + return CWMP_OK; + } + if (schedule_inform->scheduled_time > scheduled_time) + { + cond_signal = TRUE; + break; + } + } + CWMP_LOG(INFO,"Schedule inform event will start in %us",p->DelaySeconds); + schedule_inform = calloc (1,sizeof(struct schedule_inform)); + if (schedule_inform==NULL) + { + pthread_mutex_unlock (&mutex_schedule_inform); + return CWMP_OK; + } + schedule_inform->commandKey = strdup(p->CommandKey); + schedule_inform->scheduled_time = scheduled_time; + list_add (&(schedule_inform->list), ilist->prev); + backup_session_insert_schedule_time(schedule_inform->scheduled_time,schedule_inform->commandKey); + if (cond_signal) + { + pthread_cond_signal(&threshold_schedule_inform); + } + pthread_mutex_unlock (&mutex_schedule_inform); + + if (!thread_is_working) + { + thread_is_working = TRUE; + error = pthread_create(&scheduleInform_thread, NULL, &thread_cwmp_rpc_cpe_scheduleInform, (void *)cwmp); + if (error<0) + { + CWMP_LOG(ERROR,"Error error when creating the schedule event thread!"); + thread_is_working = FALSE; + return CWMP_OK; + } + + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_scheduleInform_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_cpe_scheduleInform_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send ScheduleInform response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} + +int cwmp_rpc_cpe_scheduleInform_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +int cwmp_scheduleInform_remove_all() +{ + struct schedule_inform *schedule_inform; + + pthread_mutex_lock (&mutex_schedule_inform); + while (list_schedule_inform.next!=&(list_schedule_inform)) + { + schedule_inform = list_entry(list_schedule_inform.next,struct schedule_inform, list); + + list_del (&(schedule_inform->list)); + if (schedule_inform->commandKey!=NULL) + { + backup_session_delete_schedule_time(schedule_inform->scheduled_time,schedule_inform->commandKey); + free (schedule_inform->commandKey); + } + free(schedule_inform); + } + backup_session_delete_scheduled_inform(); + pthread_mutex_unlock (&mutex_schedule_inform); + + return CWMP_OK; +} diff --git a/src/SetParameterAttributes.c b/src/SetParameterAttributes.c new file mode 100644 index 0000000..1ba233c --- /dev/null +++ b/src/SetParameterAttributes.c @@ -0,0 +1,406 @@ +/* + SetParameterAttributes.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 20011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include "dm_rpc.h" + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_setParameterAttributes (struct session *session); +int cwmp_rpc_cpe_setParameterAttributes (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_setParameterAttributes_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_setParameterAttributes_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_rpc_cpe_setParameterAttributes_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe); +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); +int cwmp_dm_setParameterAttributes(struct cwmp *cwmp, struct cwmp1__SetParameterAttributesStruct *ParameterAttributesStruct); +int cwmp_delete_notification(char *type,char *name); +int cwmp_add_notification(char *type,char *name); +int cwmp_check_notification(char *name, char *type); +int cwmp_off_notification(struct dm_node *node,char *name, enum xsd__boolean notification_change); +int cwmp_apply_passive_notification(struct dm_node *node,char *name, enum xsd__boolean notification_change); +int cwmp_apply_active_notification(struct dm_node *node,char *name, enum xsd__boolean notification_change); +int cwmp_add_in_accesslist(char *name, enum xsd__boolean access_list_change, char *accessList); +int uci_delete_value(char *cmd); +int uci_revert_value (); +int uci_commit_value (); + +extern const struct CPE_METHOD_CONSTRUCTORS CPE_METHOD_CONSTRUCTORS_ARRAY [COUNT_RPC_CPE]; + +const struct ACCESSLIST_CONST_STRUCT ACCESSLIST_CONST_ARRAY [] = { + {"Subscriber","cwmp.accesslist.subscriber"} +}; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_setParameterAttributes (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_cpe = cwmp_add_session_rpc_cpe (session); + if (rpc_cpe == NULL) + { + return NULL; + } + soap_methods = &(rpc_cpe->soap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__SetParameterAttributes)); + rpc_cpe->method = cwmp_rpc_cpe_setParameterAttributes; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__SetParameterAttributesResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_setParameterAttributes_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_setParameterAttributes_response; + rpc_cpe->method_end = cwmp_rpc_cpe_setParameterAttributes_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:SetParameterAttributes"; + soap_methods->envelope_response = "cwmp:SetParameterAttributesResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__SetParameterAttributesResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__SetParameterAttributesResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__SetParameterAttributes; + return rpc_cpe; +} + +int cwmp_rpc_cpe_setParameterAttributes (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + + struct _cwmp1__SetParameterAttributes *p_soap_cwmp1__SetParameterAttributes; + int i,size,error; + struct cwmp1__SetParameterAttributesStruct *ParameterAttributesStruct,**ptrParameterAttributeStruct; + + p_soap_cwmp1__SetParameterAttributes = (struct _cwmp1__SetParameterAttributes *)this->method_data; + size = p_soap_cwmp1__SetParameterAttributes->ParameterList->__size; + ptrParameterAttributeStruct = p_soap_cwmp1__SetParameterAttributes->ParameterList->__ptrSetParameterAttributesStruct; + + for (i=0;ivalue) != 0)&&(strstr(notification->value,name) == NULL)) + { + cwmp_add_notification(type,notification->value); + } + list_del(notification_list.next); + if(notification != NULL) + { + if(notification->value != NULL) + { + free(notification->value); + } + free(notification); + notification = NULL; + } + } + return CWMP_OK; +} + +int cwmp_check_notification(char *name, char *type) +{ + struct config_uci_list *notification; + bool partial_found = FALSE; + bool found = FALSE; + int is_parent = 0; + LIST_HEAD(notification_list); + + uci_get_list_value(type, ¬ification_list); + + while(!list_empty(¬ification_list)) + { + notification = list_entry (notification_list.next, struct config_uci_list, list); + if((notification != NULL)) + { + if(strstr(notification->value,name) != NULL) + { + partial_found = TRUE; + is_parent = 1; + if(strcmp(notification->value,name) == 0) + { + found = TRUE; + } + } + if(strstr(name,notification->value) != NULL) + { + partial_found = TRUE; + } + list_del(notification_list.next); + free(notification); + notification = NULL; + } + } + if(!partial_found) + { + return CWMP_OK; + } + else + { + if(found) + { + return CWMP_EXACT_FOUND; + } + else + { + if(is_parent == 1) + { + return CWMP_CHILD_FOUND; + } + else + { + return CWMP_PARENT_FOUND; + } + } + } +} + +int cwmp_apply_active_notification(struct dm_node *node,char *name, enum xsd__boolean notification_change) +{ + int error = FAULT_CPE_NO_FAULT_IDX,i; + + if(node != NULL) + { + if(node->active_notify.can_deny) + { + error = FAULT_CPE_NOTIFICATION_REJECTED_IDX; + } + else + { + if(notification_change == xsd__boolean__true_) + { + if(cwmp_check_notification(name,UCI_NOTIFICATION_PASSIVE_PATH) == CWMP_CHILD_FOUND || + cwmp_check_notification(name,UCI_NOTIFICATION_PASSIVE_PATH) == CWMP_EXACT_FOUND ) + { + cwmp_delete_notification(UCI_NOTIFICATION_PASSIVE_PATH,name); + } + if(cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_CHILD_FOUND|| + cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_EXACT_FOUND) + { + cwmp_delete_notification(UCI_NOTIFICATION_DENIED_PATH,name); + } + if(cwmp_check_notification(name,UCI_NOTIFICATION_ACTIVE_PATH) == CWMP_OK) + { + cwmp_add_notification(UCI_NOTIFICATION_ACTIVE_PATH,name); + } + else if(cwmp_check_notification(name,UCI_NOTIFICATION_ACTIVE_PATH) == CWMP_CHILD_FOUND) + { + cwmp_delete_notification(UCI_NOTIFICATION_ACTIVE_PATH,name); + cwmp_add_notification(UCI_NOTIFICATION_ACTIVE_PATH,name); + } + } + } + } + else + { + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + return error; +} + +int cwmp_apply_passive_notification(struct dm_node *node,char *name, enum xsd__boolean notification_change) +{ + int error = FAULT_CPE_NO_FAULT_IDX,i; + + if(node != NULL) + { + if(node->active_notify.force_enabled) + { + error = FAULT_CPE_NOTIFICATION_REJECTED_IDX; + } + else + { + if(notification_change == xsd__boolean__true_) + { + if(cwmp_check_notification(name,UCI_NOTIFICATION_ACTIVE_PATH) == CWMP_CHILD_FOUND || + cwmp_check_notification(name,UCI_NOTIFICATION_ACTIVE_PATH) == CWMP_EXACT_FOUND ) + { + cwmp_delete_notification(UCI_NOTIFICATION_ACTIVE_PATH,name); + } + if(cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_CHILD_FOUND|| + cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_EXACT_FOUND) + { + cwmp_delete_notification(UCI_NOTIFICATION_DENIED_PATH,name); + } + if(cwmp_check_notification(name,UCI_NOTIFICATION_PASSIVE_PATH) == CWMP_OK) + { + cwmp_add_notification(UCI_NOTIFICATION_PASSIVE_PATH,name); + } + else if(cwmp_check_notification(name,UCI_NOTIFICATION_PASSIVE_PATH) == CWMP_CHILD_FOUND) + { + cwmp_delete_notification(UCI_NOTIFICATION_PASSIVE_PATH,name); + cwmp_add_notification(UCI_NOTIFICATION_PASSIVE_PATH,name); + } + } + } + } + else + { + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + return error; +} + +int cwmp_off_notification(struct dm_node *node,char *name, enum xsd__boolean notification_change) +{ + int error = FAULT_CPE_NO_FAULT_IDX,i; + + if(node != NULL) + { + if(node->active_notify.force_enabled) + { + error = FAULT_CPE_NOTIFICATION_REJECTED_IDX; + } + else + { + if(notification_change == xsd__boolean__true_) + { + switch(cwmp_check_notification(name,UCI_NOTIFICATION_PASSIVE_PATH)) + { + case CWMP_EXACT_FOUND: + case CWMP_CHILD_FOUND: + cwmp_delete_notification(UCI_NOTIFICATION_PASSIVE_PATH,name); + break; + case CWMP_PARENT_FOUND: + if(cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_OK) + { + cwmp_add_notification(UCI_NOTIFICATION_DENIED_PATH,name); + } + break; + } + switch(cwmp_check_notification(name,UCI_NOTIFICATION_ACTIVE_PATH)) + { + case CWMP_EXACT_FOUND: + case CWMP_CHILD_FOUND: + cwmp_delete_notification(UCI_NOTIFICATION_ACTIVE_PATH,name); + break; + case CWMP_PARENT_FOUND: + if(cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_OK) + { + cwmp_add_notification(UCI_NOTIFICATION_DENIED_PATH,name); + } + break; + } + for(i=0;isoap_methods); + rpc_cpe->method_data = (void *) calloc (1,sizeof(struct _cwmp1__SetParameterValues)); + rpc_cpe->method = cwmp_rpc_cpe_setParameterValues; + rpc_cpe->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__SetParameterValuesResponse)); + rpc_cpe->method_response_data_init = cwmp_rpc_cpe_setParameterValues_response_data_init; + rpc_cpe->method_response = cwmp_rpc_cpe_setParameterValues_response; + rpc_cpe->method_end = cwmp_rpc_cpe_setParameterValues_end; + rpc_cpe->destructor = cwmp_session_rpc_cpe_destructor; + soap_methods->envelope = "cwmp:SetParameterValues"; + soap_methods->envelope_response = "cwmp:SetParameterValuesResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__SetParameterValuesResponse; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__SetParameterValuesResponse; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__SetParameterValues; + return rpc_cpe; +} + +int cwmp_rpc_cpe_setParameterValues (struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + struct _cwmp1__SetParameterValues *p_soap_cwmp1__SetParameterValues; + struct _cwmp1__SetParameterValuesResponse *p_soap_cwmp1__SetParameterValuesResponse; + struct cwmp1ParameterValueList *ParameterList; + struct cwmp1__ParameterValueStruct **ptr_ParameterValueStruct,*ParameterValueStruct; + char *parameter_key,buf[128]; + int i,n,size,error; + struct dm_set_handler *dm_set_handler; + struct rpc_cpe *rpc_cpe_fault; + + dm_set_handler = calloc(1,sizeof(struct dm_set_handler)); + + if (dm_set_handler == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + list_add_tail(&(dm_set_handler->list),&(list_dm_set_handler)); + + INIT_LIST_HEAD (&(dm_set_handler->cmd_list)); + INIT_LIST_HEAD (&(dm_set_handler->cancel_list)); + INIT_LIST_HEAD (&(dm_set_handler->service_list)); + + p_soap_cwmp1__SetParameterValues = (struct _cwmp1__SetParameterValues *)this->method_data; + p_soap_cwmp1__SetParameterValuesResponse = (struct _cwmp1__SetParameterValuesResponse *)this->method_response_data; + size = p_soap_cwmp1__SetParameterValues->ParameterList->__size; + ptr_ParameterValueStruct = p_soap_cwmp1__SetParameterValues->ParameterList->__ptrParameterValueStruct; + parameter_key = p_soap_cwmp1__SetParameterValues->ParameterKey; + + if (error = check_duplicated_parameter_name (ptr_ParameterValueStruct, size)) + { + if (cwmp_add_session_rpc_cpe_Fault(session,FAULT_CPE_INVALID_ARGUMENTS_IDX)==NULL) + { + return CWMP_GEN_ERR; + } + return CWMP_FAULT_CPE; + } + + for (i=0;iName,(strlen(ParameterValueStruct->Value)<1000)?ParameterValueStruct->Value:"(Unable to display big stings)"); + + error = cwmp_dm_setParameterValues(cwmp, dm_set_handler, ParameterValueStruct->Name, ParameterValueStruct->Value); + + if (error != FAULT_CPE_NO_FAULT_IDX) + { + if (dm_set_handler->uci) + { + CWMP_LOG(INFO,"RUN uci revert"); /* TODO to be removed*/ + uci_revert_value(); + } + dm_run_queue_cancel_handler(dm_set_handler); + dm_free_dm_set_handler_queues(dm_set_handler); + if (dm_set_handler!=NULL) + { + list_del(&(dm_set_handler->list)); + free(dm_set_handler); + } + if ((rpc_cpe_fault = cwmp_add_session_rpc_cpe_Fault(session,error))==NULL) + { + return CWMP_GEN_ERR; + } + cwmp_rpc_cpe_Fault_parameter_cause(rpc_cpe_fault,ParameterValueStruct->Name); + return CWMP_FAULT_CPE; + } + } + + dm_run_queue_cmd_handler(dm_set_handler,FALSE); + p_soap_cwmp1__SetParameterValuesResponse->Status = _cwmp1__SetParameterValuesResponse_Status__0; + + CWMP_LOG(INFO,"RUN uci commit"); + sprintf(buf,"%s=%s",UCI_ACS_PARAMETERKEY_PATH,parameter_key); + uci_set_value (buf); + uci_commit_value(); + + if (dm_set_handler->cwmp_reload==TRUE) + { + CWMP_LOG(INFO,"Add cwmp config reload at the end of the session"); + add_session_end_func(session,dm_cwmp_config_reload,NULL,FALSE); + p_soap_cwmp1__SetParameterValuesResponse->Status = _cwmp1__SetParameterValuesResponse_Status__1; + } + if (dm_set_handler->reboot_required==TRUE) + { + CWMP_LOG(INFO,"Add reboot at the end of the session"); + add_session_end_func(session,cwmp_reboot,NULL,TRUE); + p_soap_cwmp1__SetParameterValuesResponse->Status = _cwmp1__SetParameterValuesResponse_Status__1; + } + if (dm_set_handler->cmd_list.next!=&(dm_set_handler->cmd_list) || + (dm_set_handler->service_list.next!=&(dm_set_handler->service_list) && dm_set_handler->reboot_required==FALSE)) + { + add_session_end_func(session,dm_run_queue_cmd_handler_at_end_session,dm_set_handler,FALSE); + p_soap_cwmp1__SetParameterValuesResponse->Status = _cwmp1__SetParameterValuesResponse_Status__1; + return CWMP_OK; + } + + dm_free_dm_set_handler_queues(dm_set_handler); + + if (dm_set_handler!=NULL) + { + list_del(&(dm_set_handler->list)); + free(dm_set_handler); + } + + return CWMP_OK; +} + +int cwmp_rpc_cpe_setParameterValues_response_data_init(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} +int cwmp_rpc_cpe_setParameterValues_response(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + int error; + CWMP_LOG (INFO,"Trying to send SetParameterValues response to the ACS"); + error = cwmp_soap_send_rpc_cpe_response (cwmp, session, this); + return error; +} +int cwmp_rpc_cpe_setParameterValues_end(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this) +{ + return CWMP_OK; +} + +static int check_duplicated_parameter_name (struct cwmp1__ParameterValueStruct **ptr_ParameterValueStruct, int size) +{ + + struct cwmp1__ParameterValueStruct **p, **q, *pvs, *qvs; + int i,j; + for (i=0,p=ptr_ParameterValueStruct;i<(size-1);i++,p++) + { + pvs = *p; + for (j=i+1,q=p+1;jName,qvs->Name)==0) + { + return CWMP_GEN_ERR; + } + } + } + return CWMP_OK; +} diff --git a/src/TransferComplete.c b/src/TransferComplete.c new file mode 100644 index 0000000..9f23b84 --- /dev/null +++ b/src/TransferComplete.c @@ -0,0 +1,120 @@ +/* + TransferComplete.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "backupSession.h" + +int cwmp_rpc_acs_transferComplete_data_init (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_transferComplete_remote_call (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_transferComplete_response (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_transferComplete_end (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_rpc_acs_transferComplete_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *this); +int cwmp_session_rpc_acs_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *rpc_acs); + +void soap_serialize__cwmp1__TransferComplete(struct soap *soap, const struct _cwmp1__TransferComplete *a); +int soap_put__cwmp1__TransferComplete(struct soap *soap, const struct _cwmp1__TransferComplete *a, const char *tag, const char *type); +struct _cwmp1__TransferCompleteResponse * soap_get__cwmp1__TransferCompleteResponse(struct soap *soap, struct _cwmp1__TransferCompleteResponse *p, const char *tag, const char *type); +struct rpc_acs *cwmp_add_session_rpc_acs (struct session *session); +void backup_session_delete_rpc(char *name, char *commandKey, int status); + +static struct _cwmp1__TransferComplete *pcwmp1__TransferComplete_data; + +struct _cwmp1__TransferComplete *cwmp_set_data_rpc_acs_transferComplete () +{ + pcwmp1__TransferComplete_data = calloc (1,sizeof(struct _cwmp1__TransferComplete)); + return pcwmp1__TransferComplete_data; +} + +struct rpc_acs *cwmp_add_session_rpc_acs_transferComplete (struct session *session) +{ + struct rpc_acs *rpc_acs; + struct soap_cwmp1_methods__rpc *soap_methods; + + rpc_acs = cwmp_add_session_rpc_acs (session); + if (rpc_acs == NULL) + { + return NULL; + } + soap_methods = &(rpc_acs->soap_methods); + rpc_acs->method_data = (void *) pcwmp1__TransferComplete_data; + rpc_acs->method_data_init = cwmp_rpc_acs_transferComplete_data_init; + rpc_acs->method_remote_call = cwmp_rpc_acs_transferComplete_remote_call; + rpc_acs->method_response_data = (void *) calloc (1,sizeof(struct _cwmp1__TransferCompleteResponse)); + rpc_acs->method_response = cwmp_rpc_acs_transferComplete_response; + rpc_acs->method_end = cwmp_rpc_acs_transferComplete_end; + rpc_acs->destructor = cwmp_rpc_acs_transferComplete_destructor; + rpc_acs->type = RPC_ACS_TRANSFERCOMPLETE_IDX; + soap_methods->envelope = "cwmp:TransferComplete"; + soap_methods->envelope_response = "cwmp:TransferCompleteResponse"; + soap_methods->soap_serialize_cwmp1__send_data = (void *) soap_serialize__cwmp1__TransferComplete; + soap_methods->soap_put_cwmp1__send_data = (void *) soap_put__cwmp1__TransferComplete; + soap_methods->soap_get_cwmp1__rpc_received_data = (void *) soap_get__cwmp1__TransferCompleteResponse; + return rpc_acs; +} + +int cwmp_rpc_acs_transferComplete_data_init (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_transferComplete_remote_call (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + CWMP_LOG (INFO,"Trying to call the TransferComplete remote method"); + cwmp_soap_call_rpc_acs (cwmp, session, this); + return CWMP_OK; +} + +int cwmp_rpc_acs_transferComplete_response (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_transferComplete_end (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + return CWMP_OK; +} + +int cwmp_rpc_acs_transferComplete_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *this) +{ + struct _cwmp1__TransferComplete *p; + + p = (struct _cwmp1__TransferComplete *) this->method_data; + backup_session_delete_rpc("TransferComplete", p->CommandKey, RPC_NO_STATUS); + if (p!=NULL) + { + if (p->CommandKey!=NULL) + { + free(p->CommandKey); + } + if (p->FaultStruct!=NULL) + { + if (p->FaultStruct->FaultCode!=NULL) + { + free(p->FaultStruct->FaultCode); + } + if (p->FaultStruct->FaultString!=NULL) + { + free(p->FaultStruct->FaultString); + } + free(p->FaultStruct); + } + } + cwmp_session_rpc_acs_destructor (cwmp, session, this); + return CWMP_OK; +} diff --git a/src/backupSession.c b/src/backupSession.c new file mode 100644 index 0000000..25dd442 --- /dev/null +++ b/src/backupSession.c @@ -0,0 +1,1379 @@ +/* + backupSession.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include +#include +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "backupSession.h" + +static int backup_session_insert (char *element, char *value, char *parent, char *parent_name, struct attribute *attrs, int level); +static int backup_session_delete (char *element, struct attribute *attrs,int level, char *parent_name); +void backup_session_insert_rpc(char *name, char *commandKey, int status); +void backup_session_delete_rpc(char *name, char *commandKey, int status); +void backup_session_insert_event(char *name, char *commandKey, int id, int rpc_status); +void backup_session_delete_event(char *name,char *commandKey, int id, int rpc_status); +void backup_session_insert_parameter(char *name, char *value, char *parent, char *parent_name, int id, char *commandKey); +void backup_session_insert_acs(char *value); +void backup_session_move_inform_to_inform_send (); +void backup_session_move_inform_to_inform_queue (); +void backup_session_insert_schedule_time(time_t schedule_time,char *commandKey); +void backup_session_delete_schedule_time(time_t schedule_time,char *commandKey); +void backup_session_delete_scheduled_inform(); +void backup_session_insert_download(char *commandKey, char *url, time_t id); +void backup_session_delete_download(char *commandKey, char *url, time_t id); +void backup_session_insert_parameter_download(char *name, char *value, char *url, int id, char *commandKey); + +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key); +struct _cwmp1__TransferComplete *cwmp_set_data_rpc_acs_transferComplete (); + +static pthread_mutex_t mutex_backup_session; +extern struct list_head list_schedule_inform; +extern struct list_head list_download; +extern const struct EVENT_CONST_STRUCT EVENT_CONST [COUNT_EVENT]; +extern struct FAULT_CPE FAULT_CPE_ARRAY [FAULT_CPE_ARRAY_SIZE]; +static struct cwmp *save_cwmp; +static struct event_container *event_container_save = NULL; +static char *acs_url = NULL; +static char value[256]; +static char *parent = NULL; +static char *rpc_name = NULL; +static char *rpc_commandkey = NULL; +static char *parameter_name = NULL; +static struct _cwmp1__TransferComplete *p_soap_cwmp1__TransferComplete; +static enum backup_loading init_option; +static struct download *download_request = NULL; +extern int count_download_queue; + +void start_bkp_hndl(void *data, const char *el, const char **attr) +{ + char *event_name; + char *event_commandKey; + char *event_id; + int event_idx; + int idx; + int i; + struct schedule_inform *schedule_inform; + struct list_head *ilist; + char *scheduled_commandKey; + time_t scheduled_time; + + if(init_option == ALL) + { + if(strcmp(el,"rpc") == 0) + { + for(i = 0; attr[i] ; i+=2) + { + if(strcmp(attr[i],"name") == 0) + { + rpc_name = strdup(attr[i + 1]); + } + if(strcmp(attr[i],"commandKey") == 0) + { + rpc_commandkey = strdup(attr[i + 1]); + } + } + if(strcmp(rpc_name,"TransferComplete") == 0) + { + parent = strdup(el); + p_soap_cwmp1__TransferComplete = cwmp_set_data_rpc_acs_transferComplete (); + } + } + if(strcmp(el,"event") == 0) + { + parent = strdup(el); + for(i = 0; attr[i] ; i+=2) + { + if(strcmp(attr[i],"name") == 0) + { + event_name = strdup(attr[i+1]); + } + if(strcmp(attr[i],"commandKey") == 0) + { + event_commandKey = strdup(attr[i+1]); + } + if(strcmp(attr[i],"id") == 0) + { + event_id = strdup(attr[i+1]); + } + } + for (i = 0; i< COUNT_EVENT; i++) + { + if(strcmp(event_name,EVENT_CONST [i].CODE) == 0) + { + event_idx = i; + break; + } + } + if ((save_cwmp->env.boot != CWMP_START_BOOT) || (EVENT_CONST[event_idx].RETRY & EVENT_RETRY_AFTER_REBOOT)) + { + event_container_save = cwmp_add_event_container (save_cwmp, event_idx, event_commandKey); + if(event_container_save != NULL) + { + event_container_save->id = atoi(event_id); + } + } + if(event_id != NULL) + { + free(event_id); + event_id = NULL; + } + if(event_commandKey != NULL) + { + free(event_commandKey); + event_commandKey = NULL; + } + if(event_name != NULL) + { + free(event_name); + event_name = NULL; + } + } + if(strcmp(el,"parameter") == 0) + { + for(i = 0; attr[i] ; i+=2) + { + if(strcmp(attr[i],"name") == 0) + { + parameter_name = strdup(attr[i + 1]); + } + } + } + if(strcmp(el,"scheduledTime") == 0) + { + for(i = 0; attr[i] ; i+=2) + { + if(strcmp(attr[i],"commandKey") == 0) + { + scheduled_commandKey = strdup(attr[i + 1]); + } + if(strcmp(attr[i],"time") == 0) + { + scheduled_time = atol(attr[i + 1]); + } + } + __list_for_each(ilist,&(list_schedule_inform)) + { + schedule_inform = list_entry(ilist,struct schedule_inform, list); + if (schedule_inform->scheduled_time > scheduled_time) + { + break; + } + } + schedule_inform = calloc (1,sizeof(struct schedule_inform)); + if (schedule_inform!=NULL) + { + schedule_inform->commandKey = scheduled_commandKey; + schedule_inform->scheduled_time = scheduled_time; + list_add (&(schedule_inform->list), ilist->prev); + } + } + if(strcmp(el,"download") == 0) + { + parent = strdup(el); + download_request = calloc(1,sizeof(struct download)); + for(i = 0; attr[i] ; i+=2) + { + if(strcmp(attr[i],"commandKey") == 0) + { + download_request->CommandKey = strdup(attr[i + 1]); + } + if(strcmp(attr[i],"url") == 0) + { + download_request->URL = strdup(attr[i + 1]); + } + if(strcmp(attr[i],"time") == 0) + { + download_request->scheduled_time = atol(attr[i + 1]); + } + } + } + } +} + +void end_bkp_hndl(void *data, const char *el) +{ + int i,fault_idx; + struct session *session; + struct list_head *ilist; + struct download *idownload_request; + + if(init_option == ALL || init_option == ACS) + { + if(strcmp(el,"url") == 0) + { + acs_url = strdup(value); + } + } + if(init_option == ALL) + { + if(strcmp(el,"rpc") == 0) + { + if(strcmp(rpc_name,"TransferComplete") == 0) + { + if(rpc_commandkey != NULL) + { + p_soap_cwmp1__TransferComplete->CommandKey = strdup(rpc_commandkey); + } + else + { + p_soap_cwmp1__TransferComplete->CommandKey = strdup(""); + } + cwmp_root_cause_TransferComplete (save_cwmp); + } + if(parent != NULL) + { + free(parent); + parent = NULL; + } + if(rpc_name != NULL) + { + free(rpc_name); + rpc_name = NULL; + } + } + if(strcmp(el,"event") == 0) + { + if(parent != NULL) + { + free(parent); + parent = NULL; + } + } + if(strcmp(el,"download") == 0) + { + __list_for_each(ilist,&(list_download)) + { + idownload_request = list_entry(ilist,struct download,list); + if (idownload_request->scheduled_time > download_request->scheduled_time) + { + break; + } + } + list_add (&(download_request->list), ilist->prev); + count_download_queue++; + if(parent != NULL) + { + free(parent); + parent = NULL; + } + } + if(strcmp(el,"parameter") == 0) + { + if(parent != NULL && strcmp(parent,"rpc") == 0) + { + if(strcmp(rpc_name,"TransferComplete") == 0) + { + if(p_soap_cwmp1__TransferComplete != NULL) + { + if(strcmp(parameter_name,"StartTime") == 0) + { + p_soap_cwmp1__TransferComplete->StartTime = atol(value); + } + if(strcmp(parameter_name,"CompleteTime") == 0) + { + p_soap_cwmp1__TransferComplete->CompleteTime = atol(value); + } + if(strcmp(parameter_name,"FaultCode") == 0) + { + p_soap_cwmp1__TransferComplete->FaultStruct = calloc(1,sizeof(struct cwmp1__FaultStruct)); + p_soap_cwmp1__TransferComplete->FaultStruct->FaultCode = strdup(value); + for(i = 0; i < FAULT_CPE_ARRAY_SIZE; i++) + { + if((FAULT_CPE_ARRAY[i].CODE != NULL)&&(strcmp(FAULT_CPE_ARRAY[i].CODE, value) == 0)) + { + fault_idx = i; + break; + } + } + p_soap_cwmp1__TransferComplete->FaultStruct->FaultString = strdup(FAULT_CPE_ARRAY[i].DESCRIPTION); + } + } + } + } + if(parent != NULL && strcmp(parent,"download") == 0) + { + if(download_request != NULL) + { + if(strcmp(parameter_name,"FileType") == 0) + { + download_request->FileType = strdup(value); + } + if(strcmp(parameter_name,"Username") == 0) + { + download_request->Username = strdup(value); + } + if(strcmp(parameter_name,"Password") == 0) + { + download_request->Password = strdup(value); + } + } + } + if(parent != NULL && strcmp(parent,"event") == 0) + { + if(event_container_save != NULL) + { + cwmp_add_parameter_container (save_cwmp,event_container_save, parameter_name); + } + } + if(parameter_name != NULL) + { + free(parameter_name); + parameter_name = NULL; + } + } + } +} + +void char_bkp_hndl(void *data, const char *content,int length) +{ + char tmp[512]; + int i = 0,n = 0; + + if(length!=0) + { + strncpy(tmp, content, length); + tmp[length] = '\0'; + while(istatus != NULL) + { + sprintf(attrib,"name=\"%s\" status=\"%s\"", attrs->name, attrs->status); + } + else + { + if(attrs->commandKey != NULL) + { + sprintf(attrib,"name=\"%s\" commandKey=\"%s\"", attrs->name, attrs->commandKey); + } + else + { + sprintf(attrib,"name=\"%s\"", attrs->name); + } + } + } + else if (strcmp(element,"event") == 0) + { + sprintf(attrib,"name=\"%s\" id=\"%li\" commandKey=\"%s\"", attrs->name, attrs->id, attrs->commandKey); + } + else if (strcmp(element,"parameter") == 0) + { + sprintf(attrib,"name=\"%s\"", attrs->name); + } + else if (strcmp(element,"scheduledTime") == 0) + { + sprintf(attrib,"commandKey=\"%s\" time=\"%li\"", attrs->commandKey, attrs->id); + } + else if (strcmp(element,"download") == 0) + { + sprintf(attrib,"commandKey=\"%s\" url=\"%s\" time=\"%li\"", attrs->commandKey, attrs->url, attrs->id); + } + } + + if(strlen(indent) != 0) + { + if(value != NULL) + { + if(strlen(attrib) != 0) + { + sprintf(start,"%s<%s %s>%s",indent,element,attrib,value); + } + else + { + sprintf(start,"%s<%s>%s",indent,element,value); + } + sprintf(end,"\n",element); + } + else + { + if(strlen(attrib) != 0) + { + sprintf(start,"%s<%s %s>\n",indent,element,attrib); + } + else + { + sprintf(start,"%s<%s>\n",indent,element); + } + sprintf(end,"%s\n",indent,element); + } + } + else + { + if(strlen(attrib) != 0) + { + sprintf(start,"<%s %s>\n",element,attrib); + } + else + { + sprintf(start,"<%s>\n",element); + } + sprintf(end,"",element); + } + + if(parent != NULL) + { + if(parent_name != NULL) + { + if(strcmp(parent,"event") == 0) + { + sprintf(parent_tag,"<%s name=\"%s\" id=\"%li\" commandKey=\"%s\"", parent, parent_name, attrs->id, attrs->commandKey); + } + else if(strcmp(parent,"rpc") == 0) + { + if(attrs->commandKey != NULL) + { + sprintf(parent_tag,"<%s name=\"%s\" commandKey=\"%s\"", parent, parent_name, attrs->commandKey); + } + else + { + sprintf(parent_tag,"<%s name=\"%s\"", parent, parent_name); + } + } + else + { + sprintf(parent_tag,"<%s name=\"%s\"", parent, parent_name); + } + } + else + { + if(strcmp(parent,"download") == 0) + { + if(attrs->commandKey != NULL) + { + sprintf(parent_tag,"<%s commandKey=\"%s\" url=\"%s\" time=\"%li\"", parent, attrs->commandKey, attrs->url, attrs->id); + } + else + { + sprintf(parent_tag,"<%s commandKey=\"\" url=\"%s\" time=\"%li\"", parent, attrs->url, attrs->id); + } + } + else + { + sprintf(parent_tag,"<%s", parent); + } + } + } + /** search element if exist **/ + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + if ((strcmp(element,"parameter") != 0) && + (strstr(line,start) != NULL)) + { + fclose(pFile); + fclose(tmpFile); + remove("tmp.xml"); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; + } + if ((strcmp(element,"parameter") == 0) && + (parent != NULL) && (strcmp(parent,"event") == 0)&& + (strstr(line,parent_tag) != NULL)) + { + while(strstr(line,"") == NULL) + { + fgets(line,sizeof(line),pFile); + if (strstr(line,start) != NULL) + { + fclose(pFile); + fclose(tmpFile); + remove("tmp.xml"); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; + } + } + } + if ((strcmp(element,"parameter") == 0) && + (parent != NULL) && (strcmp(parent,"rpc") == 0) && + (strstr(line,parent_tag) != NULL)) + { + while(strstr(line,"") == NULL) + { + fgets(line,sizeof(line),pFile); + if (strstr(line,start) != NULL) + { + fclose(pFile); + fclose(tmpFile); + remove("tmp.xml"); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; + } + } + } + if ((strcmp(element,"parameter") == 0) && + (parent != NULL) && (strcmp(parent,"download") == 0) && + (strstr(line,parent_tag) != NULL)) + { + while(strstr(line,"") == NULL) + { + fgets(line,sizeof(line),pFile); + if (strstr(line,start) != NULL) + { + fclose(pFile); + fclose(tmpFile); + remove("tmp.xml"); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; + } + } + } + } + + if((feof(pFile))&&(strcmp(element,"cwmp") == 0)) + { + fputs(start,tmpFile); + fputs(end,tmpFile); + goto end; + } + rewind(pFile); + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + if(strstr(line,parent_tag) != NULL) + { + if((strcmp(element,"event") == 0)&&(strstr(line,attrs->status) == NULL)) + { + continue; + } + break; + } + } + + fputs(start,tmpFile); + fputs(end,tmpFile); + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + } +end: + fclose(pFile); + fclose(tmpFile); + rename("tmp.xml", CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; +} + +static int backup_session_delete (char *element, struct attribute *attrs,int level, char *parent_name) +{ + char line[256]; + char start[256]; + char end[256]; + char attrib[256]; + char id[16]; + int i; + FILE *pFile; + FILE *tmpFile; + bool found = FALSE; + + pthread_mutex_lock (&mutex_backup_session); + attrib[0] = 0; + start[0] = 0; + end[0] = 0; + + pFile = fopen(CWMP_BKP_FILE,"r"); + tmpFile = fopen("tmp.xml","w"); + if(pFile == NULL || tmpFile == NULL) + { + CWMP_LOG(ERROR,"Unable to write in %s file",CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); + exit(EXIT_FAILURE); + } + + if(attrs != NULL) + { + if(strcmp(element,"rpc") == 0) + { + if(attrs->status != NULL) + { + sprintf(attrib,"name=\"%s\" status=\"%s\"", attrs->name, attrs->status); + } + else + { + if(attrs->commandKey != NULL) + { + sprintf(attrib,"name=\"%s\" commandKey=\"%s\"", attrs->name, attrs->commandKey); + } + else + { + sprintf(attrib,"name=\"%s\"", attrs->name); + } + } + } + else if (strcmp(element,"event") == 0) + { + sprintf(attrib,"name=\"%s\" id=\"%li\" commandKey=\"%s\"", attrs->name, attrs->id, attrs->commandKey); + } + else if (strcmp(element,"parameter") == 0) + { + sprintf(attrib,"name=\"%s\"", attrs->name); + sprintf(id,"%li",attrs->id); + } + else if (strcmp(element,"scheduledTime") == 0) + { + sprintf(attrib,"commandKey=\"%s\" time=\"%li\"", attrs->commandKey, attrs->id); + } + else if (strcmp(element,"download") == 0) + { + sprintf(attrib,"commandKey=\"%s\" url=\"%s\" time=\"%li\"", attrs->commandKey, attrs->url, attrs->id); + } + } + + if(strlen(attrib) != 0) + { + sprintf(start,"<%s %s>",element,attrib); + } + else + { + sprintf(start,"<%s>",element); + } + sprintf(end,"\n",element); + + /** search element if exist **/ + + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + if (strstr(line,start) != NULL) + { + found = TRUE; + break; + } + } + if((found == FALSE) && (feof(pFile))) + { + fclose(pFile); + fclose(tmpFile); + remove("tmp.xml"); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; + } + else + { + found = FALSE; + rewind(pFile); + } + + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + if ( + (strcmp(element,"parameter") == 0) && + (strstr(line,parent_name) != NULL) && + ((attrs != NULL)&&((attrs->id == -1)||((attrs->id != -1) && (strstr(line,id) != NULL)))) + ) + { + found = TRUE; + } + if((strcmp(element,"parameter") != 0)||((strcmp(element,"parameter") == 0)&&(found == TRUE))) + { + if((strstr(line,start) != NULL)&&(strstr(line,end) == NULL)) + { + break; + } + else if((strstr(line,start) != NULL)&&(strstr(line,end) != NULL)) + { + goto end; + } + } + fputs(line,tmpFile); + } + + if(feof(pFile)) + { + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; + } + + while(!feof(pFile)&&(strstr(line,end) == NULL)) + { + fgets(line,sizeof(line),pFile); + } +end: + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + } + fclose(pFile); + fclose(tmpFile); + rename("tmp.xml", CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); + return CWMP_OK; +} + +void backup_session_insert_event(char *name, char *commandKey, int id, int rpc_status) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = id; + attrs->name = strdup(name); + if(rpc_status == RPC_QUEUE) + { + attrs->status = strdup("queue"); + } + else if(rpc_status == RPC_SEND) + { + attrs->status = strdup("send"); + } + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_insert("event",NULL,"rpc",NULL,attrs,3); + if(attrs->name != NULL) + { + free(attrs->name); + } + if(attrs->status != NULL) + { + free(attrs->status); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_insert_parameter(char *name, char *value, char *parent,char *parent_name, int id, char *commandKey) +{ + struct attribute *attrs; + int level; + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = id; + attrs->name = strdup(name); + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + } + if(strcmp(parent,"rpc") == 0) + { + level = 3; + } + else if(strcmp(parent,"event") == 0) + { + level = 4; + } + backup_session_insert("parameter",value,parent,parent_name,attrs,level); + if(attrs->name != NULL) + { + free(attrs->name); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_insert_rpc(char *name, char *commandKey, int status) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = -1; + attrs->name = strdup(name); + if(status == RPC_QUEUE) + { + attrs->status = strdup("queue"); + } + else if(status == RPC_SEND) + { + attrs->status = strdup("send"); + } + else + { + attrs->status = NULL; + } + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_insert("rpc",NULL,"cwmp",NULL,attrs,2); + if(attrs->name != NULL) + { + free(attrs->name); + } + if(attrs->status != NULL) + { + free(attrs->status); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_insert_acs(char *value) +{ + backup_session_delete ("url", NULL, 3, NULL); + backup_session_insert("url", value, "acs", NULL, NULL, 3); +} + +void backup_session_delete_event(char *name,char *commandKey, int id, int rpc_status) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = id; + attrs->name = strdup(name); + if(rpc_status == RPC_QUEUE) + { + attrs->status = strdup("queue"); + } + else if(rpc_status == RPC_SEND) + { + attrs->status = strdup("send"); + } + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_delete ("event", attrs, 3, NULL); + if(attrs->name != NULL) + { + free(attrs->name); + } + if(attrs->status != NULL) + { + free(attrs->status); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_delete_rpc(char *name, char *commandKey, int status) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = -1; + attrs->name = strdup(name); + if(status == RPC_QUEUE) + { + attrs->status = strdup("queue"); + } + else if(status == RPC_SEND) + { + attrs->status = strdup("send"); + } + else + { + attrs->status = NULL; + } + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_delete("rpc",attrs,2, NULL); + if(attrs->name != NULL) + { + free(attrs->name); + } + if(attrs->status != NULL) + { + free(attrs->status); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_move_inform_to_inform_send () +{ + char line[256]; + char start[256]; + FILE *pFile; + FILE *tmpFile; + + pthread_mutex_lock (&mutex_backup_session); + start[0] = 0; + + pFile = fopen(CWMP_BKP_FILE,"r"); + tmpFile = fopen("tmp.xml","w"); + if(pFile == NULL || tmpFile == NULL) + { + CWMP_LOG(ERROR,"Unable to write in %s file",CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); + exit(EXIT_FAILURE); + } + + sprintf(start,"\t\n"); + + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + if(strcmp(line,"\t\n") == 0) + { + break; + } + fputs(line,tmpFile); + } + if(!feof(pFile)) + { + fputs(start,tmpFile); + } + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + } + fclose(pFile); + fclose(tmpFile); + rename("tmp.xml", CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); +} + +void backup_session_move_inform_to_inform_queue () +{ + char line[256]; + char *buffer; + FILE *pFile; + FILE *tmpFile; + long int max; + + pthread_mutex_lock (&mutex_backup_session); + + + pFile = fopen(CWMP_BKP_FILE,"r"); + + max = get_xml_file_size(pFile); + buffer = calloc(1,max); + + tmpFile = fopen("tmp.xml","w"); + if(pFile == NULL || tmpFile == NULL) + { + CWMP_LOG(ERROR,"Unable to write in %s file",CWMP_BKP_FILE); + exit(EXIT_FAILURE); + } + + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + if(strcmp(line,"\t\n") == 0) + { + break; + } + fputs(line,tmpFile); + } + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + if(strcmp(line,"\t\n") != 0) + { + strcat (buffer,line); + } + else + { + break; + } + } + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + } + fclose(pFile); + fclose(tmpFile); + rename("tmp.xml", CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); + + if(strlen(buffer) != 0) + { + backup_session_insert_rpc("Inform",NULL,RPC_QUEUE); + } + else + { + return; + } + + pthread_mutex_lock (&mutex_backup_session); + pFile = fopen(CWMP_BKP_FILE,"r"); + tmpFile = fopen("tmp.xml","w"); + if(pFile == NULL || tmpFile == NULL) + { + CWMP_LOG(ERROR,"Unable to write in %s file",CWMP_BKP_FILE); + pthread_mutex_unlock (&mutex_backup_session); + exit(EXIT_FAILURE); + } + + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + if(strcmp(line,"\t\n") == 0) + { + break; + } + } + if(!feof(pFile)) + { + fputs(buffer,tmpFile); + } + while(!feof(pFile)) + { + fgets(line,sizeof(line),pFile); + fputs(line,tmpFile); + } + fclose(pFile); + fclose(tmpFile); + rename("tmp.xml", CWMP_BKP_FILE); + if(buffer != NULL) + { + free(buffer); + } + pthread_mutex_unlock (&mutex_backup_session); +} + +void backup_session_insert_schedule_time(time_t schedule_time,char *commandKey) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = schedule_time; + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_insert("scheduledInform",NULL,"cwmp",NULL,NULL,2); + backup_session_insert("scheduledTime", NULL, "scheduledInform", NULL, attrs, 3); + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_delete_schedule_time(time_t schedule_time,char *commandKey) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = schedule_time; + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_delete("scheduledTime", attrs, 3, NULL); + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_delete_scheduled_inform() +{ + backup_session_delete("scheduledInform",NULL,2,NULL); +} + +void backup_session_insert_download(char *commandKey, char *url, time_t id) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = id; + if(url != NULL) + { + attrs->url = strdup(url); + } + else + { + attrs->url = NULL; + } + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_insert("download",NULL,"cwmp",NULL,attrs,2); + if(attrs->url != NULL) + { + free(attrs->url); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_delete_download(char *commandKey, char *url, time_t id) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = id; + if(url != NULL) + { + attrs->url = strdup(url); + } + else + { + attrs->url = NULL; + } + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + else + { + attrs->commandKey = NULL; + } + } + backup_session_delete("download",attrs,2, NULL); + if(attrs->url != NULL) + { + free(attrs->url); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + free(attrs); +} + +void backup_session_insert_parameter_download(char *name, char *value, char *url, int id, char *commandKey) +{ + struct attribute *attrs; + + attrs = calloc(1,sizeof(struct attribute)); + if(attrs != NULL) + { + attrs->id = id; + attrs->name = strdup(name); + if(commandKey != NULL) + { + attrs->commandKey = strdup(commandKey); + } + if(url != NULL) + { + attrs->url = strdup(url); + } + } + backup_session_insert("parameter",value,"download",NULL,attrs,3); + if(attrs->name != NULL) + { + free(attrs->name); + } + if(attrs->commandKey != NULL) + { + free(attrs->commandKey); + } + if(attrs->url != NULL) + { + free(attrs->url); + } + free(attrs); +} diff --git a/src/config.c b/src/config.c new file mode 100644 index 0000000..b1efd2c --- /dev/null +++ b/src/config.c @@ -0,0 +1,1099 @@ +/* + config.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + + +#include +#include +#include +#include +#include +#include "list.h" +#include "soapH.h" +#include "cwmp.h" +#include +#include "backupSession.h" +#include + +void backup_session_insert_acs(char *value); + +typedef enum uci_config_action { + CMD_SET, + CMD_SET_STATE, + CMD_ADD_LIST, + CMD_DEL, +} uci_config_action; + +void show_help() +{ + fprintf(stdout, "\nUsage: cwmpd [option]\n"); + fprintf(stdout, "-b: this option should be added only in the load phase\n"); + fprintf(stdout, "-g: send GetRPCMethods to ACS\n"); + fprintf(stdout, "-v: show the application version\n"); + fprintf(stdout, "-h: show this help\n\n"); +} +void show_version() +{ +#ifndef CWMP_REVISION + fprintf(stdout, "\nVersion: %s\n\n",CWMP_VERSION); +#else + fprintf(stdout, "\nVersion: %s revision %s\n\n",CWMP_VERSION,CWMP_REVISION); +#endif +} + +int load_dm_list(char *cmd) +{ + struct uci_ptr ptr; + struct uci_context *c = uci_alloc_context(); + char *s,*t; + int error; + struct uci_element *e; + + if (!c) + { + CWMP_LOG(ERROR, "Out of memory"); + return CWMP_GEN_ERR; + } + + s = strdup(cmd); + t = s; + if (uci_lookup_ptr(c, &ptr, s, TRUE) != UCI_OK) + { + CWMP_LOG(ERROR, "Invalid uci command path: %s",cmd); + free(t); + uci_free_context(c); + return CWMP_GEN_ERR; + } + + if(ptr.o == NULL) + { + CWMP_LOG(ERROR,"NO DATA MODEL XML FILES TO BE LOADED"); + free(t); + uci_free_context(c); + return CWMP_GEN_ERR; + } + + if(ptr.o->type == UCI_TYPE_LIST) + { + uci_foreach_element(&ptr.o->v.list, e) + { + if((e != NULL)&&(e->name)) + { + CWMP_LOG(INFO,"LOADING DATA MODEL FILE %s",e->name); + if((error = dm_xml_init_tree(e->name)) != CWMP_OK) + { + CWMP_LOG(ERROR,"LOADING DATA MODEL FILE '%s' FAILED",e->name); + free(t); + uci_free_context(c); + return error; + } + } + else + { + free(t); + uci_free_context(c); + return CWMP_GEN_ERR; + } + } + } + free(t); + uci_free_context(c); + return CWMP_OK; +} + +int uci_get_list_value(char *cmd, struct list_head *list) +{ + struct uci_ptr ptr; + struct uci_context *c = uci_alloc_context(); + struct uci_element *e; + struct config_uci_list *uci_list_elem; + char *s,*t; + int size = 0; + + if (!c) + { + CWMP_LOG(ERROR, "Out of memory"); + return size; + } + + s = strdup(cmd); + t = s; + if (uci_lookup_ptr(c, &ptr, s, TRUE) != UCI_OK) + { + CWMP_LOG(ERROR, "Invalid uci command path: %s",cmd); + free(t); + uci_free_context(c); + return size; + } + + if(ptr.o == NULL) + { + free(t); + uci_free_context(c); + return size; + } + + if(ptr.o->type == UCI_TYPE_LIST) + { + uci_foreach_element(&ptr.o->v.list, e) + { + if((e != NULL)&&(e->name)) + { + uci_list_elem = calloc(1,sizeof(struct config_uci_list)); + if(uci_list_elem == NULL) + { + free(t); + uci_free_context(c); + return CWMP_GEN_ERR; + } + uci_list_elem->value = strdup(e->name); + list_add_tail (&(uci_list_elem->list), list); + size++; + } + else + { + free(t); + uci_free_context(c); + return size; + } + } + } + free(t); + uci_free_context(c); + return size; +} + +int uci_get_value_common(char *cmd,char **value,bool state) +{ + struct uci_ptr ptr; + struct uci_context *c = uci_alloc_context(); + char *s,*t; + char state_path[32]; + + *value = NULL; + if (!c) + { + CWMP_LOG(ERROR, "Out of memory"); + return CWMP_GEN_ERR; + } + if (state) + { + strcpy(state_path,"/var/state"); + uci_add_history_path(c, c->savedir); + uci_set_savedir(c, state_path); + } + s = strdup(cmd); + t = s; + if (uci_lookup_ptr(c, &ptr, s, TRUE) != UCI_OK) + { + CWMP_LOG(ERROR, "Error occurred in uci %s get %s",state?"state":"config",cmd); + free(t); + uci_free_context(c); + return CWMP_GEN_ERR; + } + free(t); + if(ptr.flags & UCI_LOOKUP_COMPLETE) + { + if (ptr.o==NULL || ptr.o->v.string==NULL) + { + CWMP_LOG(INFO, "%s not found or empty value",cmd); + uci_free_context(c); + return CWMP_OK; + } + *value = strdup(ptr.o->v.string); + } + uci_free_context(c); + return CWMP_OK; +} + +int uci_get_state_value(char *cmd,char **value) +{ + int error; + error = uci_get_value_common (cmd,value,TRUE); + return error; +} + +int uci_get_value(char *cmd,char **value) +{ + int error; + error = uci_get_value_common (cmd,value,FALSE); + return error; +} + +static int uci_action_value_common(char *cmd, uci_config_action action) +{ + int ret = UCI_OK; + char *s,*t; + struct uci_context *c = uci_alloc_context(); + struct uci_ptr ptr; + char state_path[32]; + + s = strdup(cmd); + t = s; + + if (!c) + { + CWMP_LOG(ERROR, "Out of memory"); + return CWMP_GEN_ERR; + } + + if (action == CMD_SET_STATE) + { + strcpy(state_path,"/var/state"); + uci_add_history_path(c, c->savedir); + uci_set_savedir(c, state_path); + } + + if (uci_lookup_ptr(c, &ptr, s, TRUE) != UCI_OK) + { + free(t); + uci_free_context(c); + return CWMP_GEN_ERR; + } + switch (action) + { + case CMD_SET: + case CMD_SET_STATE: + ret = uci_set(c, &ptr); + break; + case CMD_DEL: + ret = uci_delete(c, &ptr); + break; + case CMD_ADD_LIST: + ret = uci_add_list(c, &ptr); + break; + } + if (ret == UCI_OK) + { + ret = uci_save(c, ptr.p); + } + else + { + CWMP_LOG(ERROR, "UCI %s %s not succeed %s",action==CMD_SET_STATE?"state":"config",action==CMD_DEL?"delete":"set",cmd); + } + free(t); + uci_free_context(c); + return CWMP_OK; +} + +int uci_delete_value(char *cmd) +{ + int error; + error = uci_action_value_common (cmd,CMD_DEL); + return error; +} + +int uci_set_value(char *cmd) +{ + int error; + error = uci_action_value_common (cmd,CMD_SET); + return error; +} + +int uci_set_state_value(char *cmd) +{ + int error; + error = uci_action_value_common (cmd,CMD_SET_STATE); + return error; +} + +int uci_add_list_value(char *cmd) +{ + int error; + error = uci_action_value_common (cmd,CMD_ADD_LIST); + return error; +} + +static int cwmp_package_commit(struct uci_context *c,char *tuple) +{ + struct uci_element *e = NULL; + struct uci_ptr ptr; + + if (uci_lookup_ptr(c, &ptr, tuple, TRUE) != UCI_OK) { + return CWMP_GEN_ERR; + } + + e = ptr.last; + + if (uci_commit(c, &ptr.p, false) != UCI_OK) + { + return CWMP_GEN_ERR; + } + + uci_unload(c, ptr.p); + return CWMP_OK; +} + +static int cwmp_do_package_cmd(struct uci_context *c) +{ + char **configs = NULL; + char **p; + + if ((uci_list_configs(c, &configs) != UCI_OK) || !configs) + { + return CWMP_GEN_ERR; + } + + for (p = configs; *p; p++) + { + cwmp_package_commit(c,*p); + } + + return CWMP_OK; +} + +int uci_commit_value() +{ + int ret; + struct uci_context *c = uci_alloc_context(); + + if (!c) + { + CWMP_LOG(ERROR, "Out of memory"); + return CWMP_GEN_ERR; + } + + ret = cwmp_do_package_cmd(c); + if(ret == CWMP_OK) + { + uci_free_context(c); + return ret; + } + + uci_free_context(c); + return CWMP_GEN_ERR; +} + +int uci_revert_value () +{ + char **configs = NULL; + char **p; + struct uci_context *ctx = uci_alloc_context(); + struct uci_ptr ptr; + + if (!ctx) + { + return CWMP_GEN_ERR; + } + + if ((uci_list_configs(ctx, &configs) != UCI_OK) || !configs) { + return CWMP_GEN_ERR; + } + + for (p = configs; *p; p++) + { + if (uci_lookup_ptr(ctx, &ptr, *p, TRUE) != UCI_OK) + { + return CWMP_GEN_ERR; + } + uci_revert(ctx, &ptr); + } + uci_free_context(ctx); + + return CWMP_OK; +} + +int uci_apply_web_packages() +{ + FILE *fp; + char cmd[256]; + int error; + + sprintf(cmd,"/bin/opkg install %s",DOWNLOADED_WEBCONTENT_FILE); + fp = popen(cmd,"r"); + error = pclose(fp); + + remove(DOWNLOADED_WEBCONTENT_FILE); + if(error == 0) + { + return FAULT_CPE_NO_FAULT_IDX; + } + else + { + return FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX; + } +} + +int uci_apply_configuration() +{ + struct uci_context *ctx = uci_alloc_context(); + struct uci_package *package = NULL; + char *name = NULL; + int ret = UCI_OK; + FILE *pFile; + struct uci_package *p; + struct uci_element *e; + + if (!ctx) + { + CWMP_LOG(ERROR, "Out of memory"); + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + pFile = fopen(DOWNLOADED_CONFIG_FILE,"rb"); + + if(pFile == NULL) + { + CWMP_LOG(ERROR,"Configuration is not readable"); + uci_free_context(ctx); + return FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX; + } + ret = uci_import(ctx, pFile, name, &package, (name != NULL)); + if (ret == UCI_OK) + { + CWMP_LOG(INFO,"Trying to apply configuration file"); + uci_foreach_element(&ctx->root, e) + { + p = uci_to_package(e); + ret = uci_commit(ctx, &p, true); + if(ret != CWMP_OK) + { + CWMP_LOG(ERROR,"Unable to save configuration"); + fclose(pFile); + remove(DOWNLOADED_CONFIG_FILE); + uci_free_context(ctx); + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + } + } + else + { + CWMP_LOG(ERROR,"Can not apply downloaded configuration file"); + fclose(pFile); + remove(DOWNLOADED_CONFIG_FILE); + uci_free_context(ctx); + return FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX; + } + fclose(pFile); + uci_free_context(ctx); + return FAULT_CPE_NO_FAULT_IDX; +} + +static int cwmp_check_image() +{ + FILE *fp; + char cmd[256]; + int error; + + sprintf(cmd,". /etc/functions.sh; include /lib/upgrade; platform_check_image %s >/dev/null",DOWNLOADED_FIRMWARE_FILE); + fp = popen(cmd,"r"); + error = pclose(fp); + + if(error == 0) + { + return CWMP_OK; + } + else + { + return CWMP_GEN_ERR; + } + + return CWMP_OK; +} + +static int checkline (const char *str_regex,const char *str_request) +{ + int error; + regex_t preg; + int match; + size_t nmatch = 0; + regmatch_t *pmatch = NULL; + + if((str_request == NULL) || (strcmp(str_request,"") == 0)) + { + return CWMP_GEN_ERR; + } + + error = regcomp (&preg, str_regex, REG_EXTENDED); + if (error == 0) + { + nmatch = preg.re_nsub; + pmatch = malloc (sizeof (*pmatch) * nmatch); + if (pmatch) + { + match = regexec (&preg, str_request, nmatch, pmatch, 0); + regfree (&preg); + if (match == 0) + { + return CWMP_OK; + } + else if (match == REG_NOMATCH) + { + return CWMP_GEN_ERR; + } + else + { + return CWMP_MEM_ERR; + } + } + else + { + return CWMP_MEM_ERR; + } + } + return CWMP_GEN_ERR; +} + +long int cwmp_check_flash_size() +{ + char line[256]; + long int size = 0; + FILE *fp; + char *n = NULL; + char *b = NULL; + char *s = NULL; + char *t = NULL; + char *endptr = NULL; + int i = 0,error; + + fp = fopen("/proc/mtd","r"); + if (fp != NULL) + { + while (fgets(line,sizeof(line),fp)) + { + if(checkline("^([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+\"([^[:space:]]+)\"",line) == CWMP_OK) + { + t = strdup(line); + n = t; + n = strtok(n," "); + i = 0; + while(n != NULL) + { + if(i == 1) + { + s = strdup(n); + } + if(i == 3) + { + break; + } + n = strtok(NULL," "); + i++; + } + n[strlen(n)-1] = 0; + if(strcmp(n,"\"linux\"") == 0 || strcmp(n,"\"firmware\"") == 0) + { + size = strtol(s, &endptr, 16); + break; + } + } + } + } + else if (fp = fopen("/proc/partitions","r")) + { + while (fgets(line,sizeof(line),fp)) + { + if(checkline("[[:space:]]*([[:digit:]]+)[[:space:]]+([[:digit:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)",line) == CWMP_OK) + { + i = 0; + t = strdup(line); + n = t; + n = strtok(n," "); + while(n != NULL) + { + if(i == 2) + { + b = strdup(n); + } + if(i == 3) + { + break; + } + n = strtok(NULL," "); + i++; + } + if ((b != NULL) && (n != NULL) && (checkline("([^[:space:]]+)",n) == CWMP_OK)) + { + size = atoi(b) * 1024; + break; + } + } + } + } + if(t != NULL) + { + free(t); + } + if(b != NULL) + { + free(b); + } + if(s != NULL) + { + free(s); + } + fclose(fp); + return size; +} + +static long int cwmp_get_firmware_size() +{ + struct stat st; + long int size = 0; + + if (stat(DOWNLOADED_FIRMWARE_FILE, &st) == 0) + { + size = st.st_size; + } + + return size; +} + +int cwmp_start_upgrade(struct cwmp *cwmp,void *v) +{ + char cmd[256]; + char line[256]; + FILE *fp; + int error; + + CWMP_LOG(INFO,"RUN Firmware upgrade function"); + /** flush file system buffers **/ + sync(); + sprintf(cmd,"killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s",DOWNLOADED_LAST_VALID_FIRMWARE_FILE); + fp = popen(cmd,"r"); + while (fgets(line,sizeof(line),fp)) + { + continue; + } + error = pclose(fp); + if(error == 0) + { + return CWMP_OK; + } + else + { + return CWMP_GEN_ERR; + } +} + +int cwmp_reset_factory(struct cwmp *cwmp,void *v) +{ + char cmd[256]; + char line[256]; + FILE *fp; + int error; + + CWMP_LOG(INFO,"RUN Factory reset function"); /* TODO to be removed*/ + sprintf(cmd,"killall dropbear uhttpd; sleep 1; mtd -r erase rootfs_data"); + fp = popen(cmd,"r"); + while (fgets(line,sizeof(line),fp)) + { + continue; + } + error = pclose(fp); + if(error == 0) + { + return CWMP_OK; + } + else + { + return CWMP_GEN_ERR; + } +} + +int uci_upgrade_image(struct cwmp *cwmp, struct session *session) +{ + int error; + long int flashsize = 0,filesize = 0; + FILE *fp; + + if(cwmp_check_image() == CWMP_OK) + { + flashsize = cwmp->env.max_firmware_size; + filesize = cwmp_get_firmware_size(); + + if((flashsize > 0)&&(filesize > flashsize)) + { + remove(DOWNLOADED_FIRMWARE_FILE); + return FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX; + } + else + { + remove(DOWNLOADED_LAST_VALID_FIRMWARE_FILE); + rename(DOWNLOADED_FIRMWARE_FILE,DOWNLOADED_LAST_VALID_FIRMWARE_FILE); + if(session != NULL) + { + add_session_end_func(session,cwmp_start_upgrade,NULL,FALSE); + } + else + { + add_download_end_func(cwmp_start_upgrade,NULL); + } + return FAULT_CPE_NO_FAULT_IDX; + } + } + else + { + remove(DOWNLOADED_FIRMWARE_FILE); + return FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX; + } +} + +int check_global_config (struct config *conf) +{ + if (conf->acsurl==NULL) + { + conf->acsurl = strdup(DEFAULT_ACSURL); + } + return CWMP_OK; +} + +static void uppercase ( char *sPtr ) +{ + while ( *sPtr != '\0' ) + { + *sPtr = toupper ( ( unsigned char ) *sPtr ); + ++sPtr; + } +} + +int get_global_config(struct config *conf) +{ + int error, error2, error3; + char *value = NULL, *value2 = NULL, *value3 = NULL; + + if((error = uci_get_value(UCI_CPE_LOG_FILE_NAME,&value)) == CWMP_OK) + { + if(value != NULL) + { + log_set_log_file_name (value); + free(value); + value = NULL; + } + } + + if((error = uci_get_value(UCI_CPE_LOG_MAX_SIZE,&value)) == CWMP_OK) + { + if(value != NULL) + { + log_set_file_max_size(value); + free(value); + value = NULL; + } + } + + if((error = uci_get_value(UCI_CPE_ENABLE_STDOUT_LOG,&value)) == CWMP_OK) + { + if(value != NULL) + { + log_set_on_console(value); + free(value); + value = NULL; + } + } + + if((error = uci_get_value(UCI_CPE_ENABLE_FILE_LOG,&value)) == CWMP_OK) + { + if(value != NULL) + { + log_set_on_file(value); + free(value); + value = NULL; + } + } + + error = uci_get_value(UCI_DHCP_DISCOVERY_PATH,&value); + error2 = uci_get_state_value(UCI_ACS_URL_PATH,&value2); + error3 = uci_get_state_value(UCI_DHCP_ACS_URL_PATH,&value3); + + if ((((error == CWMP_OK) && (value != NULL) && (strcmp(value,"enable") == 0)) || + ((error2 == CWMP_OK) && ((value2 == NULL) || (value2[0] == 0)))) && + ((error3 == CWMP_OK) && (value3 != NULL) && (value3[0] != 0))) + { + if (conf->acsurl!=NULL) + { + free(conf->acsurl); + } + conf->acsurl = value3; + value3 = NULL; + } + else if ((error2 == CWMP_OK) && (value2 != NULL) && (value2[0] != 0)) + { + if (conf->acsurl!=NULL) + { + free(conf->acsurl); + } + conf->acsurl = value2; + value2 = NULL; + } + if (value!=NULL) + { + free(value); + value = NULL; + } + if (value2!=NULL) + { + free(value2); + value2 = NULL; + } + if (value3!=NULL) + { + free(value3); + value3 = NULL; + } + + if((error = uci_get_value(UCI_ACS_USERID_PATH,&value)) == CWMP_OK) + { + if(value != NULL) + { + if (conf->acs_userid!=NULL) + { + free(conf->acs_userid); + } + conf->acs_userid = value; + value = NULL; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_ACS_PASSWD_PATH,&value)) == CWMP_OK) + { + if(value != NULL) + { + if (conf->acs_passwd!=NULL) + { + free(conf->acs_passwd); + } + conf->acs_passwd = value; + value = NULL; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_CPE_USERID_PATH,&value)) == CWMP_OK) + { + if(value != NULL) + { + if (conf->cpe_userid!=NULL) + { + free(conf->cpe_userid); + } + conf->cpe_userid = value; + value = NULL; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_CPE_PASSWD_PATH,&value)) == CWMP_OK) + { + if(value != NULL) + { + if (conf->cpe_passwd!=NULL) + { + free(conf->cpe_passwd); + } + conf->cpe_passwd = value; + value = NULL; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_LOG_SEVERITY_PATH,&value)) == CWMP_OK) + { + if(value != NULL) + { + log_set_severity_idx (value); + free(value); + value = NULL; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_CPE_PORT_PATH,&value)) == CWMP_OK) + { + int a = 0; + + if(value != NULL) + { + a = atoi(value); + free(value); + value = NULL; + } + if(a==0) + { + CWMP_LOG(INFO,"Set the connection request port to the default value: %d",DEFAULT_CONNECTION_REQUEST_PORT); + conf->connection_request_port = DEFAULT_CONNECTION_REQUEST_PORT; + } + else + { + conf->connection_request_port = a; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_PERIODIC_INFORM_INTERVAL_PATH,&value)) == CWMP_OK) + { + int a = 0; + + if(value != NULL) + { + a = atoi(value); + free(value); + value = NULL; + } + if(a>=PERIOD_INFORM_MIN) + { + conf->period = a; + } + else + { + CWMP_LOG(ERROR,"Period interval of periodic inform should be > %ds. Set to default: %ds",PERIOD_INFORM_MIN,PERIOD_INFORM_DEFAULT); + conf->period = PERIOD_INFORM_DEFAULT; + } + } + else + { + return error; + } + if((error = uci_get_value(UCI_PERIODIC_INFORM_ENABLE_PATH,&value)) == CWMP_OK) + { + if(value != NULL) + { + uppercase(value); + if ((strcmp(value,"TRUE")==0) || (strcmp(value,"1")==0)) + { + conf->periodic_enable = TRUE; + } + else + { + conf->periodic_enable = FALSE; + } + free(value); + value = NULL; + } + else + { + conf->periodic_enable = FALSE; + } + } + else + { + return error; + } + + return CWMP_OK; +} + +int global_env_init (int argc, char** argv, struct env *env) +{ + int i,error=0; + + for (i=1;iboot = CWMP_START_BOOT; + break; + case 'g': + env->periodic = CWMP_START_PERIODIC; + break; + case 'c': + env->iccu = CWMP_START_ICCU; + break; + case 'v': + show_version(); + exit(EXIT_SUCCESS); + break; + case 'h': + show_help(); + exit(EXIT_SUCCESS); + break; + } + } + env->max_firmware_size = cwmp_check_flash_size(); + return CWMP_OK; +} + +int global_conf_init (struct config *conf) +{ + int error; + + if (error = get_global_config(conf)) + { + return error; + } + if (error = check_global_config(conf)) + { + return error; + } + return CWMP_OK; +} + +int save_acs_bkp_config(struct cwmp *cwmp) +{ + int error; + char *acsurl = NULL; + struct config *conf; + + conf = &(cwmp->conf); + error = cwmp_load_saved_session(cwmp, &acsurl, ACS); + if((acsurl == NULL)||(acsurl != NULL && strcmp(acsurl,conf->acsurl) != 0)) + { + backup_session_insert_acs(conf->acsurl); + if(acsurl != NULL) + { + free(acsurl); + } + } + return CWMP_OK; +} + +int cwmp_init(int argc, char** argv,struct cwmp *cwmp) +{ + int error; + struct env env; + memset(&env,0,sizeof(struct env)); + if(error = global_env_init (argc, argv, &env)) + { + return error; + } + memset(cwmp,0,sizeof(struct cwmp)); + memcpy(&(cwmp->env),&env,sizeof(struct env)); + INIT_LIST_HEAD(&(cwmp->head_session_queue)); + INIT_LIST_HEAD(&(cwmp->api_value_change.parameter_list)); + if(error = global_conf_init(&(cwmp->conf))) + { + return error; + } + return CWMP_OK; +} + +int cwmp_config_reload(struct cwmp *cwmp) +{ + int error; + memset(&cwmp->env,0,sizeof(struct env)); + memset(&cwmp->conf,0,sizeof(struct config)); + if(error = global_conf_init(&(cwmp->conf))) + { + return error; + } + return CWMP_OK; +} diff --git a/src/config/cwmp b/src/config/cwmp new file mode 100644 index 0000000..b3a601a --- /dev/null +++ b/src/config/cwmp @@ -0,0 +1,25 @@ +config 'cwmp' 'acs' + option 'url' 'http://192.168.1.238:8080/openacs/acs' + option 'userid' 'inteno' + option 'passwd' 'inteno' + option 'periodic_inform_enable' 'true' + option 'periodic_inform_interval' '1800' + option 'ParameterKey' '' + option 'dhcp_discovery' 'disable' + +config 'cwmp' 'cpe' + option 'log_to_console' 'disable' + option 'log_to_file' 'enable' + option 'log_severity' 'INFO' + option 'log_file_name' '/var/log/cwmpd.log' + option 'log_max_size' '102400' + option 'userid' 'cpeinteno' + option 'passwd' 'cpeinteno' + option 'port' '7547' + +config 'cwmp' 'dm' + list 'xml' '/etc/cwmpd/dm/tr098.xml' + +config 'cwmp' 'notification' + +config 'cwmp' 'accesslist' diff --git a/src/connectionRequest.c b/src/connectionRequest.c new file mode 100644 index 0000000..ef0e575 --- /dev/null +++ b/src/connectionRequest.c @@ -0,0 +1,135 @@ +/* + connectionRequest.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include "cwmp.h" +#include "httpda.h" + +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key); + +static bool get_connection_request = FALSE; + +void *thread_connection_request_listener (void *v) +{ + struct cwmp *cwmp = (struct cwmp *) v; + struct event_container *event_container; + struct soap soap; + SOAP_SOCKET m,s; + int port,valid_socket; + + port = cwmp->conf.connection_request_port; + soap_init(&soap); + soap_register_plugin(&soap, http_da); + + + soap.send_timeout = 30; + soap.recv_timeout = 30; + soap.accept_timeout = 864000; + + m = soap_bind(&soap, NULL, port, 100); + if (!soap_valid_socket(m)) + { + CWMP_LOG(ERROR,"Soap socket bind error in the connection request listener thread. Quit the thread!"); + soap_destroy(&soap); + soap_end(&soap); + soap_done(&soap); + return NULL; + } + CWMP_LOG(INFO,"Bind the connection request listener, port=%d.",port); + for (;;) + { + get_connection_request = FALSE; + s = soap_accept(&soap); + soap_valid_socket(s); + soap_serve(cwmp,&soap); + soap_closesock(&soap); + soap_end(&soap); + if (!get_connection_request) + { + continue; + } + CWMP_LOG(INFO,"Connection Request thread: add connection request event in the queue"); + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_6CONNECTION_REQUEST, ""); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + pthread_cond_signal(&(cwmp->threshold_session_send)); + } + soap_done(&soap); + return CWMP_OK; +} + +SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct cwmp *cwmp, struct soap *soap) +{ + char *userid,*passwd; + char *authrealm = "Inteno CWMP"; + + userid = cwmp->conf.cpe_userid; + passwd = cwmp->conf.cpe_passwd; + if (userid==NULL || passwd==NULL) + { + return soap->error=503; + } + if (soap->authrealm && soap->userid) + { + if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, userid)) + { + if (!http_da_verify_get(soap, passwd)) // HTTP POST DA verification + { + soap_end_send(soap); + get_connection_request = TRUE; + return SOAP_OK; + } + } + } + soap->authrealm = authrealm; // realm to send to client + return soap->error=401; // Not authorized, challenge with digest authentication +} + +SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct cwmp *cwmp, struct soap *soap) +{ + static int cr_request = 0; + static time_t restrict_start_time = 0; + time_t current_time; + + current_time = time(NULL); + if ((restrict_start_time==0) || ((current_time-restrict_start_time) > CONNECTION_REQUEST_RESTRICT_PERIOD)) + { + restrict_start_time = current_time; + cr_request = 1; + } + else + { + cr_request++; + if (cr_request>CONNECTION_REQUEST_RESTRICT_REQUEST) + { + restrict_start_time = current_time; + soap->error = 503; + return soap_send_fault(soap); + } + } + + soap_begin_recv(soap); + + if (soap_serve_request(cwmp,soap) || + soap_response(soap, SOAP_OK) || + soap_end_send(soap)) + { + return soap_send_fault(soap); + } + + return SOAP_OK; +} + diff --git a/src/cwmp.c b/src/cwmp.c new file mode 100644 index 0000000..f31b09f --- /dev/null +++ b/src/cwmp.c @@ -0,0 +1,684 @@ +/* + cwmp.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include "cwmp.h" +#include "backupSession.h" + +#define CWMP_DAEMON_MULTITHREAD 1/* TODO KMD need for debug*/ + +struct cwmp cwmp_main; +static pthread_mutex_t thread_sync_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t thread_sync_cond = PTHREAD_COND_INITIALIZER; +static bool thread_sync_wait = TRUE; + +struct rpc_acs *cwmp_add_session_rpc_acs_inform (struct session *session); +struct rpc_cpe *cwmp_soap_receive_rpc_cpe (struct cwmp *cwmp,struct session *session); +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key); +struct paramater_container *cwmp_add_parameter_container (struct cwmp *cwmp, struct event_container *event_container, char *name); +void backup_session_move_inform_to_inform_send (); +void backup_session_move_inform_to_inform_queue (); +void cwmp_save_event_container (struct cwmp *cwmp,struct event_container *event_container); +void *cwmp_schedule_session (void *v); +void *thread_event_periodic (void *v); +void *thread_connection_request_listener (void *v); +void *thread_cwmp_rpc_cpe_scheduleInform (void *v); +void *thread_cwmp_rpc_cpe_download (void *v); +void *thread_kernel_api_cwmp_value_change_parameters (void *v); +void *thread_lib_api_cwmp_value_change_parameters (void *v); + +struct rpc_acs *cwmp_add_session_rpc_acs (struct session *session) +{ + struct rpc_acs *rpc_acs; + + rpc_acs = calloc (1,sizeof(struct rpc_acs)); + if (rpc_acs==NULL) + { + return NULL; + } + list_add_tail (&(rpc_acs->list), &(session->head_rpc_acs)); + return rpc_acs; +} + +struct rpc_cpe *cwmp_add_session_rpc_cpe (struct session *session) +{ + struct rpc_cpe *rpc_cpe; + + rpc_cpe = calloc (1,sizeof(struct rpc_cpe)); + if (rpc_cpe==NULL) + { + return NULL; + } + list_add_tail (&(rpc_cpe->list), &(session->head_rpc_cpe)); + return rpc_cpe; +} + +struct rpc_acs *cwmp_add_session_rpc_acs_head (struct session *session) +{ + struct rpc_acs *rpc_acs; + + rpc_acs = calloc (1,sizeof(struct rpc_acs)); + if (rpc_acs==NULL) + { + return NULL; + } + list_add (&(rpc_acs->list), &(session->head_rpc_acs)); + return rpc_acs; +} + +int cwmp_session_rpc_cpe_destructor (struct cwmp *cwmp, struct session *session, struct rpc_cpe *rpc_cpe) +{ + if (rpc_cpe == NULL) + { + return CWMP_OK; + } + + if (rpc_cpe->method_data!=NULL) + { + free (rpc_cpe->method_data); + } + if (rpc_cpe->method_response_data!=NULL) + { + free (rpc_cpe->method_response_data); + } + list_del(&(rpc_cpe->list)); + free (rpc_cpe); + return CWMP_OK; +} + +int cwmp_get_retry_interval (struct cwmp *cwmp) +{ + switch (cwmp->retry_count_session) + { + case 0: return MAX_INT32; + case 1: return 6; + case 2: return 11; + case 3: return 21; + case 4: return 41; + case 5: return 81; + case 6: return 161; + case 7: return 321; + case 8: return 641; + case 9: return 1281; + default: return 2561; + } +} + +int cwmp_session_rpc_acs_destructor (struct cwmp *cwmp, struct session *session, struct rpc_acs *rpc_acs) +{ + if (rpc_acs == NULL) + { + return CWMP_OK; + } + + if (rpc_acs->method_data!=NULL) + { + free (rpc_acs->method_data); + } + if (rpc_acs->method_response_data!=NULL) + { + free (rpc_acs->method_response_data); + } + list_del(&(rpc_acs->list)); + free (rpc_acs); + return CWMP_OK; +} + +void thread_sync() +{ + pthread_mutex_lock(&thread_sync_mutex); + thread_sync_wait = FALSE; + pthread_cond_signal(&thread_sync_cond); + pthread_mutex_unlock(&thread_sync_mutex); +} + +void thread_wait_sync() +{ + pthread_mutex_lock(&thread_sync_mutex); + if(thread_sync_wait) + { + pthread_cond_wait(&thread_sync_cond,&thread_sync_mutex); + } + thread_sync_wait = TRUE; + pthread_mutex_unlock(&thread_sync_mutex); +} + +void *cwmp_schedule_session (void *v) +{ + struct list_head *ilist; + struct session *session; + int t,error = CWMP_OK; + static struct timespec time_to_wait = {0, 0}; + bool retry = FALSE; + struct cwmp *cwmp = (struct cwmp *) v; + + thread_sync(); + while (1) + { + pthread_mutex_lock (&(cwmp->mutex_session_send)); + ilist = (&(cwmp->head_session_queue))->next; + while ((ilist == &(cwmp->head_session_queue)) || retry) + { + t = cwmp_get_retry_interval(cwmp); + time_to_wait.tv_sec = time(NULL) + t; + CWMP_LOG(INFO,"Waiting the next session"); + pthread_cond_timedwait(&(cwmp->threshold_session_send), &(cwmp->mutex_session_send), &time_to_wait); + ilist = (&(cwmp->head_session_queue))->next; + retry = FALSE; + } + session = list_entry(ilist, struct session, list); + cwmp_prepare_session_to_session_send (cwmp,session); + if (error = cwmp_move_session_to_session_send (cwmp, session)) + { + CWMP_LOG(EMERG,"FATAL error in the mutex process in the session shceduler!"); + exit(EXIT_FAILURE); + } + error = cwmp_schedule_rpc (cwmp,session); + run_session_end_func(cwmp,&(session->head_session_end_func)); + if (session->error == CWMP_RETRY_SESSION) + { + error = cwmp_move_session_to_session_queue (cwmp, session); + CWMP_LOG(INFO,"Retry session, retry count = %d, retry in %ds",cwmp->retry_count_session,cwmp_get_retry_interval(cwmp)); + retry = TRUE; + pthread_mutex_unlock (&(cwmp->mutex_session_send)); + continue; + } + cwmp_session_destructor (cwmp, session); + cwmp->session_send = NULL; + cwmp->retry_count_session = 0; + pthread_mutex_unlock (&(cwmp->mutex_session_send)); +# if !CWMP_DAEMON_MULTITHREAD /* TODO KMD need for debug*/ + break; +#endif + } + return CWMP_OK; +} + +int cwmp_schedule_rpc (struct cwmp *cwmp, struct session *session) +{ + struct list_head *ilist; + struct rpc_acs *rpc_acs; + struct rpc_cpe *rpc_cpe; + int error=0,e; + + cwmp_session_soap_init(session); + + while (1) + { + session->error = CWMP_OK; + __list_for_each(ilist, &(session->head_rpc_acs)) + { + rpc_acs = list_entry (ilist, struct rpc_acs, list); + if (!(error = rpc_acs->method_data_init (cwmp, session, rpc_acs))) + { + rpc_acs->method_remote_call(cwmp, session, rpc_acs); + if (rpc_acs->error==CWMP_SUCCESS_RPC && session->error!=CWMP_RETRY_SESSION) + { + error = rpc_acs->method_response (cwmp, session, rpc_acs); + } + } + + if (e = rpc_acs->method_end (cwmp, session, rpc_acs)) + { + error = e; + } + + cwmp_session_soap_destroy_end (session); + if (error || session->error==CWMP_RETRY_SESSION) + { + session->error = CWMP_RETRY_SESSION; + goto end_rpc_sheculer; + } + ilist = ilist->prev; + if (error = rpc_acs->destructor (cwmp, session, rpc_acs)) + { + session->error = CWMP_RETRY_SESSION; + goto end_rpc_sheculer; + } + + if (session->hold_request) + { + break; + } + } + + while (1) + { + session->error = CWMP_OK; + cwmp_soap_send_http_empty (cwmp,session); + + if (session->error == CWMP_RETRY_SESSION) + { + goto end_rpc_sheculer; + } + session->error = CWMP_OK; + e = cwmp_soap_recv_http_empty (cwmp,session); + if (session->error == CWMP_RETRY_SESSION) + { + goto end_rpc_sheculer; + } + else if (e == CWMP_UNAUTHORIZED_401) + { + CWMP_LOG(INFO,"Receive http 401: need authentication"); + cwmp_session_soap_destroy_end (session); + continue; + } + else if (session->error == CWMP_CONTINUE_SESSION || + session->error == CWMP_SUCCESS_SESSION) + { + break; + } + session->error = CWMP_RETRY_SESSION; + goto end_rpc_sheculer; + } + if (session->error == CWMP_CONTINUE_SESSION) + { + while (1) + { + rpc_cpe = cwmp_soap_receive_rpc_cpe (cwmp, session); + if (rpc_cpe == NULL) + { + session->error = CWMP_RETRY_SESSION; + goto end_rpc_sheculer; + } + while (1) + { + if (!(error = rpc_cpe->method(cwmp, session, rpc_cpe))) + { + if (!(error = rpc_cpe->method_response_data_init(cwmp, session, rpc_cpe))) + { + while (1) + { + cwmp_session_soap_destroy_end (session); + if (error = rpc_cpe->method_response(cwmp, session, rpc_cpe)) + { + session->error = CWMP_RETRY_SESSION; + break; + } + session->error = CWMP_OK; + e = cwmp_soap_recv_http_empty (cwmp,session); + if (session->error == CWMP_RETRY_SESSION || + session->error == CWMP_CONTINUE_SESSION || + session->error == CWMP_SUCCESS_SESSION) + { + break; + } + else if (e == CWMP_UNAUTHORIZED_401) + { + CWMP_LOG(INFO,"Receive http 401: need authentication"); + continue; + } + session->error = CWMP_RETRY_SESSION; + break; + } + } + else if(error != CWMP_FAULT_CPE) + { + session->error = CWMP_RETRY_SESSION; + } + } + else if(error != CWMP_FAULT_CPE) + { + session->error = CWMP_RETRY_SESSION; + } + + if (rpc_cpe->method_end(cwmp, session, rpc_cpe) || + rpc_cpe->destructor(cwmp, session, rpc_cpe)) + { + session->error = CWMP_RETRY_SESSION; + } + + if (session->error == CWMP_RETRY_SESSION) + { + goto end_rpc_sheculer; + } + + ilist = session->head_rpc_cpe.next; + if (ilist == &(session->head_rpc_cpe)) + { + break; + } + rpc_cpe = list_entry(ilist, struct rpc_cpe, list); + } + if (session->error != CWMP_CONTINUE_SESSION) + { + break; + } + } + } + if (session->head_rpc_acs.next==&(session->head_rpc_acs)) + { + break; + } + } +end_rpc_sheculer: + cwmp_session_done(session); + return session->error; +} + +int cwmp_prepare_session_to_session_send (struct cwmp *cwmp, struct session *session) +{ + cwmp_root_cause_event_api_value_change (cwmp,session); + return CWMP_OK; +} + +int cwmp_move_session_to_session_send (struct cwmp *cwmp, struct session *session) +{ + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + if (cwmp->session_send != NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return cwmp->error = CWMP_MUTEX_ERR; + } + list_del (&(session->list)); + strcpy (session->acs_url, cwmp->conf.acsurl); + cwmp->session_send = session; + cwmp->head_event_container = NULL; + backup_session_move_inform_to_inform_send (); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_OK; +} + +int cwmp_move_session_to_session_queue (struct cwmp *cwmp, struct session *session) +{ + struct list_head *ilist,*jlist; + struct rpc_acs *rpc_acs,*queue_rpc_acs; + struct event_container *event_container_old, *event_container_new; + struct paramater_container *paramater_container_old, *paramater_container_new; + struct session *session_queue; + bool dup; + + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + cwmp->retry_count_session ++; + cwmp->session_send = NULL; + if (cwmp->head_session_queue.next == &(cwmp->head_session_queue)) + { + list_add_tail (&(session->list), &(cwmp->head_session_queue)); + session->hold_request = 0; + session->digest_auth = 0; + cwmp->head_event_container = &(session->head_event_container); + if (session->head_rpc_acs.next != &(session->head_rpc_acs)) + { + rpc_acs = list_entry(session->head_rpc_acs.next, struct rpc_acs, list); + if (rpc_acs->type != RPC_ACS_INFORM_IDX) + { + if (cwmp_add_session_rpc_acs_inform (session) == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + } + } + else + { + if (cwmp_add_session_rpc_acs_inform (session) == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + } + backup_session_move_inform_to_inform_queue (); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_OK; + } + __list_for_each(ilist, &(session->head_event_container)) + { + event_container_old = list_entry (ilist, struct event_container, list); + event_container_new = cwmp_add_event_container (cwmp, event_container_old->idx, event_container_old->event.CommandKey); + if (event_container_new == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + __list_for_each(jlist, &(event_container_old->head_paramater_container)) + { + paramater_container_old = list_entry(jlist,struct paramater_container, list); + paramater_container_new = cwmp_add_parameter_container (cwmp,event_container_new, paramater_container_old->paramater.Name); + } + cwmp_save_event_container (cwmp,event_container_new); + } + session_queue = list_entry(cwmp->head_event_container,struct session, head_event_container); + __list_for_each(ilist, &(session->head_rpc_acs)) + { + rpc_acs = list_entry(ilist, struct rpc_acs, list); + dup = FALSE; + __list_for_each(jlist, &(session_queue->head_rpc_acs)) + { + queue_rpc_acs = list_entry(jlist, struct rpc_acs, list); + if (queue_rpc_acs->type == rpc_acs->type && + (rpc_acs->type == RPC_ACS_INFORM_IDX || + rpc_acs->type == RPC_ACS_GETRPCMETHODS_IDX)) + { + dup = TRUE; + break; + } + } + if (dup) + { + continue; + } + ilist = ilist->prev; + list_del(&(rpc_acs->list)); + list_add_tail (&(rpc_acs->list), &(session_queue->head_rpc_acs)); + } + cwmp_session_destructor (cwmp, session); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_OK; +} + +int cwmp_session_destructor (struct cwmp *cwmp, struct session *session) +{ + struct rpc_acs *rpc_acs; + struct rpc_cpe *rpc_cpe; + struct session_end_func *session_end_func; + + while (session->head_rpc_acs.next != &(session->head_rpc_acs)) + { + rpc_acs = list_entry(session->head_rpc_acs.next, struct rpc_acs, list); + rpc_acs->destructor (cwmp, session, rpc_acs); + } + while (session->head_rpc_cpe.next != &(session->head_rpc_cpe)) + { + rpc_cpe = list_entry(session->head_rpc_cpe.next, struct rpc_cpe, list); + rpc_cpe->destructor (cwmp, session, rpc_cpe); + } + while (session->head_session_end_func.next != &(session->head_session_end_func)) + { + session_end_func = list_entry(session->head_session_end_func.next, struct session_end_func, list); + list_del (&(session_end_func->list)); + free (session_end_func); + } + if (session->list.next != LIST_POISON1 && session->list.prev != LIST_POISON2) + { + list_del (&(session->list)); + } + free (session); + + return CWMP_OK; +} + +struct session *cwmp_add_queue_session (struct cwmp *cwmp) +{ + struct session *session; + + session = calloc (1,sizeof(struct session)); + if (session==NULL) + { + return NULL; + } + list_add_tail (&(session->list), &(cwmp->head_session_queue)); + INIT_LIST_HEAD (&(session->head_event_container)); + INIT_LIST_HEAD (&(session->head_session_end_func)); + INIT_LIST_HEAD (&(session->head_rpc_acs)); + INIT_LIST_HEAD (&(session->head_rpc_cpe)); + if (cwmp_add_session_rpc_acs_inform (session) == NULL) + { + free (session); + return NULL; + } + + return session; +} + +int add_session_end_func (struct session *session, int (*func)(struct cwmp *cwmp, void *input),void *input, bool end) +{ + struct session_end_func *session_end_func; + struct list_head *ilist; + + __list_for_each(ilist,&(session->head_session_end_func)) + { + session_end_func = list_entry(ilist, struct session_end_func, list); + if ((session_end_func->func==func) && + (session_end_func->input==input)) + { + return CWMP_OK; + } + } + + session_end_func = calloc(1,sizeof(struct session_end_func)); + session_end_func->func = func; + session_end_func->input = input; + + if (end==TRUE) + { + list_add_tail(&(session_end_func->list),&(session->head_session_end_func)); + } + else + { + list_add(&(session_end_func->list),&(session->head_session_end_func)); + } + return CWMP_OK; +} +int run_session_end_func (struct cwmp *cwmp, struct list_head *head_func) +{ + struct list_head *ilist; + struct session_end_func *session_end_func; + int error = CWMP_OK; + __list_for_each(ilist,head_func) + { + session_end_func = list_entry(ilist, struct session_end_func, list); + error = session_end_func->func(cwmp,session_end_func->input); + ilist = ilist->prev; + list_del(&(session_end_func->list)); + free (session_end_func); + } + return error; +} + +int cwmp_apply_acs_changes (struct cwmp *cwmp) +{ + int error; + if (error = cwmp_config_reload(cwmp)) + { + return error; + } + if (error = cwmp_root_cause_events(cwmp)) + { + return error; + } + return CWMP_OK; +} + +int main(int argc, char **argv) +{ + + struct cwmp *cwmp = &cwmp_main; + int error; + pthread_t session_scheduler_thread; + pthread_t periodic_event_thread; + pthread_t connection_request_thread; + pthread_t scheduleInform_thread; + pthread_t download_thread; + pthread_t kernel_value_change_thread; + pthread_t lib_value_change_thread; + + if (error = cwmp_init(argc, argv, cwmp)) + { + return error; + } + CWMP_LOG(INFO,"STARTING CWMP"); + + if (error = load_dm_list(UCI_DM_XML_FILE_LIST)) + { + return error; + } + + if (error = cwmp_load_saved_session(cwmp, NULL, ALL)) + { + return error; + } + + if (error = cwmp_root_cause_events(cwmp)) + { + return error; + } +# if !CWMP_DAEMON_MULTITHREAD /* TODO KMD need for debug*/ + + cwmp_schedule_session(cwmp); + +#else + error = pthread_create(&session_scheduler_thread, NULL, &cwmp_schedule_session, (void *)cwmp); + if (error<0) + { + CWMP_LOG(EMERG,"FATAL error when creating the session scheduler thread!"); + exit(EXIT_FAILURE); + } + + error = pthread_create(&periodic_event_thread, NULL, &thread_event_periodic, (void *)cwmp); + if (error<0) + { + CWMP_LOG(ERROR,"Error error when creating the periodic event thread!"); + } + error = pthread_create(&connection_request_thread, NULL, &thread_connection_request_listener, (void *)cwmp); + if (error<0) + { + CWMP_LOG(ERROR,"Error when creating the connection request thread!"); + } + error = pthread_create(&scheduleInform_thread, NULL, &thread_cwmp_rpc_cpe_scheduleInform, (void *)cwmp); + if (error<0) + { + CWMP_LOG(ERROR,"Error when creating the scheduled inform thread!"); + } + thread_wait_sync(); + error = pthread_create(&download_thread, NULL, &thread_cwmp_rpc_cpe_download, (void *)cwmp); + if (error<0) + { + CWMP_LOG(ERROR,"Error when creating the download thread!"); + } + error = pthread_create(&kernel_value_change_thread, NULL, &thread_kernel_api_cwmp_value_change_parameters, NULL); + if (error<0) + { + CWMP_LOG(ERROR,"Error when creating the kernel value change thread!"); + } + error = pthread_create(&lib_value_change_thread, NULL, &thread_lib_api_cwmp_value_change_parameters, NULL); + if (error<0) + { + CWMP_LOG(ERROR,"Error when creating the lib/cli value change thread!"); + } + pthread_join(session_scheduler_thread, NULL); + pthread_join(periodic_event_thread, NULL); + pthread_join(connection_request_thread, NULL); + pthread_join(scheduleInform_thread, NULL); + pthread_join(download_thread, NULL); + pthread_join(kernel_value_change_thread, NULL); + pthread_join(lib_value_change_thread, NULL); +#endif + + CWMP_LOG(INFO,"EXIT CWMP"); + return CWMP_OK; +} diff --git a/src/cwmp_api.c b/src/cwmp_api.c new file mode 100644 index 0000000..a993abb --- /dev/null +++ b/src/cwmp_api.c @@ -0,0 +1,287 @@ +/* + cwmp.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include +#include +#include +#include +#include "soapH.h" +#include "cwmp.h" +#include "dm.h" +#include "dm_rpc.h" +#include "cwmp_kernel.h" +#include "cwmp_lib.h" + +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key); + +extern struct cwmp cwmp_main; + +struct api_value_change_thread_input { + struct cwmp *cwmp; + char *path; + struct sub_path *sub_path; + int sub_path_size; +}; + +void *thread_api_cwmp_value_change_parameters (void *v) +{ + struct api_value_change_thread_input *t_input; + struct cwmp *cwmp; + struct event_container *event_container; + int error,i,n=0; + bool is_actif; + + + t_input = (struct api_value_change_thread_input *)v; + cwmp = t_input->cwmp; + pthread_mutex_lock (&(cwmp->api_value_change.mutex)); + error = cwmp_dm_getParameterPaths_by_correspondence(cwmp,t_input->path,t_input->sub_path,t_input->sub_path_size,&(cwmp->api_value_change.parameter_list),&n,FALSE,TRUE,&is_actif); + cwmp->api_value_change.parameter_size += n; + + if (error==FAULT_CPE_NO_FAULT_IDX && is_actif) + { + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_4VALUE_CHANGE, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return NULL; + } + cwmp_save_event_container (cwmp,event_container); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + pthread_cond_signal(&(cwmp->threshold_session_send)); + } + + for (i=0;isub_path_size;i++) + { + if (t_input->sub_path[i].dm_indice.indice!=NULL) + { + free(t_input->sub_path[i].dm_indice.indice); + } + } + free(t_input->sub_path); + if (t_input->path!=NULL) + { + free(t_input->path); + } + + free(t_input); + pthread_mutex_unlock (&(cwmp->api_value_change.mutex)); + return NULL; +} + +int api_cwmp_value_change_parameters (int argc, char **argv) +{ + struct cwmp *cwmp = &cwmp_main; + struct api_value_change_thread_input *t_input; + va_list args; + pthread_t thread; + int error; + + if (argc < 1) + { + return CWMP_OK; + } + t_input = calloc (1,sizeof(struct api_value_change_thread_input)); + t_input->sub_path = calloc (DM_MAX_INDICE,sizeof(struct sub_path)); + t_input->cwmp = cwmp; + cwmp_dm_get_sub_indice_path(argc,argv,&(t_input->path),t_input->sub_path,&(t_input->sub_path_size)); + + error = pthread_create(&thread, NULL, &thread_api_cwmp_value_change_parameters, (void *)t_input); + if (error<0) + { + free (t_input->sub_path); + free (t_input); + CWMP_LOG(ERROR,"Error when creating a value change api thread!"); + } + return CWMP_OK; +} + + +/* kernel api */ + +void *thread_kernel_api_cwmp_value_change_parameters (void *v) +{ + int i, argc, sock_fd; + char **argv; + struct sockaddr_nl src_addr, dest_addr; + struct nlmsghdr *nlh = NULL; + struct iovec iov; + struct msghdr msg; + + + sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER); + if(sock_fd<0) + { + CWMP_LOG(ERROR,"Error when creating NetLink socket to kernel: Quit kernel value change thread!"); + return NULL; + } + + memset(&src_addr, 0, sizeof(src_addr)); + src_addr.nl_family = AF_NETLINK; + src_addr.nl_pid = getpid(); + bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); + + memset(&dest_addr, 0, sizeof(dest_addr)); + dest_addr.nl_family = AF_NETLINK; + dest_addr.nl_pid = 0; /* For Linux Kernel */ + dest_addr.nl_groups = 0; /* unicast */ + + nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(NETLINK_MAX_PAYLOAD)); + + + argv = calloc ((DM_MAX_INDICE+1),sizeof(char *)); + + while (1) + { + memset(nlh, 0, NLMSG_SPACE(NETLINK_MAX_PAYLOAD)); + nlh->nlmsg_len = NLMSG_SPACE(NETLINK_MAX_PAYLOAD); + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_flags = 0; + + iov.iov_base = (void *)nlh; + iov.iov_len = nlh->nlmsg_len; + msg.msg_name = (void *)&dest_addr; + msg.msg_namelen = sizeof(dest_addr); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + strcpy(NLMSG_DATA(nlh), NETLINK_CWMP_ID); + sendmsg(sock_fd,&msg,0); + argc = 0; + while (argc<(DM_MAX_INDICE+1)) + { + + memset(nlh, 0, NLMSG_SPACE(NETLINK_MAX_PAYLOAD)); + nlh->nlmsg_len = NLMSG_SPACE(NETLINK_MAX_PAYLOAD); + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_flags = 0; + + iov.iov_base = (void *)nlh; + iov.iov_len = nlh->nlmsg_len; + msg.msg_name = (void *)&dest_addr; + msg.msg_namelen = sizeof(dest_addr); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + /* Read message from kernel */ + recvmsg(sock_fd, &msg, 0); + if (strcmp(NLMSG_DATA(nlh),NETLINK_END_DATA)==0) + { + break; + } + if (strcmp(NLMSG_DATA(nlh),NETLINK_NULL)==0) + { + argv[argc] = NULL; + } + else + { + argv[argc] = strdup (NLMSG_DATA(nlh)); + } + + argc++; + } + CWMP_LOG(INFO,"Receive Parameter Value change from Kernel space"); + api_cwmp_value_change_parameters(argc,argv); + for (i=0;i +#include +#include +#include +#include +#include "cwmp_lib.h" + +int lib_api_cwmp_value_change_call (int count, ...) +{ + FILE *fp; + register int i, s, len; + struct sockaddr_un saun; + va_list args; + char *str,buf[256]; + + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + { + printf("[CWMP] Error when creating process from other process: Quit\r\n"); + return 1; + } + + saun.sun_family = AF_UNIX; + strcpy(saun.sun_path, AF_UNIX_ADDRESS); + + len = sizeof(saun.sun_family) + strlen(saun.sun_path); + + if (connect(s, (struct sockaddr *) &saun, len) < 0) + { + printf("[CWMP] Error when creating socket from other process: Quit\r\n"); + return 1; + } + + va_start(args, count); + for (i=0;i +#include +#include +#include +#include +#include "cwmp_lib.h" + +int main (int argc, char **argv) +{ + FILE *fp; + register int i, s, len; + struct sockaddr_un saun; + char buf[256]; + + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + { + printf("[CWMP] Error when creating process from api CLI: Quit\r\n"); + return 1; + } + + saun.sun_family = AF_UNIX; + strcpy(saun.sun_path, AF_UNIX_ADDRESS); + + len = sizeof(saun.sun_family) + strlen(saun.sun_path); + + if (connect(s, (const struct sockaddr *) &saun, len) < 0) + { + printf("[CWMP] Error when creating socket from api CLI: Quit\r\n"); + return 1; + } + printf("[CWMP] Send Value change to the cwmp client from api CLI\r\n"); + for (i=1;i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include +#include + +LIST_HEAD(head_dm_tree); +LIST_HEAD(parameter_handler_list); +LIST_HEAD(object_handler_list); +LIST_HEAD(forced_inform_parameter_list); +static int Depth; +static char last_content[512]; +static char *last_object_name = NULL; +static char *last_tag_name = NULL; +static struct dm_node *node; +static struct dm_node *current_object; +static struct list_data_handler *tmp_handler = NULL; +static struct forced_inform_parameter *forced_inform_parameter = NULL; + +char *TYPE_VALUES_ARRAY [] = +{ + [TYPE_VALUE_string_IDX] = "xsd:string", + [TYPE_VALUE_int_IDX] = "xsd:int", + [TYPE_VALUE_unsignedInt_IDX] = "xsd:unsignedInt", + [TYPE_VALUE_boolean_IDX] = "xsd:boolean", + [TYPE_VALUE_dateTime_IDX] = "xsd:dateTime", + [TYPE_VALUE_base64Binary_IDX] = "xsd:base64Binary", + [TYPE_VALUE_integer_IDX] = "xsd:integer", + [TYPE_VALUE_unsignedByte_IDX] = "xsd:unsignedByte", + [TYPE_VALUE_unsignedLong_IDX] = "xsd:unsignedLong", + [TYPE_VALUE_unsignedShort_IDX] = "xsd:unsignedShort", + [TYPE_VALUE_anyURI_IDX] = "xsd:anyURI", + [TYPE_VALUE_byte_IDX] = "xsd:byte", + [TYPE_VALUE_date_IDX] = "xsd:date", + [TYPE_VALUE_time_IDX] = "xsd:time", + [TYPE_VALUE_decimal_IDX] = "xsd:decimal", + [TYPE_VALUE_double_IDX] = "xsd:double", + [TYPE_VALUE_duration_IDX] = "xsd:duration", + [TYPE_VALUE_ENTITIES_IDX] = "xsd:ENTITIES", + [TYPE_VALUE_ENTITY_IDX] = "xsd:ENTITY", + [TYPE_VALUE_float_IDX] = "xsd:float", + [TYPE_VALUE_gDay_IDX] = "xsd:gDay", + [TYPE_VALUE_gMonth_IDX] = "xsd:gMonth", + [TYPE_VALUE_gMonthDay_IDX] = "xsd:gMonthDay", + [TYPE_VALUE_gYear_IDX] = "xsd:gYear", + [TYPE_VALUE_gYearMonth_IDX] = "xsd:gYearMonth", + [TYPE_VALUE_hexBinary_IDX] = "xsd:hexBinary", + [TYPE_VALUE_ID_IDX] = "xsd:ID", + [TYPE_VALUE_IDREF_IDX] = "xsd:IDREF", + [TYPE_VALUE_IDREFS_IDX] = "xsd:IDREFS", + [TYPE_VALUE_language_IDX] = "xsd:language", + [TYPE_VALUE_long_IDX] = "xsd:long", + [TYPE_VALUE_Name_IDX] = "xsd:Name", + [TYPE_VALUE_NCName_IDX] = "xsd:NCName", + [TYPE_VALUE_negativeInteger_IDX] = "xsd:negativeInteger", + [TYPE_VALUE_NMTOKEN_IDX] = "xsd:NMTOKEN", + [TYPE_VALUE_NMTOKENS_IDX] = "xsd:NMTOKENS", + [TYPE_VALUE_nonNegativeInteger_IDX] = "xsd:nonNegativeInteger", + [TYPE_VALUE_nonPositiveInteger_IDX] = "xsd:nonPositiveInteger", + [TYPE_VALUE_normalizedString_IDX] = "xsd:normalizedString", + [TYPE_VALUE_NOTATION_IDX] = "xsd:NOTATION", + [TYPE_VALUE_positiveInteger_IDX] = "xsd:positiveInteger", + [TYPE_VALUE_QName_IDX] = "xsd:QName", + [TYPE_VALUE_short_IDX] = "xsd:short", + [TYPE_VALUE_token_IDX] = "xsd:token" +}; + +int dm_get_csv_data(char *data, int ns, char ***T) +{ + char **s, *p, *t, *pch; + s = calloc (ns,sizeof(char *)); + assert (s); + *T = s; + p = strdup (data); + t = p; + pch = strtok (p,","); + while (pch != NULL) + { + *s = strdup(pch); + s++; + pch = strtok (NULL, ","); + } + free(t); + return DM_OK; +} + +int dm_get_xml_map (char *data, struct dm_map *dm_map) +{ + + char **T, *p, *pch, *t, *t2; + unsigned short i,n=0; + + p = strdup(data); + t = p; + while (t=strchr(t+1,',')) + { + n++; + } + if (n>0) n++; + T = calloc(n,sizeof(char *)); + assert(T); + dm_map->size = n; + dm_map->map = T; + t = p; + pch = strtok (p,","); + while (pch != NULL) + { + *T = strdup(pch); + T++; + pch = strtok (NULL, ","); + } + free(t); + return DM_OK; +} + +int dm_get_xml_data (char *data, struct dm_data *dm_data) +{ + + char ***T, *p, *pch, *t, *s; + unsigned short i,ns=0,nT=0; + + if (data==NULL||data[0]==0) + { + return DM_OK; + } + + p = strdup(data); + t = p; + + while (t=strchr(t+1,';')) + { + nT++; + } + nT++; + t = p; + dm_data->line_size = nT; + T = calloc(nT,sizeof(char **)); + assert (T); + dm_data->data = T; + pch = strtok (p,";"); + for (i=0;icolumn_size = ns; + } + dm_get_csv_data (pch,ns,T); + pch = strtok (pch+strlen(pch)+1, ";"); + } + free(t); + return DM_OK; +} + +int dm_get_system_data_array(char *cmd, struct dm_data *dm_data) +{ + + char ***T, **buf[256], *p, *t; + unsigned short i,ns=0,nT=0; + FILE *fp; + char line[256]; + char error; + fd_set set; + struct timeval timeout; + + FD_ZERO(&set); + timeout.tv_sec = SYSTEM_CMD_TIMEOUT; + + fp=popen(cmd,"r"); + if (fp==NULL) + { + return DM_ERR; + } + FD_SET(fileno(fp), &set); + if (select(FD_SETSIZE, &set, NULL, NULL, &timeout)!=1) + { + fp=popen("\n","r"); + pclose(fp); + return DM_ERR; + } + line[0] = 0; + while(fgets(line,sizeof(line),fp)) + { + t = line; + t = strtok(t,"\r\n"); + if(line[0]==0) + { + continue; + } + if (ns==0) + { + while (t=strchr(t+1,',')) + { + ns++; + } + ns++; + dm_data->column_size = ns; + } + dm_get_csv_data (line,ns,&buf[nT]); + nT++; + line[0] = 0; + } + error = pclose(fp); + if (nT!=0) + { + T = calloc(nT,sizeof(char **)); + assert (T); + dm_data->data = T; + dm_data->line_size = nT; + memcpy(T,buf,nT*sizeof(char **)); + } + + if(error == 0) + { + return DM_OK; + } + else + { + return DM_ERR; + } +} +int dm_free_data_array(struct dm_data *dm_data) +{ + char ***T,**s; + unsigned short nT,ns,i,j; + if(dm_data==NULL) + { + return DM_OK; + } + T = dm_data->data; + nT = dm_data->line_size; + ns = dm_data->column_size; + if (T==NULL) + { + return DM_OK; + } + for (i=0;idata); + free(dm_data); + return DM_OK; +} + +int dm_get_system_data(char *cmd, char **ret) +{ + + FILE *fp; + int size=8191; + char buffer[8192]; + int error; + fd_set set; + struct timeval timeout; + + FD_ZERO(&set); + timeout.tv_sec = SYSTEM_CMD_TIMEOUT; + + buffer[0]=0; + fp=popen(cmd,"r"); + if (fp==NULL) + { + return DM_ERR; + } + FD_SET(fileno(fp), &set); + if (select(FD_SETSIZE, &set, NULL, NULL, &timeout)!=1) + { + fp=popen("\n","r"); + pclose(fp); + return DM_ERR; + } + size = fread (buffer,1,size,fp); + if (size>1 && (buffer[size-2]=='\r' || buffer[size-2]=='\n')) + { + buffer[size-2]=0; + } + else if (size>0 && (buffer[size-1]=='\r' || buffer[size-1]=='\n')) + { + buffer[size-1]=0; + } + else + { + buffer[size]=0; + } + *ret = strdup(buffer); + error = pclose(fp); + + if(error == 0) + { + return DM_OK; + } + else + { + return DM_ERR; + } +} +int dm_call_system_cmd(char *cmd) +{ + + FILE *fp; + int error; + + fp=popen(cmd,"r"); + if (fp==NULL) + { + return DM_ERR; + } + error = pclose(fp); + + if(error == 0) + { + return DM_OK; + } + else + { + return DM_ERR; + } +} + + +long int get_xml_file_size(FILE *pFile) +{ + long int size; + + if(pFile!=NULL) + { + fseek (pFile, 0, SEEK_END); + + size = ftell (pFile); + rewind(pFile); + return size; + } + return 0; +} + +int dm_add_node(struct dm_node *node) +{ + struct list_head *ilist; + struct list_head *jlist; + char *path = NULL; + char object_name[512]; + struct dm_node *inode = NULL; + struct dm_node *jnode = NULL; + int error = DM_OK; + int size; + + if(last_object_name == NULL) + { + return DM_GEN_ERR; + } + if(node->type == DM_OBJECT) + { + size = strlen(last_object_name); + strcpy(object_name,last_object_name); + object_name[size] = '\0'; + } + else + { + size = strlen(last_object_name) + strlen(node->name); + strcpy(object_name,last_object_name); + strcat(object_name,node->name); + object_name[size] = '\0'; + } + path = object_name; + path = strtok (path,"."); + if(head_dm_tree.next != &head_dm_tree) + { + __list_for_each(ilist, &(head_dm_tree)) + { + inode = (struct dm_node *) list_entry (ilist, struct dm_node, list); + + if((inode != NULL)&&((inode->type == DM_OBJECT)||(inode->type == DM_INSTANCE))&&(strcmp(inode->name,path) == 0)) + { + do + { + path = strtok (NULL, "."); + if((path != NULL)&&(strcmp(path,"{i}") == 0)) + { + path = strtok (NULL, "."); + } + if(path == NULL) + { + return DM_GEN_ERR; + } + + __list_for_each(jlist, &(inode->head_child)) + { + jnode = (struct dm_node *) list_entry (jlist, struct dm_node, list); + + if((jnode != NULL)&&((jnode->type == DM_OBJECT)||(jnode->type == DM_INSTANCE))&&(strcmp(path,jnode->name) == 0)) + { + inode = jnode; + break; + } + } + } + while((jnode != NULL)&&(strcmp(path,jnode->name) == 0)); + + if((inode->type == DM_OBJECT)||(inode->type == DM_INSTANCE)) + { + list_add_tail(&(node->list), &(inode->head_child)); + } + if((path != NULL)&&(node->type == DM_OBJECT)) + { + node->name = strdup(path); + } + goto finally; + } + } + list_add_tail(&(node->list), &(head_dm_tree)); + if((path != NULL)&&(node->type == DM_OBJECT)) + { + node->name = strdup(path); + } + } + else + { + list_add_tail(&(node->list), &(head_dm_tree)); + if((path != NULL)&&(node->type == DM_OBJECT)) + { + node->name = strdup(path); + } + } + +finally: + if(path != NULL) + { + path = strtok (NULL, "."); + if(path != NULL) + { + if((node->type == DM_OBJECT)&&(strcmp(path,"{i}") == 0)) + { + node->type = DM_INSTANCE; + } + else + { + error = DM_GEN_ERR; + } + } + } + else + { + error = DM_GEN_ERR; + } + return error; +} + +int dm_free_node (struct dm_node *node) +{ + char *pstruct_dm_regexp; + char *pstruct_dm_string; + char *pstruct_dm_debug; + char *pstruct_dm_default_value; + struct dm_uci *pstruct_dm_uci; + struct dm_system *pstruct_dm_system; + struct dm_correspondence *pstruct_dm_correspondence; + struct data_handler **data_handler; + char **dm_map,**el; + char ***dm_data; + int k; + unsigned short i,j; + + if(node != NULL) + { + + if(node->name != NULL) + { + free(node->name); + } + for(i=0; isize_data_handler; i++) + { + if(data_handler[i] != NULL) + { + switch(data_handler[i]->type) + { + case DM_CORRESPONDENCE: + pstruct_dm_correspondence = (struct dm_correspondence *)data_handler[i]->handler; + if(pstruct_dm_correspondence != NULL) + { + if(pstruct_dm_correspondence->dm_data != NULL) + { + dm_data = pstruct_dm_correspondence->dm_data->data; + for (j=0;jdm_data->line_size;j++) + { + for (j=0;jdm_data->column_size;j++) + { + el = *dm_data; + if(*el != NULL) + { + free(*el); + } + el++; + } + } + free(pstruct_dm_correspondence->dm_data); + } + if(pstruct_dm_correspondence->dm_map != NULL) + { + dm_map = pstruct_dm_correspondence->dm_map->map; + for (j=0;jdm_map->size;j++) + { + if(dm_map[j] != NULL) + { + free(dm_map[j]); + } + } + free(pstruct_dm_correspondence->dm_map); + } + free(pstruct_dm_correspondence); + } + break; + case DM_SYSTEM: + pstruct_dm_system = (struct dm_system *)data_handler[i]->handler; + if(pstruct_dm_system != NULL) + { + if(pstruct_dm_system->cmd != NULL) + { + free(pstruct_dm_system->cmd); + } + if(pstruct_dm_system->dm_map != NULL) + { + dm_map = pstruct_dm_system->dm_map->map; + for (j=0;jdm_map->size;j++) + { + if(dm_map[j] != NULL) + { + free(dm_map[j]); + } + } + free(pstruct_dm_system->dm_map); + } + free(pstruct_dm_system); + } + break; + case DM_UCI: + pstruct_dm_uci = (struct dm_uci *)data_handler[i]->handler; + if(pstruct_dm_uci != NULL) + { + if(pstruct_dm_uci->cmd != NULL) + { + free(pstruct_dm_uci->cmd); + } + free(pstruct_dm_uci); + } + break; + case DM_DEBUG: + pstruct_dm_debug = (char *)data_handler[i]->handler; + if(pstruct_dm_debug != NULL) + { + free(pstruct_dm_debug); + } + break; + case DM_STRING: + pstruct_dm_string = (char *)data_handler[i]->handler; + if(pstruct_dm_string != NULL) + { + free(pstruct_dm_string); + } + break; + case DM_DEFAULT_VALUE: + pstruct_dm_default_value = (char *)data_handler[i]->handler; + if(pstruct_dm_default_value != NULL) + { + free(pstruct_dm_default_value); + } + break; + case DM_REGEXP: + pstruct_dm_regexp = (char *)data_handler[i]->handler; + if(pstruct_dm_regexp != NULL) + { + free(pstruct_dm_regexp); + } + break; + } + } + free(data_handler[i]); + } + free(node); + } + return DM_OK; +} + +int dm_get_handler(struct dm_node *node,struct list_head *list) +{ + bool contain_get = FALSE; + struct dm_system *pstruct_dm_system; + struct data_handler **data_handler; + struct list_data_handler *idata_handler; + char name[512]; + struct dm_node *tmp_dm_head; + + if(!list_empty(list)) + { + data_handler = calloc(node->size_data_handler,sizeof(struct data_handler*)); + node->data_handler = data_handler; + } + while(!list_empty(list)) + { + idata_handler = list_entry (list->next, struct list_data_handler, list); + + if(idata_handler != NULL) + { + *data_handler = idata_handler->data_handler; + switch(idata_handler->data_handler->type) + { + case DM_SYSTEM: + pstruct_dm_system = (struct dm_system *)idata_handler->data_handler->handler; + switch(pstruct_dm_system->type) + { + case DM_GET: + contain_get = TRUE; + break; + case DM_SET: + break; + case DM_APPLY: + break; + } + break; + case DM_UCI: + contain_get = TRUE; + break; + case DM_STRING: + contain_get = TRUE; + break; + case DM_DEFAULT_VALUE: + contain_get = TRUE; + break; + } + data_handler++; + list_del(list->next); + if(idata_handler != NULL) + { + free(idata_handler); + idata_handler = NULL; + } + } + } + if(node->type == DM_PARAMETER) + { + if((node->size_data_handler == 0) || (contain_get == FALSE)) + { + DM_LOG(DEBUG,"PARAMETER:loading:NO :%s%s",last_object_name,node->name); + if(forced_inform_parameter != NULL) + { + if(forced_inform_parameter->name != NULL) + { + free(forced_inform_parameter->name); + } + free(forced_inform_parameter); + forced_inform_parameter = NULL; + } + dm_free_node(node); + } + else + { + dm_add_node(node); + if(forced_inform_parameter != NULL) + { + list_add_tail(&(forced_inform_parameter->list),&(forced_inform_parameter_list)); + } + name[0] = 0; + while(!list_empty(&head_dm_tree)) + { + tmp_dm_head = (struct dm_node *) list_entry (head_dm_tree.next, struct dm_node, list); + if(strstr(last_object_name,tmp_dm_head->name) != NULL) + { + break; + } + } + if(node->active_notify.force_default_enabled) + { + sprintf(name,"%s%s",last_object_name,node->name); + if(cwmp_check_notification(name,UCI_NOTIFICATION_PASSIVE_PATH) == CWMP_OK && + cwmp_check_notification(name,UCI_NOTIFICATION_DENIED_PATH) == CWMP_OK) + { + cwmp_apply_active_notification(node,name, xsd__boolean__true_); + } + tmp_dm_head->active_notify.force_default_enabled = TRUE; + } + if(node->active_notify.force_enabled) + { + sprintf(name,"%s%s",last_object_name,node->name); + cwmp_apply_active_notification(node,name, xsd__boolean__true_); + tmp_dm_head->active_notify.force_enabled = TRUE; + } + if(node->active_notify.can_deny) + { + tmp_dm_head->active_notify.can_deny = TRUE; + } + DM_LOG(DEBUG,"PARAMETER:loading:YES:%s%s",last_object_name,node->name); + } + } + return DM_OK; +} + +void start_hndl(void *data, const char *el, const char **attr) +{ + int i,j,type_idx = 0; + struct data_handler **data_handler; + struct list_data_handler *idata_handler; + struct list_head *ilist; + struct dm_uci *pstruct_dm_uci; + struct dm_system *pstruct_dm_system; + char forced_inform_name[256]; + + if((last_object_name == NULL) && + ((strcmp(el,"parameter") == 0) || + (strcmp(el,"system") == 0) || + (strcmp(el,"uci") ==0) || +#ifdef WITH_DM_XML_DEBUG + (strcmp(el,"debug") == 0) || +#endif + (strcmp(el,"correspondence") == 0) || + (strcmp(el,"string") == 0))) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + if((strcmp(el,"object") == 0)||(strcmp(el,"parameter") == 0)) + { + if(strcmp(el,"object") == 0) + { + node = calloc(1,sizeof(struct dm_node)); + INIT_LIST_HEAD(&(node->head_child)); + current_object = node; + } + if(strcmp(el,"parameter") == 0) + { + node = (struct dm_node *) calloc(1,sizeof(struct dm_node_leaf)); + } + node->size_data_handler = 0; + for (i = 0; attr[i]; i += 2) + { + if(strcmp(attr[i],"name") == 0) + { + if(strcmp(el,"object") == 0) + { + last_object_name = strdup(attr[i + 1]); + node->name = NULL; + node->type = DM_OBJECT; + } + if(strcmp(el,"parameter") == 0) + { + node->name = strdup(attr[i + 1]); + node->type = DM_PARAMETER; + } + } + if(strcmp(attr[i],"access") == 0) + { + if(strcmp(el,"object") == 0) + { + if(strcmp(attr[i + 1],"readOnly") == 0) + { + node->permission = DM_PRESENT; + } + if(strcmp(attr[i + 1],"readWrite") == 0) + { + node->permission = DM_CREATE; + } + } + if(strcmp(el,"parameter") == 0) + { + if(strcmp(attr[i + 1],"readOnly") == 0) + { + node->permission = DM_READ; + } + if(strcmp(attr[i + 1],"readWrite") == 0) + { + node->permission = DM_READ_WRITE; + } + } + } + if(strcmp(attr[i],"defaultValue") == 0) + { + tmp_handler = calloc(1,sizeof(struct list_data_handler)); + + if(tmp_handler != NULL) + { + tmp_handler->data_handler = calloc(1,sizeof(struct data_handler)); + if(node == current_object) + { + list_add_tail(&(tmp_handler->list),&(object_handler_list)); + } + else + { + list_add_tail(&(tmp_handler->list),&(parameter_handler_list)); + } + } + tmp_handler->data_handler->type = DM_DEFAULT_VALUE; + tmp_handler->data_handler->handler = (void *)strdup(attr[i + 1]); + node->size_data_handler++; + } + if(strcmp(attr[i],"regExp") == 0) + { + tmp_handler = calloc(1,sizeof(struct list_data_handler)); + + if(tmp_handler != NULL) + { + tmp_handler->data_handler = calloc(1,sizeof(struct data_handler)); + if(node == current_object) + { + list_add_tail(&(tmp_handler->list),&(object_handler_list)); + } + else + { + list_add_tail(&(tmp_handler->list),&(parameter_handler_list)); + } + } + tmp_handler->data_handler->type = DM_REGEXP; + tmp_handler->data_handler->handler = (void *)strdup(attr[i + 1]); + node->size_data_handler++; + } + if(strcmp(attr[i],"forcedInform") == 0) + { + if(strcmp(el,"parameter") == 0) + { + if(strcmp(attr[i + 1],"true") == 0) + { + forced_inform_parameter = calloc(1,sizeof(struct forced_inform_parameter)); + if(forced_inform_parameter != NULL) + { + sprintf(forced_inform_name,"%s%s",last_object_name,node->name); + forced_inform_parameter->name = strdup(forced_inform_name); + forced_inform_parameter->node = (struct dm_node_leaf *)node; + } + } + } + } + if(strcmp(attr[i],"activeNotify") == 0) + { + if(strcmp(attr[i + 1],"forceDefaultEnabled") == 0) + { + node->active_notify.force_default_enabled = TRUE; + if(node->type == DM_PARAMETER) + { + current_object->active_notify.force_default_enabled = TRUE; + } + } + else if(strcmp(attr[i + 1],"forceEnabled") == 0) + { + node->active_notify.force_enabled = TRUE; + if(node->type == DM_PARAMETER) + { + current_object->active_notify.force_enabled = TRUE; + } + } + else if(strcmp(attr[i + 1],"canDeny") == 0) + { + node->active_notify.can_deny = TRUE; + if(node->type == DM_PARAMETER) + { + current_object->active_notify.can_deny = TRUE; + } + } + } + if(strcmp(attr[i],"type") == 0) + { + if(node->type == DM_PARAMETER) + { + struct dm_node_leaf *leaf = (struct dm_node_leaf *)node; + for (j=0;jvalue_type = type_idx; + } + } + } + } + if( (strcmp(el,"system") == 0) || + (strcmp(el,"uci") ==0) || +#ifdef WITH_DM_XML_DEBUG + (strcmp(el,"debug") == 0) || +#endif + (strcmp(el,"correspondence") == 0) || + (strcmp(el,"string") == 0)) + { + tmp_handler = calloc(1,sizeof(struct list_data_handler)); + + if(tmp_handler != NULL) + { + tmp_handler->data_handler = calloc(1,sizeof(struct data_handler)); + if(node == current_object) + { + list_add_tail(&(tmp_handler->list),&(object_handler_list)); + } + else + { + list_add_tail(&(tmp_handler->list),&(parameter_handler_list)); + } + } + if(last_tag_name != NULL) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + else + { + last_tag_name = strdup(el); + } + node->size_data_handler++; + + } + if(strcmp(el,"system") == 0) + { + if(tmp_handler->data_handler != NULL) + { + tmp_handler->data_handler->type = DM_SYSTEM; + tmp_handler->data_handler->handler = (void *)calloc(1,sizeof(struct dm_system)); + } + + pstruct_dm_system = (struct dm_system *)tmp_handler->data_handler->handler; + /* + * Setting SYSTEM default values + */ + pstruct_dm_system->type = DM_GET; + pstruct_dm_system->reboot_required = FALSE; + pstruct_dm_system->end_session = FALSE; + for (i = 0; attr[i]; i += 2) + { + if(strcmp(attr[i],"type") == 0) + { + if(strcmp(attr[i+1],"get") == 0) + { + pstruct_dm_system->type = DM_GET; + } + if(strcmp(attr[i+1],"set") == 0) + { + pstruct_dm_system->type = DM_SET; + } + if(strcmp(attr[i+1],"apply") == 0) + { + pstruct_dm_system->type = DM_APPLY; + } + if(strcmp(attr[i+1],"cancel") == 0) + { + pstruct_dm_system->type = DM_CANCEL; + } + if(strcmp(attr[i+1],"addObject") == 0) + { + pstruct_dm_system->type = DM_ADD; + } + if(strcmp(attr[i+1],"deleteObject") == 0) + { + pstruct_dm_system->type = DM_DEL; + } + } + if(strcmp(attr[i],"rebootRequired") == 0) + { + if(strcmp(attr[i+1],"false") == 0) + { + pstruct_dm_system->reboot_required = FALSE; + } + if(strcmp(attr[i+1],"true") == 0) + { + pstruct_dm_system->reboot_required = TRUE; + } + } + if(strcmp(attr[i],"endSession") == 0) + { + if(strcmp(attr[i+1],"false") == 0) + { + pstruct_dm_system->end_session = FALSE; + } + if(strcmp(attr[i+1],"true") == 0) + { + pstruct_dm_system->end_session = TRUE; + } + } + } + } + if(strcmp(el,"uci") == 0) + { + if(tmp_handler->data_handler != NULL) + { + tmp_handler->data_handler->type = DM_UCI; + tmp_handler->data_handler->handler = (void *)calloc(1,sizeof(struct dm_uci)); + } + + pstruct_dm_uci = (struct dm_uci *)tmp_handler->data_handler->handler; + /* + * Setting UCI default values + */ + pstruct_dm_uci->reboot_required = FALSE; + pstruct_dm_uci->end_session = FALSE; + for (i = 0; attr[i]; i += 2) + { + if(strcmp(attr[i],"rebootRequired") == 0) + { + if(strcmp(attr[i+1],"false") == 0) + { + pstruct_dm_uci->reboot_required = FALSE; + } + if(strcmp(attr[i+1],"true") == 0) + { + pstruct_dm_uci->reboot_required = TRUE; + } + } + if(strcmp(attr[i],"endSession") == 0) + { + if(strcmp(attr[i+1],"false") == 0) + { + pstruct_dm_uci->end_session = FALSE; + } + if(strcmp(attr[i+1],"true") == 0) + { + pstruct_dm_uci->end_session = TRUE; + } + } + } + } +#ifdef WITH_DM_XML_DEBUG + if(strcmp(el,"debug") == 0) + { + if(tmp_handler->data_handler != NULL) + { + tmp_handler->data_handler->type = DM_DEBUG; + } + } +#endif + if(strcmp(el,"correspondence") == 0) + { + if(tmp_handler->data_handler != NULL) + { + tmp_handler->data_handler->type = DM_CORRESPONDENCE; + tmp_handler->data_handler->handler = (void *)calloc(1,sizeof(struct dm_correspondence)); + } + } + if(strcmp(el,"string") == 0) + { + if(tmp_handler->data_handler != NULL) + { + tmp_handler->data_handler->type = DM_STRING; + } + } + if(strcmp(el,"object") == 0) + { + dm_add_node(node); + DM_LOG(DEBUG,"OBJECT :loading:YES:%s",last_object_name); + } + Depth++; +} + +void end_hndl(void *data, const char *el) +{ + struct dm_data *dm_data=NULL; + struct dm_map *dm_map=NULL; + char *pstruct_dm_string; + char *pstruct_dm_debug; + struct dm_uci *pstruct_dm_uci; + struct dm_system *pstruct_dm_system; + struct dm_correspondence *pstruct_dm_correspondence; + + if(strcmp(el,"parameter") == 0) + { + dm_get_handler(node,¶meter_handler_list); + node = current_object; + forced_inform_parameter = NULL; + } + if(strcmp(el,"object") == 0) + { + if(last_object_name != NULL) + { + free(last_object_name); + last_object_name = NULL; + } + dm_get_handler(node,&object_handler_list); + node = NULL; + current_object = NULL; + } + if(tmp_handler != NULL) + { +#ifdef WITH_DM_XML_DEBUG + if(strcmp(el,"debug") == 0) + { + if((last_tag_name != NULL)&&(strcmp(el,last_tag_name) == 0)) + { + tmp_handler->data_handler->handler = (void *)strdup(last_content); + DM_XML_LOG(INFO,"%s",last_content); + } + else + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + } +#endif + if(strcmp(el,"string") == 0) + { + if((last_tag_name != NULL)&&(strcmp(el,last_tag_name) == 0)) + { + tmp_handler->data_handler->handler = (void *)strdup(last_content); + } + else + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + } + if(strcmp(el,"cmd") == 0) + { + if((last_tag_name != NULL)&&((strcmp(last_tag_name,"uci") == 0)||(strcmp(last_tag_name,"system") == 0))) + { + if(tmp_handler->data_handler->type == DM_UCI) + { + pstruct_dm_uci = (struct dm_uci *)tmp_handler->data_handler->handler; + pstruct_dm_uci->cmd = strdup(last_content); + } + if(tmp_handler->data_handler->type == DM_SYSTEM) + { + pstruct_dm_system = (struct dm_system *)tmp_handler->data_handler->handler; + pstruct_dm_system->cmd = strdup(last_content); + } + } + else + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + + } + + if(strcmp(el,"data") == 0) + { + if((last_tag_name != NULL)&&(strcmp(last_tag_name,"correspondence") == 0)) + { + if(tmp_handler->data_handler->type == DM_CORRESPONDENCE) + { + pstruct_dm_correspondence = (struct dm_correspondence *)tmp_handler->data_handler->handler; + dm_data = calloc(1,sizeof(struct dm_data)); + if(dm_data != NULL) + { + dm_get_xml_data(last_content,dm_data); + pstruct_dm_correspondence->dm_data = dm_data; + } + } + } + else + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + } + + if(strcmp(el,"map") == 0) + { + if((last_tag_name != NULL)&&((strcmp(last_tag_name,"correspondence") == 0)||(strcmp(last_tag_name,"system") == 0))) + { + if(tmp_handler->data_handler->type == DM_SYSTEM) + { + pstruct_dm_system = (struct dm_system *)tmp_handler->data_handler->handler; + dm_map = calloc(1,sizeof(struct dm_map)); + if(dm_map != NULL) + { + dm_get_xml_map(last_content,dm_map); + pstruct_dm_system->dm_map = dm_map; + } + } + if(tmp_handler->data_handler->type == DM_CORRESPONDENCE) + { + pstruct_dm_correspondence = (struct dm_correspondence *)tmp_handler->data_handler->handler; + dm_map = calloc(1,sizeof(struct dm_map)); + if(dm_map != NULL) + { + dm_get_xml_map(last_content,dm_map); + pstruct_dm_correspondence->dm_map = dm_map; + } + } + } + else + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + } + } + if( (strcmp(el,"system") == 0) || + (strcmp(el,"uci") ==0) || +#ifdef WITH_DM_XML_DEBUG + (strcmp(el,"debug") == 0) || +#endif + (strcmp(el,"correspondence") == 0) || + (strcmp(el,"string") == 0)) + { + switch(tmp_handler->data_handler->type) + { + case DM_SYSTEM: + pstruct_dm_system = (struct dm_system *)tmp_handler->data_handler->handler; + if(pstruct_dm_system->cmd == NULL) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + break; + case DM_UCI: + pstruct_dm_uci = (struct dm_uci *)tmp_handler->data_handler->handler; + if(pstruct_dm_uci->cmd == NULL) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + break; + case DM_CORRESPONDENCE: + pstruct_dm_correspondence = (struct dm_correspondence *)tmp_handler->data_handler->handler; + if((pstruct_dm_correspondence->dm_data == NULL)||(pstruct_dm_correspondence->dm_map == NULL)) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + break; + case DM_STRING: + pstruct_dm_string = (char *)tmp_handler->data_handler->handler; + if(pstruct_dm_string == NULL) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + break; + case DM_DEBUG: + pstruct_dm_debug = (char *)tmp_handler->data_handler->handler; + if(pstruct_dm_debug == NULL) + { + DM_LOG(ERROR,"data model xml file not well formed"); + exit(EXIT_FAILURE); + } + break; + } + tmp_handler = NULL; + if(last_tag_name != NULL) + { + free(last_tag_name); + last_tag_name = NULL; + } + } + Depth--; +} + +void char_hndl(void *data, const char *content,int length) +{ + char tmp[512]; + int i = 0,n = 0; + + if(length!=0) + { + strncpy(tmp, content, length); + tmp[length] = '\0'; + while(irm_eo; + } + regfree(regex); + free(regex); + if((result->rm_so == 0)&&(result->rm_eo == strlen(pch))) + { + return DM_OK; + } + return DM_GEN_ERR; +} + +/*********************************************************************************************/ +/** browse tree **/ +/*********************************************************************************************/ + +int is_numeric(const char *p) +{ + if (*p) + { + char c; + while ((c=*p++)) + { + if (!isdigit(c)) return 0; + } + return 1; + } + return 0; +} + +static int get_data_array_by_column (struct dm_index_path *index_path, + int pos_xp, + struct dm_data **data, + unsigned short *ic, + char *map_column) +{ + struct dm_data *d; + struct dm_map *m; + unsigned short i; + m = index_path[pos_xp].map; + d = index_path[pos_xp].data; + if (m==NULL||d==NULL) + { + *data = NULL; + *ic = 0; + return 1; + } + for (i=0;isize;i++) + { + if (strcmp(map_column,m->map[i])==0) + { + *ic=i; + if (icolumn_size) + { + *data = d; + return 0; + } + else + { + *data = NULL; + return 1; + } + } + } + *data = NULL; + return 1; +} + + +static int get_data_array_correspondence ( struct dm_index_path *index_path, + int pos_xp, + char *map_corr, + char *corr) +{ + struct dm_data *d; + unsigned short i,ic,mc,error; + struct dm_index_path *exp; + exp = &index_path[pos_xp]; + if (error = get_data_array_by_column (index_path,pos_xp,&d,&ic,"index")) + { + return error; + } + if (error = get_data_array_by_column (index_path,pos_xp,&d,&mc,map_corr)) + { + return error; + } + for (i=0;iline_size;i++) + { + if (strcmp(exp->index,d->data[i][ic])==0) + { + strcpy(corr,d->data[i][mc]); + return 0; + } + } + return 1; +} + +static int check_index_exist(struct dm_index_path *index_path, + int pos_xp, + char *index) +{ + struct dm_data *d; + unsigned short i,ic,error; + struct dm_index_path *exp; + exp = &index_path[pos_xp]; + if (error = get_data_array_by_column (index_path,pos_xp,&d,&ic,"index")) + { + return error; + } + for (i=0;iline_size;i++) + { + if (strcmp(index,d->data[i][ic])==0) + { + exp->indice = i; + return 0; + } + } + return 1; +} + +int get_string_correspondence (char *ret, char *src, struct dm_index_path *index_path, int pos_xp) +{ + char *t,*pch,*s,*is; + char corr[128]; + int i,len,error = 0; + + ret[0] = 0; + s = src; + is = src; + if (index_path==NULL) + { + strcpy(ret,src); + return 0; + } + while (s=strchr(s,'$')) + { + len = strlen(ret); + if ((s-is)<0) + { + return 1; + } + memcpy(ret+len,is,s-is); + ret[len+s-is] = 0; + s++; + is = s; + pch = strdup(s); + t = pch; + pch = strtok(pch,"{"); + if (pch==NULL) + { + free(t); + return 1; + } + is = is + strlen(pch) +1; + i = atoi(pch); + if (i<1) + { + free(t); + return 1; + } + pch = strtok(NULL,"}"); + if (pch==NULL) + { + free(t); + return 1; + } + is = is + strlen(pch) +1; + if (error = get_data_array_correspondence (index_path,i-1,pch,corr)) + { + free(t); + return error; + } + strcat(ret,corr); + free(t); + } + if ((is-src)node = node; + enp->index_path = NULL; + *pos_np +=1; + return DM_OK; +} + +int free_element_node_path (struct dm_node_path *node_path, int *pos_np, int *pos_xp) +{ + struct dm_node_path *enp; + struct dm_index_path *exp; + + *pos_np -=1; + enp = &node_path[*pos_np]; + exp = enp->index_path; + + if (exp!=NULL) + { + free_element_index_path(exp,pos_xp); + } + memset(enp,0,sizeof(struct dm_node_path)); + return DM_OK; +} + +int free_element_index_path (struct dm_index_path *exp, int *pos_xp) +{ + *pos_xp -=1; + if (exp->data!=NULL && exp->data_type == DM_SYSTEM_DATA) + { + dm_free_data_array(exp->data); + } + if (exp->index!=NULL) + { + free(exp->index); + } + + memset(exp,0,sizeof(struct dm_index_path)); + return DM_OK; +} + +int free_all_index_path (struct dm_index_path *index_path) +{ + int i; + struct dm_index_path *exp; + for (i=0;idata!=NULL && exp->data_type == DM_SYSTEM_DATA) + { + dm_free_data_array(exp->data); + } + if (exp->index!=NULL) + { + free(exp->index); + } + } + return DM_OK; +} + + +int add_element_index_path (struct dm_node *node, + struct dm_node_path *node_path, + int *pos_np, + struct dm_index_path *index_path, + int *pos_xp, + char *index, + int indice) +{ + struct dm_node_path *enp; + struct dm_index_path *exp; + struct data_handler **data_handler; + __u8 i,size_dh; + char cmd[256]; + + enp = &node_path[(*pos_np)-1]; + + if (node == NULL || node->type != DM_INSTANCE) + { + return DM_ERR; + } + + if (enp->index_path!=NULL) + { + exp = enp->index_path; + if (exp->index!=NULL) + { + free(exp->index); + } + exp->index = strdup(index); + if (indice>=0) + { + exp->indice = indice; + } + return DM_OK; + } + else + { + exp = &index_path[*pos_xp]; + } + + enp->index_path = exp; + data_handler = node->data_handler; + size_dh = node->size_data_handler; + *pos_xp +=1; + + for (i=0;itype == DM_CORRESPONDENCE) + { + struct dm_correspondence *corresp; + corresp = (struct dm_correspondence *)data_handler[i]->handler; + exp->data = corresp->dm_data; + exp->map = corresp->dm_map; + exp->data_type = DM_XML_DATA; + exp->node_path = enp; + exp->index = (index!=NULL) ? strdup(index) : NULL; + if (indice>=0) + { + exp->indice = indice; + } + break; + } + else if (data_handler[i]->type == DM_SYSTEM) + { + struct dm_system *system; + struct dm_data *dm_data; + system = (struct dm_system *)data_handler[i]->handler; + if (system->type != DM_GET) + { + continue; + } + dm_data = calloc(1,sizeof(struct dm_data)); + assert(dm_data); + get_string_correspondence (cmd,system->cmd,index_path,(*pos_xp)-1); + dm_get_system_data_array(cmd,dm_data); + exp->data = dm_data; + exp->map = system->dm_map; + exp->data_type = DM_SYSTEM_DATA; + exp->node_path = enp; + exp->index = (index!=NULL) ? strdup(index) : NULL; + if (indice>=0) + { + exp->indice = indice; + } + break; + } + } + return DM_OK; +} + +int dm_browse_subtree (struct list_head *list, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int *pos_np, + struct dm_index_path *index_path, + int *pos_xp) +{ + struct list_head *ilist,*jlist; + struct dm_node *node=NULL; + struct dm_data *data=NULL; + int error,subtree; + unsigned short i,ic; + + error = FAULT_CPE_NO_FAULT_IDX; + __list_for_each(jlist,list) + { + node = list_entry(jlist,struct dm_node,list); + add_element_node_path(node, node_path, pos_np); + if ((node->type == DM_INSTANCE) && (error = add_element_index_path(node, node_path, pos_np, index_path, pos_xp, NULL, -1))) + { + DM_XML_GET_HANDLER_DEBUG(node,index_path,*pos_xp); + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + goto end_subtree; + } + DM_XML_GET_HANDLER_DEBUG(node,index_path,*pos_xp); + if (error = dm_rpc->method(node, dm_rpc, node_path, *pos_np, index_path, *pos_xp)) + { + goto end_subtree; + } + if (dm_rpc->subtree==FALSE) + { + goto end_subtree; + } + if (node->type == DM_INSTANCE) + { + if (get_data_array_indexes (index_path,(*pos_xp)-1,&data,&ic)) + { + goto end_subtree; + } + ilist = &(node->head_child); + for (i=0;iline_size;i++) + { + if (error = add_element_index_path(node, node_path, pos_np, index_path, pos_xp, data->data[i][ic], i)) + { + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + goto end_subtree; + } + if (error = dm_rpc->method(node, dm_rpc, node_path, *pos_np, index_path, *pos_xp)) + { + goto end_subtree; + } + if (dm_rpc->subtree==FALSE) + { + continue; + } + if (error = dm_browse_subtree (ilist,dm_rpc,node_path,pos_np,index_path,pos_xp)) + { + goto end_subtree; + } + } + } + else if (node->type == DM_OBJECT) + { + ilist = &(node->head_child); + if (error = dm_browse_subtree (ilist,dm_rpc,node_path,pos_np,index_path,pos_xp)) + { + goto end_subtree; + } + } +end_subtree: + free_element_node_path(node_path, pos_np, pos_xp); + if (error) + { + return error; + } + } + return FAULT_CPE_NO_FAULT_IDX; +} + +int dm_browse_tree (char *name, struct dm_rpc *dm_rpc) +{ + struct dm_node_path node_path[NODE_PATH_SIZE]; + struct dm_index_path index_path[INDEX_PATH_SIZE]; + int pos_np=0,pos_xp=0; + char *pch,*t; + struct list_head *ilist,*jlist; + struct dm_node *node=NULL; + bool found,subtree,pch_is_numeric; + int namelen,error; + + error = FAULT_CPE_NO_FAULT_IDX; + if (name[0]=='.') + { + DM_LOG(INFO,"Invalid path name: %s",name); + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + namelen = strlen(name); + pch = strdup(name); + t = pch; + pch = strtok (pch,"."); + ilist = &head_dm_tree; + error = FAULT_CPE_NO_FAULT_IDX; + pch_is_numeric = TRUE; + memset(node_path,0,NODE_PATH_SIZE*sizeof(struct dm_node_path)); + memset(index_path,0,INDEX_PATH_SIZE*sizeof(struct dm_index_path)); + if (namelen!=0) + { + while (pch != NULL && (pch-t)name)==0) + { + found = TRUE; + if (node->type == DM_OBJECT || + node->type == DM_INSTANCE) + { + ilist = &(node->head_child); + } + add_element_node_path(node,node_path, &pos_np); + if ((node->type == DM_INSTANCE) && (error = add_element_index_path(node, node_path, &pos_np, index_path, &pos_xp, NULL, -1))) + { + DM_XML_GET_HANDLER_DEBUG(node,index_path,pos_xp); + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + goto endbrowse; + } + DM_XML_GET_HANDLER_DEBUG(node,index_path,pos_xp); + break; + } + } + if (!found) + { + break; + } + pch = strtok (pch+strlen(pch)+1, "."); + } + + if (!found || + ((node->type == DM_OBJECT || node->type == DM_INSTANCE) && name[namelen-1]!='.') || + (node->type == DM_PARAMETER && name[namelen-1]=='.')) + { + DM_LOG(INFO,"Invalid path name: %s",name); + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + goto endbrowse; + } + + } + + if (error = dm_rpc->method(node, dm_rpc, node_path, pos_np, index_path, pos_xp)) + { + goto endbrowse; + } + + if (dm_rpc->subtree == TRUE) + { + if (node!=NULL && node->type==DM_INSTANCE && !pch_is_numeric) + { + struct dm_data *data=NULL; + unsigned short i,ic; + if (get_data_array_indexes (index_path,pos_xp-1,&data,&ic)) + { + goto endbrowse; + } + for (i=0;iline_size;i++) + { + if (error = add_element_index_path(node, node_path, &pos_np, index_path, &pos_xp, data->data[i][ic], i)) + { + error = FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + goto endbrowse; + } + if (error = dm_rpc->method(node, dm_rpc, node_path, pos_np, index_path, pos_xp)) + { + goto endbrowse; + } + if (dm_rpc->subtree==FALSE) + { + continue; + } + if (error = dm_browse_subtree (ilist,dm_rpc,node_path,&pos_np,index_path,&pos_xp)) + { + goto endbrowse; + } + } + } + else { + error = dm_browse_subtree (ilist,dm_rpc,node_path,&pos_np,index_path,&pos_xp); + } + goto endbrowse; + } + +endbrowse: + free_all_index_path (index_path); + free(t); + return error; +} + +#ifdef WITH_DM_XML_DEBUG +int dm_get_handler_debug (struct dm_node *node, struct dm_index_path *index_path, int pos_xp) +{ + struct data_handler **data_handler; + __u8 i,size_dh; + char corr[512]; + + data_handler = node->data_handler; + size_dh = node->size_data_handler; + + for (i=0;itype == DM_DEBUG) + { + char *debug; + debug = (char *)data_handler[i]->handler; + get_string_correspondence (corr,debug,index_path,pos_xp-1); + DM_XML_LOG(INFO,corr); + } + } + return DM_OK; +} +#endif diff --git a/src/dm/scripts/templateScript b/src/dm/scripts/templateScript new file mode 100644 index 0000000..e69de29 diff --git a/src/dm/xml/tr098.xml b/src/dm/xml/tr098.xml new file mode 100644 index 0000000..23d6ff1 --- /dev/null +++ b/src/dm/xml/tr098.xml @@ -0,0 +1,1337 @@ + + + + + + + + + + + + + + + + + + 000000 + + + + + Inteno + + + 0000000000 + + + broadcom + + + OpenWrt + + + + + + + 1.1 + + + + uci -P /var/state -q get provisioning.iup.provisioningcode + + + + + + + + + + + + + + + + + + uci export + + + + + + + + uci set cwmp.acs.dhcp_discovery=disable + + + cwmp.acs.url + + ACS URL parameter from xml debug tag + + + + + + cwmp.acs.periodic_inform_enable + + + + + cwmp.acs.periodic_inform_interval + + + + + + cwmp.acs.ParameterKey + + + + + uci -P /etc/cwmpd/.iccu -q get cwmp.cpe.iccu_url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1,lan,true + index,correspondence,Enable + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1,1 + index,correspondence + + + $1{Enable} + Enable parameter from xml debug tag + + + + network.$1{correspondence}.ipaddr + + + + + network.$1{correspondence}.netmask + + + + + network.$1{correspondence}.proto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/dm_rpc.c b/src/dm_rpc.c new file mode 100644 index 0000000..4bfd307 --- /dev/null +++ b/src/dm_rpc.c @@ -0,0 +1,1748 @@ +/* + dm_rpc.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ +#include +#include "soapH.h" +#include "cwmp.h" +#include "list.h" +#include "dm.h" +#include "dm_rpc.h" + +extern struct list_head head_dm_tree; +extern struct FAULT_CPE FAULT_CPE_ARRAY [FAULT_CPE_ARRAY_SIZE]; +extern struct list_head list_dm_set_handler; + +int get_node_path_name (char *name, + struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + char *ret; + int i; + struct dm_node_path *enp; + struct dm_index_path *exp; + for (i=0;iindex_path; + if (enp->node== NULL) + { + break; + } + strcat(name,enp->node->name); + if (enp->node->type == DM_PARAMETER) + { + continue; + } + strcat(name,"."); + if (enp->node->type==DM_INSTANCE && exp!=NULL && exp->index!=NULL) + { + strcat(name,exp->index); + strcat(name,"."); + } + } + return DM_OK; +} + +/** + ------------------------------------------------------- +| GetParameter Value Data Model API | + ------------------------------------------------------- +**/ +int get_node_paramater_value ( + struct dm_node *node, + struct dm_index_path *index_path, + int pos_xp, + char **ret + ) +{ + struct data_handler **data_handler; + __u8 i,size_dh; + char corr[256]; + + data_handler = node->data_handler; + size_dh = node->size_data_handler; + *ret = NULL; + for (i=0;itype == DM_UCI) + { + struct dm_uci *uci; + uci = (struct dm_uci *)data_handler[i]->handler; + get_string_correspondence (corr,uci->cmd,index_path,pos_xp-1); + if (*ret !=NULL) + { + free (*ret); + } + uci_get_value (corr,ret); + break; + } + else if (data_handler[i]->type == DM_SYSTEM) + { + struct dm_system *system; + system = (struct dm_system *)data_handler[i]->handler; + if (system->type != DM_GET) + { + continue; + } + get_string_correspondence (corr,system->cmd,index_path,pos_xp-1); + if (*ret !=NULL) + { + free (*ret); + } + dm_get_system_data(corr,ret); + break; + } + else if (data_handler[i]->type == DM_STRING || data_handler[i]->type == DM_DEFAULT_VALUE) + { + char *value; + value = (char *)data_handler[i]->handler; + get_string_correspondence (corr,value,index_path,pos_xp-1); + *ret = strdup(corr); + } + } + if (*ret == NULL) + { + return DM_ERR; + } + return DM_OK; +} +int dm_list_add_ParameterValues(char *name, + char *value, + struct dm_node *node, + struct list_head *list) +{ + struct cwmp1__ParameterValueStruct *ParameterValueStruct; + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + struct dm_node_leaf *parameter_node = (struct dm_node_leaf *)node; + extern char *TYPE_VALUES_ARRAY [COUNT_TYPE_VALUES]; + + ParameterValueStruct = calloc(1,sizeof(struct cwmp1__ParameterValueStruct)); + handler_ParameterValueStruct = calloc(1,sizeof(struct handler_ParameterValueStruct)); + if (ParameterValueStruct == NULL || + handler_ParameterValueStruct == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + ParameterValueStruct->Name = strdup(name); + ParameterValueStruct->Value = value; + ParameterValueStruct->Type = TYPE_VALUES_ARRAY [parameter_node->value_type]; + handler_ParameterValueStruct->ParameterValueStruct = ParameterValueStruct; + list_add_tail(&handler_ParameterValueStruct->list,list); + return FAULT_CPE_NO_FAULT_IDX; +} + +int dm_node_getParameterValues (struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + + struct dm_input_getParameterValues *input; + char name[512],*value; + int len,error; + + input = (struct dm_input_getParameterValues *)dm_rpc->input; + + if (node == NULL || node->type == DM_OBJECT || node->type == DM_INSTANCE) + { + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + dm_rpc->subtree = FALSE; + name[0] = 0; + if (error = get_node_path_name(name, node, dm_rpc, node_path, pos_np, index_path, pos_xp)) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + if (error = get_node_paramater_value(node,index_path,pos_xp,&value)) + { + char t[1]; + t[0] = 0; + value = strdup(t); + } + + dm_list_add_ParameterValues(name, value, node, input->list); + *(input->n) +=1; + + return FAULT_CPE_NO_FAULT_IDX; +} + +int cwmp_dm_getParameterValues(struct cwmp *cwmp, char *path, struct list_head *list, int *n) +{ + struct dm_rpc dm_rpc; + struct dm_input_getParameterValues input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + *n = 0; + input.list = list; + input.n = n; + dm_rpc.input = &input; + dm_rpc.method = dm_node_getParameterValues; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} + + +/** + ------------------------------------------------------- +| GetParameterName Data Model API | + ------------------------------------------------------- +**/ +int dm_list_add_ParameterName ( char *name, + struct dm_node *node, + struct list_head *list) +{ + struct cwmp1__ParameterInfoStruct *ParameterInfoStruct; + struct handler_ParameterInfoStruct *handler_ParameterInfoStruct; + int inode; + + ParameterInfoStruct = calloc(1,sizeof(struct cwmp1__ParameterInfoStruct)); + handler_ParameterInfoStruct = calloc(1,sizeof(struct handler_ParameterInfoStruct)); + if (ParameterInfoStruct == NULL || + handler_ParameterInfoStruct == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + ParameterInfoStruct->Name = strdup(name); + ParameterInfoStruct->Writable = (node->permission == DM_READ_WRITE || node->permission == DM_CREATE) ? xsd__boolean__true_ : xsd__boolean__false_; + handler_ParameterInfoStruct->ParameterInfoStruct = ParameterInfoStruct; + list_add_tail(&handler_ParameterInfoStruct->list,list); + return FAULT_CPE_NO_FAULT_IDX; +} + +int dm_node_getParameterNames( struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + + struct dm_input_getParameterNames *input; + struct list_head *ilist,*list; + struct dm_node *inode; + char name[512]; + int len; + + input = (struct dm_input_getParameterNames *)dm_rpc->input; + + if (node == NULL) + { + if (input->NextLevel == xsd__boolean__false_) + { + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + else + { + list = &head_dm_tree; + name[0] = 0; + len = 0; + dm_rpc->subtree = FALSE; + } + } + else + { + if (input->NextLevel == xsd__boolean__true_ && + node->type == DM_PARAMETER) + { + return FAULT_CPE_INVALID_ARGUMENTS_IDX; + } + + if (input->NextLevel == xsd__boolean__false_ && + (node->type == DM_OBJECT || + node->type == DM_INSTANCE)) + { + dm_rpc->subtree = TRUE; + } + else + { + dm_rpc->subtree = FALSE; + } + name[0] = 0; + get_node_path_name(name, node, dm_rpc, node_path, pos_np, index_path, pos_xp); + + len = strlen(name); + list = &(node->head_child); + } + if (node!=NULL && input->NextLevel == xsd__boolean__false_) + { + dm_list_add_ParameterName(name, node, input->list); + *(input->n) +=1; + } + else if (node!=NULL && node->type==DM_INSTANCE && index_path[pos_xp-1].index==NULL) + { + struct dm_data *data=NULL; + unsigned short i,ilen,ic; + if (get_data_array_indexes (index_path,pos_xp-1,&data,&ic)) + { + return FAULT_CPE_NO_FAULT_IDX; + } + for (i=0;iline_size;i++) + { + ilen = strlen(data->data[i][ic]); + memcpy(name+len,data->data[i][ic],ilen); + name[len+ilen] = '.'; + name[len+ilen+1] = 0; + dm_list_add_ParameterName(name, node, input->list); + *(input->n) +=1; + } + } + else + { + struct dm_node *inode; + int i,ilen; + __list_for_each(ilist,list) + { + inode = list_entry(ilist, struct dm_node, list); + DM_XML_GET_HANDLER_DEBUG(inode,index_path,pos_xp); + ilen = strlen(inode->name); + memcpy(name+len,inode->name,ilen); + if (inode->type == DM_PARAMETER) + { + name[len+ilen] = 0; + } + else + { + name[len+ilen] = '.'; + name[len+ilen+1] = 0; + } + dm_list_add_ParameterName(name, inode, input->list); + *(input->n) +=1; + } + } + + return FAULT_CPE_NO_FAULT_IDX; +} + +int cwmp_dm_getParameterNames(struct cwmp *cwmp, char *path, struct list_head *list, int *n, enum xsd__boolean NextLevel) +{ + struct dm_rpc dm_rpc; + struct dm_input_getParameterNames input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + *n = 0; + input.list = list; + input.n = n; + input.NextLevel = NextLevel; + dm_rpc.input = &input; + dm_rpc.method = dm_node_getParameterNames; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} + +/** + ------------------------------------------------------- +| get parameter paths by correspondence Data Model API | + ------------------------------------------------------- +**/ + +static int check_index_correspondence ( struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp, + struct dm_input_getParameterPaths_by_correspondence *input, + int n) +{ + struct dm_indice *dm_indice; + struct dm_node_path *enp; + struct dm_index_path *exp; + + + dm_indice = &(input->sub_path[n].dm_indice); + if (dm_indice->indice==NULL) + { + return DM_OK; + } + enp = &node_path[pos_np-1]; + exp = enp->index_path; + if (exp->index!=NULL) + { + if (dm_indice->type==DM_INDICE_INDEX) + { + if(strcmp(dm_indice->indice,exp->index)!=0) + { + return DM_ERR; + } + } + else if (dm_indice->type==DM_INDICE_CORRESPONDENCE) + { + struct dm_data *data=NULL; + unsigned short cc; + if (get_data_array_correspondence_column(index_path,pos_xp-1,&data,&cc)) + { + return DM_ERR; + } + if ((exp->indice<0) || strcmp(dm_indice->indice,data->data[exp->indice][cc])!=0) + { + return DM_ERR; + } + } + } + return DM_OK; +} + +int dm_node_getParameterPaths_by_correspondence(struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + + struct dm_input_getParameterPaths_by_correspondence *input; + char name[512]; + int i,error; + char *value=NULL; + bool add_parameter=FALSE; + struct list_head *ilist; + + input = (struct dm_input_getParameterPaths_by_correspondence *)dm_rpc->input; + + if (node == NULL) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + for (i=0;isub_path_size;i++) + { + if (input->sub_path[i].node==node) + { + if (node->type == DM_PARAMETER) + { + add_parameter = TRUE; + break; + } + else + { + if (check_index_correspondence(node_path,pos_np,index_path,pos_xp,input,i)) + { + dm_rpc->subtree = FALSE; + return FAULT_CPE_NO_FAULT_IDX; + } + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + } + else if (input->sub_path[i].node==NULL) + { + if (i==0) + { + input->sub_path[i].name = node->name; + input->sub_path[i].node = node; + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + else if (strcmp(input->sub_path[i].name,node->name)==0) + { + input->sub_path[i].node = node; + if (node->type != DM_PARAMETER) + { + if (check_index_correspondence(node_path,pos_np,index_path,pos_xp,input,i)) + { + dm_rpc->subtree = FALSE; + return FAULT_CPE_NO_FAULT_IDX; + } + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + else + { + add_parameter = TRUE; + break; + } + } + else + { + dm_rpc->subtree = FALSE; + return FAULT_CPE_NO_FAULT_IDX; + } + } + } + + if (add_parameter==FALSE) + { + if (input->sub_path_size == 0) + { + if (node->type==DM_PARAMETER) + { + add_parameter=TRUE; + } + else + { + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + } + else if (input->sub_path[input->sub_path_size-1].node!=NULL) + { + i = pos_np; + while (i>0) + { + i--; + if (input->sub_path[input->sub_path_size-1].node==node_path[i].node) + { + if (node->type==DM_PARAMETER) + { + add_parameter = TRUE; + break; + } + else + { + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + } + } + } + } + if (add_parameter==FALSE) + { + dm_rpc->subtree = FALSE; + return FAULT_CPE_NO_FAULT_IDX; + } + + dm_rpc->subtree = FALSE; + name[0] = 0; + if (error = get_node_path_name(name, node, dm_rpc, node_path, pos_np, index_path, pos_xp)) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + if (input->get_attribute) + { + int attribute; + attribute = dm_getParameterAttributes(name); + switch (attribute) + { + case _cwmp1__SetParameterAttributesStruct_Notification__0: + return FAULT_CPE_NO_FAULT_IDX; + break; + case _cwmp1__SetParameterAttributesStruct_Notification__2: + input->is_actif = TRUE; + break; + default: + break; + } + } + + for (ilist = input->list->next; ilist != input->elist->next; ilist = ilist->next) + { + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + handler_ParameterValueStruct = list_entry(ilist,struct handler_ParameterValueStruct,list); + if (strcmp(handler_ParameterValueStruct->ParameterValueStruct->Name,name)==0) + { + return FAULT_CPE_NO_FAULT_IDX; + } + } + + if (input->get_value) + { + if (error = get_node_paramater_value(node,index_path,pos_xp,&value)) + { + char t[1]; + t[0] = 0; + value = strdup(t); + } + } + + dm_list_add_ParameterValues(name, value, node, input->list); + *(input->n) +=1; + + return FAULT_CPE_NO_FAULT_IDX; +} + +int cwmp_dm_get_sub_indice_path (int argc, char **argv, char **prefix_path, struct sub_path *sub_path, int *sub_path_size) +{ + int i=1,len,size=0; + char *s=NULL,*t=NULL,*buf_path,*prefix_end; + + buf_path = strdup(argv[0]); + *prefix_path = buf_path; + prefix_end = strstr(buf_path,"{i}."); + if (prefix_end!=NULL && (prefix_end + 4)!=0) + { + sub_path[size].dm_indice.indice = (i>=argc)?NULL:strdup(argv[i]); + sub_path[size].dm_indice.type = DM_INDICE_CORRESPONDENCE; + size++; + i++; + s = prefix_end + 4; /* 4 = length of "{i}." */ + t = s; + len = strlen(t); + + *prefix_end = 0; + s = strtok(s,"."); + + while (s!=NULL && (s-t)=argc)?NULL:strdup(argv[i]); + sub_path[size-1].dm_indice.type = DM_INDICE_CORRESPONDENCE; + i++; + } + s = strtok(s+strlen(s)+1,"."); + } + } + *sub_path_size = size; + return CWMP_OK; +} + +int cwmp_dm_getParameterPaths_by_correspondence(struct cwmp *cwmp, char *path, struct sub_path *sub_path, int sub_path_size, struct list_head *list, int *n, bool get_value, bool get_attribute, bool *is_actif) +{ + struct dm_rpc dm_rpc; + struct dm_input_getParameterPaths_by_correspondence input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + memset(&input,0,sizeof(struct dm_input_getParameterPaths_by_correspondence)); + *n = 0; + input.list = list; + input.elist = list->prev; + input.n = n; + input.get_value = get_value; + input.get_attribute = get_attribute; + input.sub_path = sub_path; + input.sub_path_size = sub_path_size; + + dm_rpc.input = &input; + dm_rpc.method = dm_node_getParameterPaths_by_correspondence; + + error = dm_browse_tree (path, &dm_rpc); + + *is_actif = input.is_actif; + + return error; +} + +/** + ------------------------------------------------------- +| SetParameterValue Data Model API | + ------------------------------------------------------- +**/ + +static int bind_service_handler_queue_by_uci_conf (struct dm_set_handler *dm_set_handler, char *conf) +{ + struct service_handler *service_handler; + struct dm_set_handler *dm_sh; + struct list_head *ilist,*jlist; + struct list_head list_uci_affect; + struct config_uci_list *affect; + char uci_path[256]; + + if (strcmp(conf,UCI_TRACK_CONF_CWMP)!=0) + { + __list_for_each(ilist,&list_dm_set_handler) + { + dm_sh = list_entry(ilist, struct dm_set_handler, list); + __list_for_each(jlist,&(dm_sh->service_list)) + { + service_handler = list_entry(jlist, struct service_handler, list); + if (strcmp(conf,service_handler->service)==0) + { + return DM_OK; + } + } + + } + service_handler = calloc(1,sizeof(struct service_handler)); + service_handler->service = strdup(conf); + list_add_tail(&(service_handler->list),&(dm_set_handler->service_list)); + } + else + { + if (dm_set_handler->cwmp_reload==TRUE) + { + return DM_OK; + } + dm_set_handler->cwmp_reload=TRUE; + } + INIT_LIST_HEAD (&list_uci_affect); + sprintf(uci_path,"%s.@%s[%d].%s",UCI_TRACK_CONF,conf,0,UCI_TRACK_AFFECTS); + uci_get_list_value (uci_path, &list_uci_affect); + while(list_uci_affect.next!=&list_uci_affect) + { + affect = list_entry (list_uci_affect.next, struct config_uci_list, list); + bind_service_handler_queue_by_uci_conf (dm_set_handler,affect->value); + list_del(list_uci_affect.next); + if(affect->value != NULL) + { + free(affect->value); + } + free(affect); + } + return DM_OK; +} + +static int bind_service_handler_queue (struct dm_set_handler *dm_set_handler, char *uci_cmd) +{ + struct service_handler *service_handler; + struct dm_set_handler *dm_sh; + struct list_head *ilist,*jlist; + char *s,conf[128]; + int len; + s = strstr(uci_cmd,"."); + if (s==NULL) + { + return DM_OK; + } + len = s - uci_cmd; + memcpy(conf,uci_cmd,len); + conf[len] = 0; + bind_service_handler_queue_by_uci_conf (dm_set_handler,conf); + return DM_OK; +} + +static int bind_cmd_handler_queue(struct dm_set_handler *dm_set_handler, char *cmd, enum param_type type, __u8 end_session) +{ + struct cmd_handler *cmd_handler; + struct dm_set_handler *dm_sh; + struct list_head *ilist,*jlist; + + __list_for_each(ilist,&(dm_set_handler->cmd_list)) + { + cmd_handler = list_entry(ilist, struct cmd_handler, list); + if (strcmp(cmd,cmd_handler->cmd)==0) + { + return DM_OK; + } + } + if (end_session==TRUE) + { + __list_for_each(ilist,&list_dm_set_handler) + { + dm_sh = list_entry(ilist, struct dm_set_handler, list); + __list_for_each(jlist,&(dm_sh->cmd_list)) + { + cmd_handler = list_entry(jlist, struct cmd_handler, list); + if (strcmp(cmd,cmd_handler->cmd)==0) + { + return DM_OK; + } + } + } + } + + cmd_handler = calloc(1,sizeof(struct cmd_handler)); + if (cmd_handler==NULL) + { + return DM_ERR; + } + cmd_handler->cmd = strdup(cmd); + cmd_handler->type = type; + cmd_handler->end_session = end_session; + list_add(&(cmd_handler->list),&(dm_set_handler->cmd_list)); + return DM_OK; +} + +static int bind_cancel_handler_queue(struct dm_set_handler *dm_set_handler, char *cmd) +{ + struct cancel_handler *cancel_handler; + struct list_head *ilist; + + __list_for_each(ilist,&(dm_set_handler->cancel_list)) + { + cancel_handler = list_entry(ilist, struct cancel_handler, list); + if (strcmp(cmd,cancel_handler->cmd)==0) + { + return DM_OK; + } + } + + cancel_handler = calloc(1,sizeof(struct cancel_handler)); + if (cancel_handler==NULL) + { + return DM_ERR; + } + cancel_handler->cmd = strdup(cmd); + list_add(&(cancel_handler->list),&(dm_set_handler->cancel_list)); + return DM_OK; +} + +int dm_run_queue_cancel_handler(struct dm_set_handler *dm_set_handler) +{ + struct list_head *ilist; + struct cancel_handler *cancel_handler; + int error=DM_OK; + ilist = &(dm_set_handler->cancel_list); + while (ilist->next!=&(dm_set_handler->cancel_list)) + { + cancel_handler = list_entry(ilist->next,struct cancel_handler, list); + CWMP_LOG(INFO,"RUN cancel handler function %s",cancel_handler->cmd); /* TODO to be removed*/ + if (dm_call_system_cmd(cancel_handler->cmd)) + { + error = DM_ERR; + } + if (cancel_handler->cmd!=NULL) + { + free(cancel_handler->cmd); + } + list_del(ilist->next); + free(cancel_handler); + } + return DM_OK; +} + +int dm_run_queue_cmd_handler(struct dm_set_handler *dm_set_handler,__u8 end_session) +{ + struct list_head *ilist; + struct cmd_handler *cmd_handler; + int error=DM_OK; + bool uci=FALSE; + ilist = &(dm_set_handler->cmd_list); + while (ilist->next!=&(dm_set_handler->cmd_list)) + { + cmd_handler = list_entry(ilist->next,struct cmd_handler, list); + if (cmd_handler->end_session != end_session) + { + ilist = ilist->next; + continue; + } + if (cmd_handler->type == DM_UCI) + { + CWMP_LOG(INFO,"RUN uci set cmd handler %s",cmd_handler->cmd); /* TODO to be removed*/ + if (uci_set_value (cmd_handler->cmd)) + { + error = DM_ERR; + } + uci = TRUE; + } + else if (cmd_handler->type == DM_SYSTEM) + { + CWMP_LOG(INFO,"RUN system cmd handler %s",cmd_handler->cmd); /* TODO to be removed*/ + if (dm_call_system_cmd(cmd_handler->cmd)) + { + error = DM_ERR; + } + } + if (cmd_handler->cmd!=NULL) + { + free(cmd_handler->cmd); + } + list_del(ilist->next); + free(cmd_handler); + } + if (uci == TRUE) + { + uci_commit_value(); + } + return DM_OK; +} + +int dm_run_queue_service_handler(struct dm_set_handler *dm_set_handler) +{ + struct list_head *ilist; + struct service_handler *service_handler; + char buf[256],*init; + + ilist = &(dm_set_handler->service_list); + while (ilist->next!=&(dm_set_handler->service_list)) + { + service_handler = list_entry(ilist->next,struct service_handler, list); + + sprintf(buf,"%s.@%s[%d].%s",UCI_TRACK_CONF,service_handler->service,0,UCI_TRACK_INIT); + if(uci_get_value(buf,&init)==CWMP_OK && init!=NULL) + { + CWMP_LOG(INFO,"Restart service %s",init); /* TODO to be removed*/ + sprintf(buf,"/etc/init.d/%s restart",init); + dm_call_system_cmd(buf); + } + + if (service_handler->service!=NULL) + { + free(service_handler->service); + } + list_del(ilist->next); + free(service_handler); + } + + return DM_OK; +} + +int dm_free_dm_set_handler_queues (struct dm_set_handler *dm_set_handler) +{ + struct list_head *ilist; + struct cancel_handler *cancel_handler; + struct cmd_handler *cmd_handler; + struct service_handler *service_handler; + int error=DM_OK; + ilist = &(dm_set_handler->cancel_list); + while (ilist->next!=ilist) + { + cancel_handler = list_entry(ilist->next,struct cancel_handler, list); + if (cancel_handler->cmd!=NULL) + { + free(cancel_handler->cmd); + } + list_del(ilist->next); + free(cancel_handler); + } + ilist = &(dm_set_handler->cmd_list); + while (ilist->next!=ilist) + { + cmd_handler = list_entry(ilist->next,struct cmd_handler, list); + if (cmd_handler->cmd!=NULL) + { + free(cmd_handler->cmd); + } + list_del(ilist->next); + free(cmd_handler); + } + ilist = &(dm_set_handler->service_list); + while (ilist->next!=ilist) + { + service_handler = list_entry(ilist->next,struct service_handler, list); + if (service_handler->service!=NULL) + { + free(service_handler->service); + } + list_del(ilist->next); + free(service_handler); + } + return DM_OK; +} + +int dm_run_queue_cmd_handler_at_end_session (struct cwmp *cwmp, struct dm_set_handler *dm_set_handler) +{ + int error; + CWMP_LOG(INFO,"RUN End Sessions Functions"); /* TODO to be removed*/ + error = dm_run_queue_cmd_handler(dm_set_handler,TRUE); + if (dm_set_handler->reboot_required==FALSE) + { + dm_run_queue_service_handler(dm_set_handler); + } + dm_free_dm_set_handler_queues(dm_set_handler); + if (dm_set_handler!=NULL) + { + list_del(&(dm_set_handler->list)); + free(dm_set_handler); + } + return error; +} +int dm_cwmp_config_reload (struct cwmp *cwmp, void *v ) +{ + CWMP_LOG(INFO,"Reload CWMP Config"); /* TODO to be removed*/ + if (cwmp_apply_acs_changes(cwmp)) + { + return DM_GEN_ERR; + } + return DM_ERR; +} +static int enqueue_apply_cancel_handlers(struct dm_set_handler *dm_set_handler, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + struct data_handler **data_handler; + unsigned short error,k; + __u8 i,size_dh; + struct dm_node *node; + char corr[256]; + for (k=0;k<(pos_np);k++) + { + node = node_path[k].node; + data_handler = node->data_handler; + size_dh = node->size_data_handler; + for (i=0;itype == DM_SYSTEM) + { + struct dm_system *system; + system = (struct dm_system *)data_handler[i]->handler; + if (system->type == DM_APPLY) + { + get_string_correspondence(corr,system->cmd,index_path,pos_xp-1); + if (system->reboot_required) + { + dm_set_handler->reboot_required = TRUE; + } + if (bind_cmd_handler_queue(dm_set_handler,corr,DM_SYSTEM,system->end_session)) + { + return DM_ERR; + } + } + else if (system->type == DM_CANCEL) + { + get_string_correspondence(corr,system->cmd,index_path,pos_xp-1); + if (system->reboot_required) + { + dm_set_handler->reboot_required = TRUE; + } + if (bind_cancel_handler_queue(dm_set_handler,corr)) + { + return DM_ERR; + } + } + } + } + } + return DM_OK; +} + +static int set_node_paramater_value (struct dm_node *node, + struct dm_index_path *index_path, + int pos_xp, + char *value, + struct dm_set_handler *dm_set_handler) +{ + struct data_handler **data_handler; + unsigned short error,j; + __u8 size_dh,i; + char corr[256],*serr=NULL; + + data_handler = node->data_handler; + size_dh = node->size_data_handler; + for (i=0;itype == DM_UCI) + { + struct dm_uci *uci; + uci = (struct dm_uci *)data_handler[i]->handler; + get_string_correspondence (corr,uci->cmd,index_path,pos_xp-1); + + bind_service_handler_queue(dm_set_handler,corr); + + sprintf(corr,"%s=%s",corr,value); + + if (uci->reboot_required) + { + dm_set_handler->reboot_required = TRUE; + } + + if (uci->end_session) + { + if (bind_cmd_handler_queue(dm_set_handler,corr,DM_UCI,TRUE)) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + return FAULT_CPE_NO_FAULT_IDX; + } + + if (error = uci_set_value (corr)) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + dm_set_handler->uci = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + else if (data_handler[i]->type == DM_SYSTEM) + { + struct dm_system *system; + system = (struct dm_system *)data_handler[i]->handler; + if (system->type != DM_SET) + { + continue; + } + get_string_correspondence(corr,system->cmd,index_path,pos_xp-1); + + sprintf(corr,"%s %s",corr,value); + + if (system->reboot_required) + { + dm_set_handler->reboot_required = TRUE; + } + + if (system->end_session) + { + if (bind_cmd_handler_queue(dm_set_handler,corr,DM_SYSTEM,TRUE)) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + return FAULT_CPE_NO_FAULT_IDX; + } + + if (error = dm_get_system_data(corr,&serr)) + { + if (serr!=NULL) + { + free(serr); + } + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + if (serr!=NULL) + { + char buf[16]; + for (j=1;jtype == DM_REGEXP) + { + char *regexp; + regexp = (char *)data_handler[i]->handler; + if (regexp!=NULL && (error = dm_match_patterns(value,regexp))) + { + return FAULT_CPE_INVALID_PARAMETER_VALUE_IDX; + } + } + } + return FAULT_CPE_NO_FAULT_IDX; +} + + +int dm_node_setParameterValues (struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + + struct dm_input_setParameterValues *input; + char name[512]; + int len,error; + + if (node == NULL || node->type == DM_OBJECT || node->type == DM_INSTANCE) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + if (node->permission != DM_READ_WRITE) + { + return FAULT_CPE_NON_WRITABLE_PARAMETER_IDX; + } + + input = (struct dm_input_setParameterValues *)dm_rpc->input; + dm_rpc->subtree = FALSE; + + error = set_node_paramater_value(node,index_path,pos_xp,input->value,input->dm_set_handler); + + enqueue_apply_cancel_handlers(input->dm_set_handler,node_path,pos_np,index_path,pos_xp); + + return error; +} + +int cwmp_dm_setParameterValues(struct cwmp *cwmp, struct dm_set_handler *dm_set_handler, char *path, char *value) +{ + struct dm_rpc dm_rpc; + struct dm_input_setParameterValues input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + input.value = value; + input.dm_set_handler = dm_set_handler; + dm_rpc.input = &input; + dm_rpc.method = dm_node_setParameterValues; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} +/** + ------------------------------------------------------------- +| GetParameterAttributes Data Model API | + ------------------------------------------------------------- +**/ +int dm_list_add_ParameterAttributes(char *name, + struct dm_node *node, + struct list_head *list) +{ + struct cwmp1__ParameterAttributeStruct *ParameterAttributeStruct; + struct handler_ParameterAttributeStruct *handler_ParameterAttributeStruct; + struct list_head *ilist; + int is_active,is_passive,i; + char **ptr_AccessList; + extern const struct ACCESSLIST_CONST_STRUCT ACCESSLIST_CONST_ARRAY [COUNT_ACCESSLIST]; + + ParameterAttributeStruct = calloc(1,sizeof(struct cwmp1__ParameterAttributeStruct)); + handler_ParameterAttributeStruct = calloc(1,sizeof(struct handler_ParameterAttributeStruct)); + + if (ParameterAttributeStruct == NULL || + handler_ParameterAttributeStruct == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + ParameterAttributeStruct->Name = strdup(name); + + if((is_passive = cwmp_check_notification(name, UCI_NOTIFICATION_PASSIVE_PATH)) != CWMP_OK) + { + ParameterAttributeStruct->Notification = _cwmp1__ParameterAttributeStruct_Notification__1; + } + if((is_active = cwmp_check_notification(name, UCI_NOTIFICATION_ACTIVE_PATH)) != CWMP_OK) + { + ParameterAttributeStruct->Notification = _cwmp1__ParameterAttributeStruct_Notification__2; + } + if (!is_active && !is_passive) + { + ParameterAttributeStruct->Notification = _cwmp1__ParameterAttributeStruct_Notification__0; + } + ParameterAttributeStruct->AccessList = calloc(1,sizeof(struct cwmp1AccessList *)); + ptr_AccessList = calloc(sizearray(ACCESSLIST_CONST_ARRAY),sizeof(struct cwmp1AccessList *)); + if(ParameterAttributeStruct->AccessList==NULL || + ptr_AccessList == NULL) + { + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + ParameterAttributeStruct->AccessList->__ptrstring = ptr_AccessList; + for(i=0;iAccessList->__size++; + } + } + handler_ParameterAttributeStruct->ParameterAttributeStruct = ParameterAttributeStruct; + list_add_tail(&handler_ParameterAttributeStruct->list,list); + return FAULT_CPE_NO_FAULT_IDX; +} + +int dm_node_getParameterAttributes (struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + struct dm_input_getParameterAttributes *input; + char name[512]; + int len,error; + + input = (struct dm_input_getParameterAttributes *)dm_rpc->input; + + if (node == NULL || node->type == DM_OBJECT || node->type == DM_INSTANCE) + { + dm_rpc->subtree = TRUE; + return FAULT_CPE_NO_FAULT_IDX; + } + dm_rpc->subtree = FALSE; + name[0] = 0; + if (error = get_node_path_name(name, node, dm_rpc, node_path, pos_np, index_path, pos_xp)) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + dm_list_add_ParameterAttributes(name, node, input->list); + *(input->n) +=1; + + return FAULT_CPE_NO_FAULT_IDX; +} + +int cwmp_dm_getParameterAttributes(struct cwmp *cwmp, char *path, struct list_head *list, int *n) +{ + struct dm_rpc dm_rpc; + struct dm_input_getParameterAttributes input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + *n = 0; + input.list = list; + input.n = n; + dm_rpc.input = &input; + dm_rpc.method = dm_node_getParameterAttributes; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} + +int dm_getParameterAttributes (char *path) +{ + int n = 0; + int len_passive,len_active,len_denied,len1; + struct config_uci_list *notification; + LIST_HEAD(notification_list); + + len1 = 0; + len_denied = 0; + len_passive = 0; + len_active = 0; + + n = strlen(path); + + uci_get_list_value(UCI_NOTIFICATION_DENIED_PATH, ¬ification_list); + while(!list_empty(¬ification_list)) + { + notification = list_entry (notification_list.next, struct config_uci_list, list); + if((notification != NULL)) + { + len1 = strlen(notification->value); + if(strncmp(path,notification->value,len1) == 0) + { + if(len_deniedvalue); + if(strncmp(path,notification->value,len1) == 0) + { + if(len_passivevalue); + if(strncmp(path,notification->value,len1) == 0) + { + if(len_activelen_active)&&(len_denied>len_passive))) + { + return _cwmp1__SetParameterAttributesStruct_Notification__0; + } + if((len_passive>len_active)&&(len_passive>len_denied)) + { + return _cwmp1__SetParameterAttributesStruct_Notification__1; + } + if((len_active>len_passive)&&(len_active>len_denied)) + { + return _cwmp1__SetParameterAttributesStruct_Notification__2; + } + return _cwmp1__SetParameterAttributesStruct_Notification__0; +} +/** + ------------------------------------------------------------- +| SetParameterAttributes Data Model API | + ------------------------------------------------------------- +**/ +int dm_node_setParameterAttributes (struct dm_node *node, + struct dm_rpc *dm_rpc, + struct dm_node_path *node_path, + int pos_np, + struct dm_index_path *index_path, + int pos_xp) +{ + + struct dm_input_setParameterAttributes *input; + int len,error,i; + struct cwmp1__SetParameterAttributesStruct *ParameterAttributesStruct; + char **AccessList; + int size_AccessList = 0; + + input = (struct dm_input_setParameterAttributes *)dm_rpc->input; + + if (node == NULL) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + if (node != NULL) + { + dm_rpc->subtree = FALSE; + ParameterAttributesStruct = input->ParameterAttributesStruct; + switch(ParameterAttributesStruct->Notification) + { + case _cwmp1__SetParameterAttributesStruct_Notification__0: + if(error = cwmp_off_notification(node,*(ParameterAttributesStruct->Name), ParameterAttributesStruct->NotificationChange)) + { + uci_revert_value (); + return error; + } + break; + case _cwmp1__SetParameterAttributesStruct_Notification__1: + if(error = cwmp_apply_passive_notification(node,*(ParameterAttributesStruct->Name), ParameterAttributesStruct->NotificationChange)) + { + uci_revert_value (); + return error; + } + AccessList = ParameterAttributesStruct->AccessList->__ptrstring; + size_AccessList = ParameterAttributesStruct->AccessList->__size; + + for(i=0;iName), ParameterAttributesStruct->AccessListChange, *AccessList)) + { + uci_revert_value (); + return error; + } + AccessList++; + } + break; + case _cwmp1__SetParameterAttributesStruct_Notification__2: + if(error = cwmp_apply_active_notification(node,*(ParameterAttributesStruct->Name), ParameterAttributesStruct->NotificationChange)) + { + uci_revert_value (); + return error; + } + AccessList = ParameterAttributesStruct->AccessList->__ptrstring; + size_AccessList = ParameterAttributesStruct->AccessList->__size; + + for(i=0;iName), ParameterAttributesStruct->AccessListChange, *AccessList)) + { + uci_revert_value (); + return error; + } + AccessList++; + } + break; + } + } + + return FAULT_CPE_NO_FAULT_IDX; +} + +int cwmp_dm_setParameterAttributes(struct cwmp *cwmp, struct cwmp1__SetParameterAttributesStruct *ParameterAttributesStruct) +{ + struct dm_rpc dm_rpc; + struct dm_input_setParameterAttributes input; + int error; + char *path; + + path = *(ParameterAttributesStruct->Name); + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + input.ParameterAttributesStruct = ParameterAttributesStruct; + dm_rpc.input = &input; + dm_rpc.method = dm_node_setParameterAttributes; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} +/** + ------------------------------------------------ +| AddObject Data Model API | + ------------------------------------------------ +**/ +static int add_node_add_object (struct dm_node *node, + struct dm_index_path *index_path, + int pos_xp, + int *InstanceNumber, + char *path, + struct dm_set_handler *dm_set_handler) +{ + struct data_handler **data_handler; + unsigned short error,j; + __u8 size_dh,i; + char corr[256],*dm_system_output=NULL; + char instanceName[256]; + extern const struct ACCESSLIST_CONST_STRUCT ACCESSLIST_CONST_ARRAY [COUNT_ACCESSLIST]; + + data_handler = node->data_handler; + size_dh = node->size_data_handler; + for (i=0;itype == DM_SYSTEM) + { + struct dm_system *system; + system = (struct dm_system *)data_handler[i]->handler; + if (system->type != DM_ADD) + { + continue; + } + get_string_correspondence(corr,system->cmd,index_path,pos_xp-1); + + if (system->reboot_required) + { + dm_set_handler->reboot_required = TRUE; + } + + if (error = dm_get_system_data(corr,&dm_system_output)) + { + if (dm_system_output!=NULL) + { + free(dm_system_output); + } + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + if (dm_system_output!=NULL) + { + char buf[16]; + for (j=1;jindex_path; + + if (node == NULL || node->type == DM_OBJECT || node->type == DM_PARAMETER || exp->index != NULL) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + if (node->permission != DM_CREATE) + { + return FAULT_CPE_REQUEST_DENIED_IDX; + } + + input = (struct dm_input_addObject *)dm_rpc->input; + dm_rpc->subtree = FALSE; + + error = add_node_add_object(node,index_path,pos_xp,input->n,input->path,input->dm_set_handler); + + enqueue_apply_cancel_handlers(input->dm_set_handler,node_path,pos_np,index_path,pos_xp); + + return error; +} + +int cwmp_dm_addObject(struct cwmp *cwmp, struct dm_set_handler *dm_set_handler, char *path, int *n) +{ + struct dm_rpc dm_rpc; + struct dm_input_addObject input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + *n = 0; + input.path = path; + input.n = n; + input.dm_set_handler = dm_set_handler; + dm_rpc.input = &input; + dm_rpc.method = dm_node_addObject; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} +/** + ------------------------------------------------ +| DeleteObject Data Model API | + ------------------------------------------------ +**/ +static int del_node_delete_object (struct dm_node *node, + struct dm_index_path *index_path, + int pos_xp, + char *path, + struct dm_set_handler *dm_set_handler) +{ + struct data_handler **data_handler; + unsigned short error,j; + __u8 size_dh,i; + char corr[256],*dm_system_output=NULL; + + data_handler = node->data_handler; + size_dh = node->size_data_handler; + for (i=0;itype == DM_SYSTEM) + { + struct dm_system *system; + system = (struct dm_system *)data_handler[i]->handler; + if (system->type != DM_DEL) + { + continue; + } + get_string_correspondence(corr,system->cmd,index_path,pos_xp-1); + + sprintf(corr,"%s %s",corr,path); + + if (system->reboot_required) + { + dm_set_handler->reboot_required = TRUE; + } + + if (error = dm_get_system_data(corr,&dm_system_output)) + { + if (dm_system_output!=NULL) + { + free(dm_system_output); + } + return FAULT_CPE_INTERNAL_ERROR_IDX; + } + + if (dm_system_output!=NULL) + { + char buf[16]; + for (j=1;jindex_path; + + if (node == NULL || node->type == DM_OBJECT || node->type == DM_PARAMETER || exp->index == NULL) + { + return FAULT_CPE_INVALID_PARAMETER_NAME_IDX; + } + + if (node->permission != DM_CREATE) + { + return FAULT_CPE_REQUEST_DENIED_IDX; + } + + input = (struct dm_input_deleteObject *)dm_rpc->input; + dm_rpc->subtree = FALSE; + + error = del_node_delete_object(node,index_path,pos_xp,input->path,input->dm_set_handler); + + enqueue_apply_cancel_handlers(input->dm_set_handler,node_path,pos_np,index_path,pos_xp); + + return error; +} + +int cwmp_dm_deleteObject(struct cwmp *cwmp, struct dm_set_handler *dm_delete_handler, char *path) +{ + struct dm_rpc dm_rpc; + struct dm_input_deleteObject input; + int error; + + memset(&dm_rpc,0,sizeof(struct dm_rpc)); + + input.path = path; + input.dm_set_handler = dm_delete_handler; + dm_rpc.input = &input; + dm_rpc.method = dm_node_deleteObject; + + error = dm_browse_tree (path, &dm_rpc); + + return error; +} diff --git a/src/event.c b/src/event.c new file mode 100644 index 0000000..666b069 --- /dev/null +++ b/src/event.c @@ -0,0 +1,485 @@ +/* + event.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ +#include +#include "cwmp.h" +#include "backupSession.h" +#include "dm.h" +#include "dm_rpc.h" + +struct rpc_acs *cwmp_add_session_rpc_acs_getRPCMethods (struct session *session); +struct rpc_acs *cwmp_add_session_rpc_acs_transferComplete (struct session *session); +struct session *cwmp_add_queue_session (struct cwmp *cwmp); +void backup_session_insert_rpc(char *name, char *commandKey, int status); +void backup_session_delete_rpc(char *name, char *commandKey, int status); +void backup_session_insert_event(char *name, char *commandKey, int id, int rpc_status); +void backup_session_insert_parameter(char *name, char *value, char *parent,char *parent_name, int id, char *commandKey); +int cwmp_scheduleInform_remove_all(); +int cwmp_scheduledDownload_remove_all(); + + +const struct EVENT_CONST_STRUCT EVENT_CONST [] = { + [EVENT_IDX_0BOOTSTRAP] = {"0 BOOTSTRAP", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_1BOOT] = {"1 BOOT", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL}, + [EVENT_IDX_2PERIODIC] = {"2 PERIODIC", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_3SCHEDULED] = {"3 SCHEDULED", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_4VALUE_CHANGE] = {"4 VALUE CHANGE", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL}, + [EVENT_IDX_5KICKED] = {"5 KICKED", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_6CONNECTION_REQUEST] = {"6 CONNECTION REQUEST", EVENT_TYPE_SINGLE, 0}, + [EVENT_IDX_7TRANSFER_COMPLETE] = {"7 TRANSFER COMPLETE", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_8DIAGNOSTICS_COMPLETE] = {"8 DIAGNOSTICS COMPLETE", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL}, + [EVENT_IDX_9REQUEST_DOWNLOAD] = {"9 REQUEST DOWNLOAD", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_10AUTONOMOUS_TRANSFER_COMPLETE] = {"10 AUTONOMOUS TRANSFER COMPLETE", EVENT_TYPE_SINGLE, EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_M_Reboot] = {"M Reboot", EVENT_TYPE_MULTIPLE,EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_M_ScheduleInform] = {"M ScheduleInform", EVENT_TYPE_MULTIPLE,EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_M_Download] = {"M Download", EVENT_TYPE_MULTIPLE,EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT}, + [EVENT_IDX_M_Upload] = {"M Upload", EVENT_TYPE_MULTIPLE,EVENT_RETRY_AFTER_TRANSMIT_FAIL|EVENT_RETRY_AFTER_REBOOT} +}; + + +void cwmp_save_event_container (struct cwmp *cwmp,struct event_container *event_container) +{ + + struct cwmp1__EventStruct *pEventStruct; + struct list_head *ilist; + struct paramater_container *paramater_container; + struct cwmp1__ParameterValueStruct *ptr_ParameterValueStruct; + char section[256]; + + pEventStruct = &(event_container->event); + if (EVENT_CONST[event_container->idx].RETRY != 0) + { + backup_session_insert_rpc("Inform",NULL,RPC_QUEUE); + backup_session_insert_event(pEventStruct->EventCode, pEventStruct->CommandKey, event_container->id, RPC_QUEUE); + + __list_for_each(ilist,&(event_container->head_paramater_container)) + { + paramater_container = list_entry(ilist, struct paramater_container, list); + ptr_ParameterValueStruct = &(paramater_container->paramater); + backup_session_insert_parameter(ptr_ParameterValueStruct->Name,NULL,"event",pEventStruct->EventCode,event_container->id,pEventStruct->CommandKey); + } + } + return; +} + +struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_idx, char *command_key) +{ + static unsigned int id; + struct event_container *event_container; + struct session *session; + struct list_head *ilist; + + if (cwmp->head_event_container == NULL) + { + session = cwmp_add_queue_session(cwmp); + if (session == NULL) + { + return NULL; + } + cwmp->head_event_container = &(session->head_event_container); + } + session = list_entry (cwmp->head_event_container, struct session,head_event_container); + __list_for_each(ilist, cwmp->head_event_container) + { + event_container = list_entry (ilist, struct event_container, list); + if (event_container->idx==event_idx && + EVENT_CONST[event_idx].TYPE==EVENT_TYPE_SINGLE) + { + return event_container; + } + if(event_container->idx > event_idx) + { + break; + } + } + event_container = calloc (1,sizeof(struct event_container)); + if (event_container==NULL) + { + return NULL; + } + INIT_LIST_HEAD (&(event_container->head_paramater_container)); + list_add (&(event_container->list), ilist->prev); + event_container->event.EventCode = strdup(EVENT_CONST[event_idx].CODE); + event_container->event.CommandKey = strdup(command_key); + if((id<0) || (id>=MAX_INT_ID) ) + { + id=0; + } + id++; + event_container->id = id; + event_container->idx = event_idx; + session->event_size++; + return event_container; +} + +struct paramater_container *cwmp_add_parameter_container + (struct cwmp *cwmp, + struct event_container *event_container, + char *name) +{ + struct paramater_container *paramater_container; + struct cwmp1__ParameterValueStruct *ptr_ParameterValueStruct; + struct list_head *ilist; + struct session *session; + + __list_for_each(ilist,&(event_container->head_paramater_container)) + { + paramater_container = list_entry(ilist, struct paramater_container, list); + ptr_ParameterValueStruct = &(paramater_container->paramater); + if(strcmp(ptr_ParameterValueStruct->Name,name)==0) + { + return paramater_container; + } + } + paramater_container = calloc (1, sizeof(struct paramater_container)); + if(paramater_container == NULL) + { + return NULL; + } + paramater_container->paramater.Name = strdup(name); + list_add_tail(&(paramater_container->list), &(event_container->head_paramater_container)); + session = list_entry (cwmp->head_event_container, struct session,head_event_container); + session->parameter_size++; + return paramater_container; +} + +int cwmp_root_cause_event_boot (struct cwmp *cwmp) +{ + struct event_container *event_container; + if (cwmp->env.boot == CWMP_START_BOOT) + { + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + cwmp->env.boot = 0; + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_1BOOT, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + cwmp_save_event_container (cwmp,event_container); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + } + return CWMP_OK; +} +int event_remove_all_event_container(struct session *session, int rem_from) +{ + struct cwmp1__EventStruct *eventStruct; + struct event_container *event_container; + struct paramater_container *paramater_container; + struct cwmp1__ParameterValueStruct *paramater; + + while (session->head_event_container.next!=&(session->head_event_container)) + { + event_container = list_entry(session->head_event_container.next, struct event_container, list); + eventStruct = &(event_container->event); + if (eventStruct->EventCode!=NULL) + { + free (eventStruct->EventCode); + } + if (eventStruct->CommandKey!=NULL) + { + free (eventStruct->CommandKey); + } + while (event_container->head_paramater_container.next!=&(event_container->head_paramater_container)) + { + paramater_container = list_entry(event_container->head_paramater_container.next, struct paramater_container, list); + paramater = &(paramater_container->paramater); + if (paramater->Name!=NULL) + { + free (paramater->Name); + } + if (paramater->Value!=NULL) + { + free(paramater->Value); + } + list_del(&(paramater_container->list)); + free(paramater_container); + } + list_del(&(event_container->list)); + free (event_container); + } + session->event_size = 0; + session->parameter_size = 0; + backup_session_delete_rpc("Inform",NULL,rem_from); + return CWMP_OK; +} + +int cwmp_root_cause_event_bootstrap (struct cwmp *cwmp) +{ + char *acsurl = NULL; + int error,cmp=0; + struct event_container *event_container; + struct session *session; + + error = cwmp_load_saved_session(cwmp, &acsurl, ACS); + + if(acsurl == NULL) + { + save_acs_bkp_config (cwmp); + } + + if (acsurl == NULL || ((acsurl != NULL)&&(cmp = strcmp(cwmp->conf.acsurl,acsurl)))) + { + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + if (cwmp->head_event_container!=NULL && cwmp->head_session_queue.next!=&(cwmp->head_session_queue)) + { + session = list_entry(cwmp->head_event_container,struct session, head_event_container); + event_remove_all_event_container (session,RPC_QUEUE); + } + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_0BOOTSTRAP, ""); + if (acsurl != NULL) + { + free(acsurl); + } + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + cwmp_save_event_container (cwmp,event_container); + cwmp_scheduleInform_remove_all(); + cwmp_scheduledDownload_remove_all(); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + } + + if (cmp) + { + struct paramater_container *paramater_container; + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_4VALUE_CHANGE, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + paramater_container = cwmp_add_parameter_container (cwmp,event_container, "InternetGatewayDevice.ManagementServer.URL"); + cwmp_save_event_container (cwmp,event_container); + save_acs_bkp_config (cwmp); + cwmp_scheduleInform_remove_all(); + cwmp_scheduledDownload_remove_all(); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + } + + return CWMP_OK; +} + +int cwmp_root_cause_TransferComplete (struct cwmp *cwmp) +{ + struct event_container *event_container; + struct session *session; + struct rpc_acs *rpc_acs; + struct _cwmp1__TransferComplete *p; + + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_7TRANSFER_COMPLETE, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + session = list_entry (cwmp->head_event_container, struct session,head_event_container); + if((rpc_acs = cwmp_add_session_rpc_acs_transferComplete (session)) == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + p = (struct _cwmp1__TransferComplete *) rpc_acs->method_data; + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_M_Download, p->CommandKey); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_OK; +} + +int cwmp_root_cause_getRPCMethod (struct cwmp *cwmp) +{ + char acsurl[256]; + int error,cmp=0; + struct event_container *event_container; + struct session *session; + + if (cwmp->env.periodic == CWMP_START_PERIODIC) + { + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + cwmp->env.periodic = 0; + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_2PERIODIC, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + cwmp_save_event_container (cwmp,event_container); + session = list_entry (cwmp->head_event_container, struct session,head_event_container); + if(cwmp_add_session_rpc_acs_getRPCMethods (session) == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + } + + return CWMP_OK; +} + +int cwmp_root_cause_event_iccu_value_change (struct cwmp *cwmp) +{ + struct event_container *event_container; + if (cwmp->env.iccu == CWMP_START_ICCU) + { + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + cwmp->env.iccu = 0; + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_4VALUE_CHANGE, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + cwmp_add_parameter_container (cwmp, event_container, "InternetGatewayDevice.ManagementServer.ConnectionRequestURL"); + cwmp_save_event_container (cwmp,event_container); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + } + return CWMP_OK; +} + +int cwmp_root_cause_event_api_value_change(struct cwmp *cwmp, struct session *session) +{ + struct event_container *event_container; + struct list_head *ilist; + + if (cwmp->api_value_change.parameter_list.next != &(cwmp->api_value_change.parameter_list)) + { + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + pthread_mutex_lock (&(cwmp->api_value_change.mutex)); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_4VALUE_CHANGE, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->api_value_change.mutex)); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + return CWMP_MEM_ERR; + } + __list_for_each(ilist,&(cwmp->api_value_change.parameter_list)) + { + struct handler_ParameterValueStruct *handler_ParameterValueStruct; + handler_ParameterValueStruct = list_entry(ilist,struct handler_ParameterValueStruct,list); + cwmp_add_parameter_container (cwmp, event_container, handler_ParameterValueStruct->ParameterValueStruct->Name); + ilist = ilist->prev; + list_del(&(handler_ParameterValueStruct->list)); + free (handler_ParameterValueStruct->ParameterValueStruct->Name); + free (handler_ParameterValueStruct->ParameterValueStruct); + free (handler_ParameterValueStruct); + } + cwmp->api_value_change.parameter_size = 0; + cwmp_save_event_container (cwmp,event_container); + pthread_mutex_unlock (&(cwmp->api_value_change.mutex)); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + } + return CWMP_OK; +} + +void *thread_event_periodic (void *v) +{ + struct cwmp *cwmp = (struct cwmp *) v; + struct event_container *event_container; + static int periodic_interval; + static bool periodic_enable; + static struct timespec periodic_timeout = {0, 0}; + + periodic_interval = cwmp->conf.period; + periodic_enable = cwmp->conf.periodic_enable; + + for(;;) + { + pthread_mutex_lock (&(cwmp->mutex_periodic)); + periodic_timeout.tv_sec = time(NULL) + periodic_interval; + if (cwmp->conf.periodic_enable) + { + pthread_cond_timedwait(&(cwmp->threshold_periodic), &(cwmp->mutex_periodic), &periodic_timeout); + } + else + { + pthread_cond_wait(&(cwmp->threshold_periodic), &(cwmp->mutex_periodic)); + } + pthread_mutex_unlock (&(cwmp->mutex_periodic)); + if (periodic_interval != cwmp->conf.period || periodic_enable != cwmp->conf.periodic_enable) + { + periodic_enable = cwmp->conf.periodic_enable; + periodic_interval = cwmp->conf.period; + continue; + } + CWMP_LOG(INFO,"Periodic thread: add periodic event in the queue"); + pthread_mutex_lock (&(cwmp->mutex_session_queue)); + event_container = cwmp_add_event_container (cwmp, EVENT_IDX_2PERIODIC, ""); + if (event_container == NULL) + { + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + continue; + } + cwmp_save_event_container (cwmp,event_container); + pthread_mutex_unlock (&(cwmp->mutex_session_queue)); + pthread_cond_signal(&(cwmp->threshold_session_send)); + } + return CWMP_OK; +} + +int cwmp_root_cause_event_periodic (struct cwmp *cwmp) +{ + static int period = 0; + static bool periodic_enable = FALSE; + if (period==cwmp->conf.period && periodic_enable==cwmp->conf.periodic_enable) + { + return CWMP_OK; + } + period = cwmp->conf.period; + periodic_enable = cwmp->conf.periodic_enable; + CWMP_LOG(INFO,periodic_enable?"Periodic event is enabled. Interval period = %ds":"Periodic event is disabled", period); + pthread_cond_signal(&(cwmp->threshold_periodic)); + return CWMP_OK; +} + +int cwmp_root_cause_events (struct cwmp *cwmp) +{ + int error; + + if (error = cwmp_root_cause_event_bootstrap(cwmp)) + { + return error; + } + + if (error = cwmp_root_cause_event_boot(cwmp)) + { + return error; + } + + if (error = cwmp_root_cause_event_iccu_value_change(cwmp)) + { + return error; + } + + if (error = cwmp_root_cause_getRPCMethod(cwmp)) + { + return error; + } + + if (error = cwmp_root_cause_event_periodic(cwmp)) + { + return error; + } + return CWMP_OK; +} + diff --git a/src/httpda.c b/src/httpda.c new file mode 100644 index 0000000..62fd47b --- /dev/null +++ b/src/httpda.c @@ -0,0 +1,710 @@ +/* + httpda.c + + gSOAP HTTP Digest Authentication plugin. + Supports both Basic and Digest authentication. + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#include "httpda.h" + +#ifdef __cplusplus +extern "C" { +#endif + +const char http_da_id[12] = HTTP_DA_ID; + +/* session database and lock */ +static struct http_da_session *http_da_session = NULL; +static MUTEX_TYPE http_da_session_lock; + +#define HTTP_DA_NONCELEN 21 +#define HTTP_DA_OPAQUELEN 9 + +/******************************************************************************\ + * + * Forward decls + * +\******************************************************************************/ + +static int http_da_init(struct soap *soap, struct http_da_data *data); +static int http_da_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); +static void http_da_delete(struct soap *soap, struct soap_plugin *p); + +static int http_da_post_header(struct soap *soap, const char *key, const char *val); +static int http_da_parse_header(struct soap *soap, const char *key, const char *val); +static int http_da_prepareinit(struct soap *soap); +static int http_da_preparesend(struct soap *soap, const char *buf, size_t len); +static int http_da_preparerecv(struct soap *soap, const char *buf, size_t len); +static int http_da_disconnect(struct soap *soap); + +static int http_da_verify_method(struct soap *soap, char *method, char *passwd); +static void http_da_session_start(const char *realm, const char *nonce, const char *opaque); +static int http_da_session_update(const char *realm, const char *nonce, const char *opaque, const char *cnonce, const char *ncount); +static void http_da_session_cleanup(); + +void http_da_calc_nonce(struct soap *soap, char nonce[HTTP_DA_NONCELEN]); +void http_da_calc_opaque(struct soap *soap, char opaque[HTTP_DA_OPAQUELEN]); +static void http_da_calc_HA1(struct soap *soap, void **context, char *alg, char *userid, char *realm, char *passwd, char *nonce, char *cnonce, char HA1hex[33]); +static void http_da_calc_response(struct soap *soap, void **context, char HA1hex[33], char *nonce, char *ncount, char *cnonce, char *qop, char *method, char *uri, char entityHAhex[33], char response[33]); + +/******************************************************************************\ + * + * Plugin registry + * +\******************************************************************************/ + +int http_da(struct soap *soap, struct soap_plugin *p, void *arg) +{ + p->id = http_da_id; + p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_da_data)); + p->fcopy = http_da_copy; + p->fdelete = http_da_delete; + if (p->data) + { + if (http_da_init(soap, (struct http_da_data*)p->data)) + { + SOAP_FREE(soap, p->data); + return SOAP_EOM; + } + } + return SOAP_OK; +} + +static int http_da_init(struct soap *soap, struct http_da_data *data) +{ + data->fposthdr = soap->fposthdr; + soap->fposthdr = http_da_post_header; + data->fparsehdr = soap->fparsehdr; + soap->fparsehdr = http_da_parse_header; + data->fprepareinit = soap->fprepareinit; + soap->fprepareinit = http_da_prepareinit; + data->context = NULL; + memset(data->digest, 0, sizeof(data->digest)); + + return SOAP_OK; +} + +static int http_da_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) +{ + *dst = *src; + dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_da_data)); + memcpy(dst->data, src->data, sizeof(struct http_da_data)); + ((struct http_da_data*)dst->data)->context = NULL; + memset(((struct http_da_data*)dst->data)->digest, 0, sizeof(((struct http_da_data*)dst->data)->digest)); + ((struct http_da_data*)dst->data)->nonce = NULL; + ((struct http_da_data*)dst->data)->opaque = NULL; + ((struct http_da_data*)dst->data)->qop = NULL; + ((struct http_da_data*)dst->data)->alg = NULL; + ((struct http_da_data*)dst->data)->nc = 0; + ((struct http_da_data*)dst->data)->ncount = NULL; + ((struct http_da_data*)dst->data)->cnonce = NULL; + ((struct http_da_data*)dst->data)->response = NULL; + return SOAP_OK; +} + +static void http_da_delete(struct soap *soap, struct soap_plugin *p) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + if (data) + { + if (data->context) + md5_handler(soap, &data->context, MD5_DELETE, NULL, 0); + SOAP_FREE(soap, data); + } +} + +/******************************************************************************\ + * + * Callbacks + * +\******************************************************************************/ + +static int http_da_post_header(struct soap *soap, const char *key, const char *val) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + + if (!data) + return SOAP_PLUGIN_ERROR; + + /* client's HTTP Authorization response */ + if (key && !strcmp(key, "Authorization")) + { + char HA1[33], entityHAhex[33], response[33]; + char cnonce[HTTP_DA_NONCELEN]; + char ncount[9]; + char *qop, *method; + + md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0); + + http_da_calc_nonce(soap, cnonce); + http_da_calc_HA1(soap, &data->context, data->alg, soap->userid, soap->authrealm, soap->passwd, data->nonce, cnonce, HA1); + + if (data->qop && !soap_tag_cmp(data->qop, "*auth-int*")) + { + qop = "auth-int"; + soap_s2hex(soap, (unsigned char*)data->digest, entityHAhex, 16); + } + else if (data->qop) + qop = "auth"; + else + qop = NULL; + + if (soap->status == SOAP_GET) + method = "GET"; + else + method = "POST"; + + sprintf(ncount, "%8.8lx", data->nc++); + + http_da_calc_response(soap, &data->context, HA1, data->nonce, ncount, cnonce, qop, method, soap->path, entityHAhex, response); + + sprintf(soap->tmpbuf, "Digest realm=\"%s\", username=\"%s\", nonce=\"%s\", uri=\"%s\", nc=%s, cnonce=\"%s\", response=\"%s\"", soap->authrealm, soap->userid, data->nonce, soap->path, ncount, cnonce, response); + if (data->opaque) + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ", opaque=\"%s\"", data->opaque); + if (qop) + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ", qop=\"%s\"", qop); + + return data->fposthdr(soap, key, soap->tmpbuf); + } + + /* server's HTTP Authorization response */ + if (key && !strcmp(key, "WWW-Authenticate")) + { + char nonce[HTTP_DA_NONCELEN]; + char opaque[HTTP_DA_OPAQUELEN]; + + http_da_calc_nonce(soap, nonce); + http_da_calc_opaque(soap, opaque); + + http_da_session_start(soap->authrealm, nonce, opaque); + + sprintf(soap->tmpbuf, "Digest realm=\"%s\", qop=\"auth,auth-int\", nonce=\"%s\", opaque=\"%s\"", soap->authrealm, nonce, opaque); + + return data->fposthdr(soap, key, soap->tmpbuf); + } + + return data->fposthdr(soap, key, val); +} + +static int http_da_parse_header(struct soap *soap, const char *key, const char *val) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + + if (!data) + return SOAP_PLUGIN_ERROR; + + /* check if server received Authorization Digest HTTP header from client */ + if (!soap_tag_cmp(key, "Authorization") && !soap_tag_cmp(val, "Digest *")) + { + soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); + soap->userid = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "username")); + soap->passwd = NULL; + data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); + data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); + data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); + data->alg = NULL; + data->ncount = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nc")); + data->cnonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "cnonce")); + data->response = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "response")); + if (data->qop && !soap_tag_cmp(data->qop, "auth-int")) + { + if (soap->fpreparerecv != http_da_preparerecv) + { + data->fpreparerecv = soap->fpreparerecv; + soap->fpreparerecv = http_da_preparerecv; + } + if (soap->fdisconnect != http_da_disconnect) + { + data->fdisconnect = soap->fdisconnect; + soap->fdisconnect = http_da_disconnect; + } + md5_handler(soap, &data->context, MD5_INIT, NULL, 0); + } + return SOAP_OK; + } + + /* check if client received WWW-Authenticate Digest HTTP header from server */ + if (!soap_tag_cmp(key, "WWW-Authenticate") && !soap_tag_cmp(val, "Digest *")) + { + soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "realm")); + data->nonce = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "nonce")); + data->opaque = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "opaque")); + data->qop = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "qop")); + data->alg = soap_strdup(soap, soap_get_header_attribute(soap, val + 7, "algorithm")); + data->nc = 1; + data->ncount = NULL; + data->cnonce = NULL; + data->response = NULL; + return SOAP_OK; + } + + return data->fparsehdr(soap, key, val); +} + +static int http_da_prepareinit(struct soap *soap) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + + if (!data) + return SOAP_PLUGIN_ERROR; + + if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MIME))) + { /* TODO: handle attachments automatically, does not work yet */ + soap->mode &= ~SOAP_IO; + soap->mode |= SOAP_IO_STORE; + } + else + { + if (soap->fpreparerecv == http_da_preparerecv) + soap->fpreparerecv = data->fpreparerecv; + if (soap->fdisconnect == http_da_disconnect) + soap->fdisconnect = data->fdisconnect; + + if (soap->userid && soap->passwd) + { + md5_handler(soap, &data->context, MD5_INIT, NULL, 0); + if (soap->fpreparesend != http_da_preparesend) + { + data->fpreparesend = soap->fpreparesend; + soap->fpreparesend = http_da_preparesend; + } + } + + if (data->fprepareinit) + return data->fprepareinit(soap); + } + + return SOAP_OK; +} + +static int http_da_preparesend(struct soap *soap, const char *buf, size_t len) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + + if (!data) + return SOAP_PLUGIN_ERROR; + + md5_handler(soap, &data->context, MD5_UPDATE, (char*)buf, len); + + if (data->fpreparesend) + return data->fpreparesend(soap, buf, len); + + return SOAP_OK; +} + +static int http_da_preparerecv(struct soap *soap, const char *buf, size_t len) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + + if (!data) + return SOAP_PLUGIN_ERROR; + + md5_handler(soap, &data->context, MD5_UPDATE, (char*)buf, len); + + if (data->fpreparerecv) + return data->fpreparerecv(soap, buf, len); + + return SOAP_OK; +} + +static int http_da_disconnect(struct soap *soap) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + + if (!data) + return SOAP_PLUGIN_ERROR; + + md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0); + + soap->fpreparerecv = data->fpreparerecv; + soap->fdisconnect = data->fdisconnect; + + if (soap->fdisconnect) + return soap->fdisconnect(soap); + + return SOAP_OK; +} + +/******************************************************************************\ + * + * Client-side digest authentication state management + * +\******************************************************************************/ + +void http_da_save(struct soap *soap, struct http_da_info *info, const char *realm, const char *userid, const char *passwd) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + if (!data) + return; + info->authrealm = soap->authrealm = soap_strdup(NULL, realm); + info->userid = soap->userid = soap_strdup(NULL, userid); + info->passwd = soap->passwd = soap_strdup(NULL, passwd); + info->nonce = soap_strdup(NULL, data->nonce); + info->opaque = soap_strdup(NULL, data->opaque); + info->qop = soap_strdup(NULL, data->qop); + info->alg = soap_strdup(NULL, data->alg); +} + +void http_da_restore(struct soap *soap, struct http_da_info *info) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + if (!data) + return; + soap->authrealm = info->authrealm; + soap->userid = info->userid; + soap->passwd = info->passwd; + data->nonce = info->nonce; + data->opaque = info->opaque; + data->qop = info->qop; + data->alg = info->alg; +} + +void http_da_release(struct soap *soap, struct http_da_info *info) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + if (!data) + return; + + soap->authrealm = NULL; + soap->userid = NULL; + soap->passwd = NULL; + data->nonce = NULL; + data->opaque = NULL; + data->qop = NULL; + data->alg = NULL; + + if (info->authrealm) + { + free(info->authrealm); + info->authrealm = NULL; + } + if (info->userid) + { + free(info->userid); + info->userid = NULL; + } + if (info->passwd) + { + free(info->passwd); + info->passwd = NULL; + } + if (info->nonce) + { + free(info->nonce); + info->nonce = NULL; + } + if (info->opaque) + { + free(info->opaque); + info->opaque = NULL; + } + if (info->qop) + { + free(info->qop); + info->qop = NULL; + } + if (info->alg) + { + free(info->alg); + info->alg = NULL; + } +} + +/******************************************************************************\ + * + * Server-side digest authentication verification + * +\******************************************************************************/ + +int http_da_verify_post(struct soap *soap, char *passwd) +{ + return http_da_verify_method(soap, "POST", passwd); +} + +int http_da_verify_get(struct soap *soap, char *passwd) +{ + return http_da_verify_method(soap, "GET", passwd); +} + +static int http_da_verify_method(struct soap *soap, char *method, char *passwd) +{ + struct http_da_data *data = (struct http_da_data*)soap_lookup_plugin(soap, http_da_id); + char HA1[33], entityHAhex[33], response[33]; + + if (!data) + return SOAP_ERR; + + /* reject if none or basic authentication was used */ + if (!soap->authrealm + || !soap->userid + || soap->passwd) /* passwd is set when basic auth is used */ + return SOAP_ERR; + + /* require at least qop="auth" to prevent replay attacks */ + if (!data->qop) + return SOAP_ERR; + + if (http_da_session_update(soap->authrealm, data->nonce, data->opaque, data->cnonce, data->ncount)) + return SOAP_ERR; + + http_da_calc_HA1(soap, &data->context, NULL, soap->userid, soap->authrealm, passwd, data->nonce, data->cnonce, HA1); + + if (!soap_tag_cmp(data->qop, "auth-int")) + soap_s2hex(soap, (unsigned char*)data->digest, entityHAhex, 16); + + http_da_calc_response(soap, &data->context, HA1, data->nonce, data->ncount, data->cnonce, data->qop, method, soap->path, entityHAhex, response); + +#ifdef SOAP_DEBUG + fprintf(stderr, "Debug message: verifying client response=%s with calculated digest=%s\n", data->response, response); +#endif + + /* check digest response values */ + if (strcmp(data->response, response)) + return SOAP_ERR; + + return SOAP_OK; +} + +/******************************************************************************\ + * + * Digest authentication session database management + * +\******************************************************************************/ + +static void http_da_session_start(const char *realm, const char *nonce, const char *opaque) +{ + struct http_da_session *session; + time_t now = time(NULL); + + if (now % 10 == 0) /* don't do this all the time to improve efficiency */ + http_da_session_cleanup(); + +#ifdef SOAP_DEBUG + fprintf(stderr, "Starting session realm=%s nonce=%s\n", realm, nonce); +#endif + + MUTEX_LOCK(http_da_session_lock); + + session = (struct http_da_session*)malloc(sizeof(struct http_da_session)); + if (session) + { + session->next = http_da_session; + session->modified = now; + session->realm = soap_strdup(NULL, realm); + session->nonce = soap_strdup(NULL, nonce); + session->opaque = soap_strdup(NULL, opaque); + session->nc = 0; + http_da_session = session; + } + + MUTEX_UNLOCK(http_da_session_lock); +} + +static int http_da_session_update(const char *realm, const char *nonce, const char *opaque, const char *cnonce, const char *ncount) +{ + struct http_da_session *session; + + if (!realm || !nonce || !opaque || !cnonce || !ncount) + return SOAP_ERR; + +#ifdef SOAP_DEBUG + fprintf(stderr, "Debug message: updating session realm=%s nonce=%s\n", realm, nonce); +#endif + + MUTEX_LOCK(http_da_session_lock); + + for (session = http_da_session; session; session = session->next) + if (!strcmp(session->realm, realm) && !strcmp(session->nonce, nonce) && !strcmp(session->opaque, opaque)) + break; + + if (session) + { + unsigned long nc = soap_strtoul(ncount, NULL, 16); + + if (session->nc >= nc) + { + session->modified = 0; /* replay attack: terminate session */ + session = NULL; + } + else + { + session->nc = nc; + session->modified = time(NULL); + } + } + + MUTEX_UNLOCK(http_da_session_lock); + + if (!session) + return SOAP_ERR; + + return SOAP_OK; +} + +static void http_da_session_cleanup() +{ + struct http_da_session **session; + time_t now = time(NULL); + + MUTEX_LOCK(http_da_session_lock); + + session = &http_da_session; + while (*session) + { + if ((*session)->modified + HTTP_DA_SESSION_TIMEOUT < now) + { + struct http_da_session *p = *session; + +#ifdef SOAP_DEBUG + fprintf(stderr, "Deleting session realm=%s nonce=%s\n", p->realm, p->nonce); +#endif + + if (p->realm) + free(p->realm); + if (p->nonce) + free(p->nonce); + if (p->opaque) + free(p->opaque); + + *session = p->next; + free(p); + } + else + session = &(*session)->next; + } + + MUTEX_UNLOCK(http_da_session_lock); +} + +/******************************************************************************\ + * + * Calculate hex nonce and opaque values + * +\******************************************************************************/ + +void http_da_calc_nonce(struct soap *soap, char nonce[HTTP_DA_NONCELEN]) +{ + static short count = 0xCA53; + sprintf(nonce, "%8.8x%4.4hx%8.8x", (int)time(NULL), count++, soap_random); +} + +void http_da_calc_opaque(struct soap *soap, char opaque[HTTP_DA_OPAQUELEN]) +{ + sprintf(opaque, "%8.8x", soap_random); +} + +/******************************************************************************\ + * + * Calculate HA1, HA2, and response digest as per RFC 2617 specification + * +\******************************************************************************/ + +static void http_da_calc_HA1(struct soap *soap, void **context, char *alg, char *userid, char *realm, char *passwd, char *nonce, char *cnonce, char HA1hex[33]) +{ + char HA1[16]; + + md5_handler(soap, context, MD5_INIT, NULL, 0); + md5_handler(soap, context, MD5_UPDATE, userid, strlen(userid)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, realm, strlen(realm)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, passwd, strlen(passwd)); + md5_handler(soap, context, MD5_FINAL, HA1, 0); + + if (alg && !soap_tag_cmp(alg, "MD5-sess")) + { + md5_handler(soap, context, MD5_INIT, NULL, 0); + md5_handler(soap, context, MD5_UPDATE, HA1, 16); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, nonce, strlen(nonce)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, cnonce, strlen(cnonce)); + md5_handler(soap, context, MD5_FINAL, HA1, 0); + }; + + soap_s2hex(soap, (unsigned char*)HA1, HA1hex, 16); +}; + +static void http_da_calc_response(struct soap *soap, void **context, char HA1hex[33], char *nonce, char *ncount, char *cnonce, char *qop, char *method, char *uri, char entityHAhex[33], char response[33]) +{ + char HA2[16], HA2hex[33], responseHA[16]; + + md5_handler(soap, context, MD5_INIT, NULL, 0); + md5_handler(soap, context, MD5_UPDATE, method, strlen(method)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, uri, strlen(uri)); + if (!soap_tag_cmp(qop, "auth-int")) + { + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, entityHAhex, 32); + } + md5_handler(soap, context, MD5_FINAL, HA2, 0); + + soap_s2hex(soap, (unsigned char*)HA2, HA2hex, 16); + + md5_handler(soap, context, MD5_INIT, NULL, 0); + md5_handler(soap, context, MD5_UPDATE, HA1hex, 32); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, nonce, strlen(nonce)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + if (qop && *qop) + { + md5_handler(soap, context, MD5_UPDATE, ncount, strlen(ncount)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, cnonce, strlen(cnonce)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + md5_handler(soap, context, MD5_UPDATE, qop, strlen(qop)); + md5_handler(soap, context, MD5_UPDATE, ":", 1); + } + md5_handler(soap, context, MD5_UPDATE, HA2hex, 32); + md5_handler(soap, context, MD5_FINAL, responseHA, 0); + + soap_s2hex(soap, (unsigned char*)responseHA, response, 16); +} + +#ifdef __cplusplus +} +#endif + diff --git a/src/inc/backupSession.h b/src/inc/backupSession.h new file mode 100644 index 0000000..1a622ec --- /dev/null +++ b/src/inc/backupSession.h @@ -0,0 +1,34 @@ +/* + backupSession.h + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#define RPC_NO_STATUS -1 +#define RPC_QUEUE 0 +#define RPC_SEND 1 + +typedef struct attribute +{ + long int id; + char *name; + char *status; + char *commandKey; + char *url; +} attribute; + +typedef enum backup_loading { + ALL, + ACS +} backup_loading; diff --git a/src/inc/cwmp-1-1.h b/src/inc/cwmp-1-1.h new file mode 100644 index 0000000..912358a --- /dev/null +++ b/src/inc/cwmp-1-1.h @@ -0,0 +1,1258 @@ +/* cwmp-1-1.h + Generated by wsdl2h 1.2.11 from cwmp-1-1.wsdl and typemap.dat + 2008-09-30 10:26:18 GMT + Copyright (C) 2001-2008 Robert van Engelen, Genivia Inc. All Rights Reserved. + This part of the software is released under one of the following licenses: + GPL or Genivia's license for commercial use. +*/ + +/* NOTE: + + - Compile this file with soapcpp2 to complete the code generation process. + - Use soapcpp2 option -I to specify paths for #import + To build with STL, 'stlvector.h' is imported from 'import' dir in package. + - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. + - Use 'typemap.dat' to control namespace bindings and type mappings. + It is strongly recommended to customize the names of the namespace prefixes + generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces + section below and add the modified lines to 'typemap.dat' to rerun wsdl2h. + - Use Doxygen (www.doxygen.org) to browse this file. + - Use wsdl2h option -l to view the software license terms. + + DO NOT include this file directly into your project. + Include only the soapcpp2-generated headers and source code files. +*/ + +//gsoapopt cw + +/******************************************************************************\ + * * + * urn:dslforum-org:cwmp-1-1 * + * * +\******************************************************************************/ + + +/******************************************************************************\ + * * + * Import * + * * +\******************************************************************************/ + + +/******************************************************************************\ + * * + * Schema Namespaces * + * * +\******************************************************************************/ + + +/* NOTE: + +It is strongly recommended to customize the names of the namespace prefixes +generated by wsdl2h. To do so, modify the prefix bindings below and add the +modified lines to typemap.dat to rerun wsdl2h: + +cwmp1 = "urn:dslforum-org:cwmp-1-1" + +*/ + +//gsoap cwmp1 schema namespace: urn:dslforum-org:cwmp-1-1 +//gsoap cwmp1 schema form: unqualified + +/******************************************************************************\ + * * + * Schema Types * + * * +\******************************************************************************/ + + +/// Built-in type "SOAP-ENC:base64". +struct SOAP_ENC__base64 { unsigned char *__ptr; int __size; }; + +/// Primitive built-in type "xs:anySimpleType" +typedef char* xsd__anySimpleType; + +/// Built-in type "xs:boolean". +enum xsd__boolean { xsd__boolean__false_, xsd__boolean__true_ }; + + +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" +typedef char* cwmp1__FaultCodeType; + +/// "urn:dslforum-org:cwmp-1-1":ParameterKeyType is a simpleType restriction of xs:string. +/// Length of this string is within 0..32 characters +typedef char* cwmp1__ParameterKeyType:32; + +/// "urn:dslforum-org:cwmp-1-1":CommandKeyType is a simpleType restriction of xs:string. +/// Length of this string is within 0..32 characters +typedef char* cwmp1__CommandKeyType:32; + +/// "urn:dslforum-org:cwmp-1-1":ObjectNameType is a simpleType restriction of xs:string. +/// Length of this string is within 0..256 characters +/// Content pattern is ".*\\." +typedef char* cwmp1__ObjectNameType ".*\\.":256; + +/// "urn:dslforum-org:cwmp-1-1":FaultStruct is a complexType. +/// @brief Fault information for TransferComplete and AutonomousTransferComplete +struct cwmp1__FaultStruct +{ +/// @brief Transfer fault codes + +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" +/// union of values from "xs:unsignedInt" + char* + FaultCode 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + FaultString 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":DeviceIdStruct is a complexType. +struct cwmp1__DeviceIdStruct +{ +/// Length of this string is within 0..64 characters + char* + Manufacturer 1; ///< Required element. +/// Length of this string is exactly 6 characters +/// Content pattern is "[0-9A-F]{6}" + char* + OUI 1; ///< Required element. +/// Length of this string is within 0..64 characters + char* + ProductClass 1; ///< Required element. +/// Length of this string is within 0..64 characters + char* + SerialNumber 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":EventStruct is a complexType. +struct cwmp1__EventStruct +{ +/// Length of this string is within 0..64 characters +/// Content pattern is "0 BOOTSTRAP" +/// Content pattern is "1 BOOT" +/// Content pattern is "2 PERIODIC" +/// Content pattern is "3 SCHEDULED" +/// Content pattern is "4 VALUE CHANGE" +/// Content pattern is "5 KICKED" +/// Content pattern is "6 CONNECTION REQUEST" +/// Content pattern is "7 TRANSFER COMPLETE" +/// Content pattern is "8 DIAGNOSTICS COMPLETE" +/// Content pattern is "9 REQUEST DOWNLOAD" +/// Content pattern is "10 AUTONOMOUS TRANSFER COMPLETE" +/// Content pattern is "\\d+( \\S+)+" +/// Content pattern is "M Reboot" +/// Content pattern is "M ScheduleInform" +/// Content pattern is "M Download" +/// Content pattern is "M Upload" +/// Content pattern is "M \\S+" +/// Content pattern is "M X_\\S+" +/// Content pattern is "X [0-9A-F]{6} .*" + char* + EventCode 1; ///< Required element. +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterValueStruct is a complexType. +struct cwmp1__ParameterValueStruct +{ +/// Length of this string is within 0..256 characters + char* + Name 1; ///< Required element. +/// Element Value of type xs:anySimpleType. + xsd__anySimpleType Value 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterInfoStruct is a complexType. +struct cwmp1__ParameterInfoStruct +{ +/// Length of this string is within 0..256 characters + char* + Name 1; ///< Required element. +/// Element Writable of type xs:boolean. + enum xsd__boolean Writable 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":SetParameterAttributesStruct is a complexType. +struct cwmp1__SetParameterAttributesStruct +{ +/// Length of this string is within 0..256 characters + char* + *Name ; ///< Nullable pointer. +/// Element NotificationChange of type xs:boolean. + enum xsd__boolean NotificationChange 1; ///< Required element. + enum _cwmp1__SetParameterAttributesStruct_Notification + { +/// @brief Notification off. The CPE need not inform the ACS of a change to the specified parameter(s) + _cwmp1__SetParameterAttributesStruct_Notification__0 = 0, ///< xs:int value="0" +/// @brief Passive notification. Whenever the specified parameter value changes, the CPE MUST include the new value in the ParameterList in the Inform message that is sent the next time a session is established to the ACS + _cwmp1__SetParameterAttributesStruct_Notification__1 = 1, ///< xs:int value="1" +/// @brief Active notification. Whenever the specified parameter value changes, the CPE MUST initiate a session to the ACS, and include the new value in the ParameterList in the associated Inform message + _cwmp1__SetParameterAttributesStruct_Notification__2 = 2, ///< xs:int value="2" + } + Notification 1; ///< Required element. +/// Element AccessListChange of type xs:boolean. + enum xsd__boolean AccessListChange 1; ///< Required element. +/// Element AccessList of type "urn:dslforum-org:cwmp-1-1":AccessList. + struct cwmp1AccessList* AccessList 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterAttributeStruct is a complexType. +struct cwmp1__ParameterAttributeStruct +{ +/// Length of this string is within 0..256 characters + char* + Name 1; ///< Required element. + enum _cwmp1__ParameterAttributeStruct_Notification + { + _cwmp1__ParameterAttributeStruct_Notification__0 = 0, ///< xs:int value="0" + _cwmp1__ParameterAttributeStruct_Notification__1 = 1, ///< xs:int value="1" + _cwmp1__ParameterAttributeStruct_Notification__2 = 2, ///< xs:int value="2" + } + Notification 1; ///< Required element. +/// Element AccessList of type "urn:dslforum-org:cwmp-1-1":AccessList. + struct cwmp1AccessList* AccessList 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":QueuedTransferStruct is a complexType. +struct cwmp1__QueuedTransferStruct +{ +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. + enum _cwmp1__QueuedTransferStruct_State + { +/// @brief 1 - Not yet started + _cwmp1__QueuedTransferStruct_State__1 = 1, ///< xs:int value="1" +/// @brief 2 - In progress + _cwmp1__QueuedTransferStruct_State__2 = 2, ///< xs:int value="2" +/// @brief 3 - Completed + _cwmp1__QueuedTransferStruct_State__3 = 3, ///< xs:int value="3" + } + State 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":AllQueuedTransferStruct is a complexType. +struct cwmp1__AllQueuedTransferStruct +{ +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. + enum _cwmp1__AllQueuedTransferStruct_State + { +/// @brief 1 - Not yet started + _cwmp1__AllQueuedTransferStruct_State__1 = 1, ///< xs:int value="1" +/// @brief 2 - In progress + _cwmp1__AllQueuedTransferStruct_State__2 = 2, ///< xs:int value="2" +/// @brief 3 - Completed + _cwmp1__AllQueuedTransferStruct_State__3 = 3, ///< xs:int value="3" + } + State 1; ///< Required element. +/// Element IsDownload of type xs:boolean. + enum xsd__boolean IsDownload 1; ///< Required element. +/// Length of this string is within 0..64 characters +/// Content pattern is "1 Firmware Upgrade Image" +/// Content pattern is "2 Web Content" +/// Content pattern is "3 Vendor Configuration File" +/// Content pattern is "4 Vendor Log File" +/// Content pattern is "X [0-9A-F]{6} .*" + char* + FileType 1; ///< Required element. +/// Element FileSize of type xs:unsignedInt. + unsigned int FileSize 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + TargetFileName 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":ArgStruct is a complexType. +struct cwmp1__ArgStruct +{ +/// Length of this string is within 0..64 characters + char* + Name 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + Value 1; ///< Required element. +}; + +/// "urn:dslforum-org:cwmp-1-1":OptionStruct is a complexType. +struct cwmp1__OptionStruct +{ +/// Length of this string is within 0..64 characters + char* + OptionName 1; ///< Required element. +/// Element VoucherSN of type xs:unsignedInt. + unsigned int VoucherSN 1; ///< Required element. + enum _cwmp1__OptionStruct_State + { +/// @brief Option is disabled and not setup + _cwmp1__OptionStruct_State__0 = 0, ///< xs:unsignedInt value="0" +/// @brief Option is enabled and not setup + _cwmp1__OptionStruct_State__1 = 1, ///< xs:unsignedInt value="1" +/// @brief Option is disabled and setup + _cwmp1__OptionStruct_State__2 = 2, ///< xs:unsignedInt value="2" +/// @brief Option is enabled and setup + _cwmp1__OptionStruct_State__3 = 3, ///< xs:unsignedInt value="3" + } + State 1; ///< Required element. + enum _cwmp1__OptionStruct_Mode + { +/// @brief 0 - Disabled + _cwmp1__OptionStruct_Mode__0 = 0, ///< xs:int value="0" +/// @brief 1 - Enabled with expiration + _cwmp1__OptionStruct_Mode__1 = 1, ///< xs:int value="1" +/// @brief 2 - Enabled without expiration + _cwmp1__OptionStruct_Mode__2 = 2, ///< xs:int value="2" + } + Mode 1; ///< Required element. +/// Element StartDate of type xs:dateTime. + time_t StartDate 1; ///< Required element. +/// Element ExpirationDate of type xs:dateTime. + time_t* ExpirationDate 0; ///< Optional element. + enum _cwmp1__OptionStruct_IsTransferable + { +/// @brief Non-transferable + _cwmp1__OptionStruct_IsTransferable__0 = 0, ///< xs:int value="0" +/// @brief Transferable + _cwmp1__OptionStruct_IsTransferable__1 = 1, ///< xs:int value="1" + } + IsTransferable 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":Fault of complexType. + +/// "urn:dslforum-org:cwmp-1-1":Fault is a complexType. +struct _cwmp1__Fault +{ +/// Element FaultCode of type "urn:dslforum-org:cwmp-1-1":FaultCodeType. + cwmp1__FaultCodeType FaultCode 1; ///< Required element. +/// Element FaultString of type xs:string. + char* FaultString 0; ///< Optional element. +/// Size of SetParameterValuesFault array is 0..unbounded + int __sizeSetParameterValuesFault ; + struct _cwmp1__Fault_SetParameterValuesFault + { +/// Element ParameterName of type xs:string. + char* ParameterName 1; ///< Required element. +/// Element FaultCode of type "urn:dslforum-org:cwmp-1-1":FaultCodeType. + cwmp1__FaultCodeType FaultCode 1; ///< Required element. +/// Element FaultString of type xs:string. + char* FaultString 0; ///< Optional element. + } *SetParameterValuesFault 0; +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetRPCMethods of complexType. +/// @brief GeRPCMethods message - Annex A.3.1.1 + +/// "urn:dslforum-org:cwmp-1-1":GetRPCMethods is a complexType. +struct _cwmp1__GetRPCMethods +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetRPCMethodsResponse of complexType. +/// @brief GeRPCMethodsResponse message - Annex A.3.1.1 + +/// "urn:dslforum-org:cwmp-1-1":GetRPCMethodsResponse is a complexType. +struct _cwmp1__GetRPCMethodsResponse +{ +/// Element MethodList of type "urn:dslforum-org:cwmp-1-1":MethodList. + struct cwmp1MethodList* MethodList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":SetParameterValues of complexType. +/// @brief SetParameterValues message - Annex A.3.2.1 + +/// "urn:dslforum-org:cwmp-1-1":SetParameterValues is a complexType. +struct _cwmp1__SetParameterValues +{ +/// Element ParameterList of type "urn:dslforum-org:cwmp-1-1":ParameterValueList. + struct cwmp1ParameterValueList* ParameterList 1; ///< Required element. +/// Element ParameterKey of type "urn:dslforum-org:cwmp-1-1":ParameterKeyType. + cwmp1__ParameterKeyType ParameterKey 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":SetParameterValuesResponse of complexType. +/// @brief SetParameterValuesResponse message - Annex A.3.2.1 + +/// "urn:dslforum-org:cwmp-1-1":SetParameterValuesResponse is a complexType. +struct _cwmp1__SetParameterValuesResponse +{ + enum _cwmp1__SetParameterValuesResponse_Status + { +/// @brief All Parameter changes have been validated and applied + _cwmp1__SetParameterValuesResponse_Status__0 = 0, ///< xs:int value="0" +/// @brief All Parameter changes have been validated and committed, but some or all are not yet applied (for example, if a reboot is required before the new values are applied) + _cwmp1__SetParameterValuesResponse_Status__1 = 1, ///< xs:int value="1" + } + Status 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetParameterValues of complexType. +/// @brief GetParameterValues message - Annex A.3.2.2 + +/// "urn:dslforum-org:cwmp-1-1":GetParameterValues is a complexType. +struct _cwmp1__GetParameterValues +{ +/// Element ParameterNames of type "urn:dslforum-org:cwmp-1-1":ParameterNames. + struct cwmp1ParameterNames* ParameterNames 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetParameterValuesResponse of complexType. +/// @brief GetParameterValuesResponse message - Annex A.3.2.2 + +/// "urn:dslforum-org:cwmp-1-1":GetParameterValuesResponse is a complexType. +struct _cwmp1__GetParameterValuesResponse +{ +/// Element ParameterList of type "urn:dslforum-org:cwmp-1-1":ParameterValueList. + struct cwmp1ParameterValueList* ParameterList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetParameterNames of complexType. +/// @brief GetParameterNames message - Annex A.3.2.3 + +/// "urn:dslforum-org:cwmp-1-1":GetParameterNames is a complexType. +struct _cwmp1__GetParameterNames +{ +/// Length of this string is within 0..256 characters + char* + *ParameterPath ; ///< Nullable pointer. +/// Element NextLevel of type xs:boolean. + enum xsd__boolean NextLevel 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetParameterNamesResponse of complexType. +/// @brief GetParameterNamesResponse message - Annex A.3.2.3 + +/// "urn:dslforum-org:cwmp-1-1":GetParameterNamesResponse is a complexType. +struct _cwmp1__GetParameterNamesResponse +{ +/// Element ParameterList of type "urn:dslforum-org:cwmp-1-1":ParameterInfoList. + struct cwmp1ParameterInfoList* ParameterList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":SetParameterAttributes of complexType. +/// @brief SetParameterAttributes message - Annex A.3.2.4 + +/// "urn:dslforum-org:cwmp-1-1":SetParameterAttributes is a complexType. +struct _cwmp1__SetParameterAttributes +{ +/// Element ParameterList of type "urn:dslforum-org:cwmp-1-1":SetParameterAttributesList. + struct cwmp1SetParameterAttributesList* ParameterList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":SetParameterAttributesResponse of complexType. +/// @brief SetParameterAttributesResponse message - Annex A.3.2.4 + +/// "urn:dslforum-org:cwmp-1-1":SetParameterAttributesResponse is a complexType. +struct _cwmp1__SetParameterAttributesResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetParameterAttributes of complexType. +/// @brief GetParameterAttributes message - Annex A.3.2.5 + +/// "urn:dslforum-org:cwmp-1-1":GetParameterAttributes is a complexType. +struct _cwmp1__GetParameterAttributes +{ +/// Element ParameterNames of type "urn:dslforum-org:cwmp-1-1":ParameterNames. + struct cwmp1ParameterNames* ParameterNames 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetParameterAttributesResponse of complexType. +/// @brief GetParameterAttributesResponse message - Annex A.3.2.5 + +/// "urn:dslforum-org:cwmp-1-1":GetParameterAttributesResponse is a complexType. +struct _cwmp1__GetParameterAttributesResponse +{ +/// Element ParameterList of type "urn:dslforum-org:cwmp-1-1":ParameterAttributeList. + struct cwmp1ParameterAttributeList* ParameterList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":AddObject of complexType. +/// @brief AddObject message - Annex A.3.2.6 + +/// "urn:dslforum-org:cwmp-1-1":AddObject is a complexType. +struct _cwmp1__AddObject +{ +/// Element ObjectName of type "urn:dslforum-org:cwmp-1-1":ObjectNameType. + cwmp1__ObjectNameType ObjectName 1; ///< Required element. +/// Element ParameterKey of type "urn:dslforum-org:cwmp-1-1":ParameterKeyType. + cwmp1__ParameterKeyType ParameterKey 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":AddObjectResponse of complexType. +/// @brief AddObjectResponse message - Annex A.3.2.6 + +/// "urn:dslforum-org:cwmp-1-1":AddObjectResponse is a complexType. +struct _cwmp1__AddObjectResponse +{ +/// Value range is [1..] + unsigned int + InstanceNumber 1; ///< Required element. + enum _cwmp1__AddObjectResponse_Status + { +/// @brief The object has been created + _cwmp1__AddObjectResponse_Status__0 = 0, ///< xs:int value="0" +/// @brief The object creation has been validated and committed, but not yet applied + _cwmp1__AddObjectResponse_Status__1 = 1, ///< xs:int value="1" + } + Status 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":DeleteObject of complexType. +/// @brief DeleteObject message - Annex A.3.2.7 + +/// "urn:dslforum-org:cwmp-1-1":DeleteObject is a complexType. +struct _cwmp1__DeleteObject +{ +/// Element ObjectName of type "urn:dslforum-org:cwmp-1-1":ObjectNameType. + cwmp1__ObjectNameType ObjectName 1; ///< Required element. +/// Element ParameterKey of type "urn:dslforum-org:cwmp-1-1":ParameterKeyType. + cwmp1__ParameterKeyType ParameterKey 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":DeleteObjectResponse of complexType. +/// @brief DeleteObjectResponse message - Annex A.3.2.7 + +/// "urn:dslforum-org:cwmp-1-1":DeleteObjectResponse is a complexType. +struct _cwmp1__DeleteObjectResponse +{ + enum _cwmp1__DeleteObjectResponse_Status + { +/// @brief The object has been deleted + _cwmp1__DeleteObjectResponse_Status__0 = 0, ///< xs:int value="0" +/// @brief The object deletion has been validated and committed, but not yet applied + _cwmp1__DeleteObjectResponse_Status__1 = 1, ///< xs:int value="1" + } + Status 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":Download of complexType. +/// @brief Download message - Annex A.3.2.8 + +/// "urn:dslforum-org:cwmp-1-1":Download is a complexType. +struct _cwmp1__Download +{ +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. +/// Length of this string is within 0..64 characters +/// Content pattern is "1 Firmware Upgrade Image" +/// Content pattern is "2 Web Content" +/// Content pattern is "3 Vendor Configuration File" +/// Content pattern is "X [0-9A-F]{6} .*" + char* + FileType 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + URL 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + Username 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + Password 1; ///< Required element. +/// Element FileSize of type xs:unsignedInt. + unsigned int FileSize 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + TargetFileName 1; ///< Required element. +/// Element DelaySeconds of type xs:unsignedInt. + unsigned int DelaySeconds 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + SuccessURL 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + FailureURL 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":DownloadResponse of complexType. +/// @brief DownloadResponse message - Annex A.3.2.8 + +/// "urn:dslforum-org:cwmp-1-1":DownloadResponse is a complexType. +struct _cwmp1__DownloadResponse +{ + enum _cwmp1__DownloadResponse_Status + { +/// @brief Download has completed and been applied + _cwmp1__DownloadResponse_Status__0 = 0, ///< xs:int value="0" +/// @brief Download has not yet been completed and applied + _cwmp1__DownloadResponse_Status__1 = 1, ///< xs:int value="1" + } + Status 1; ///< Required element. +/// Element StartTime of type xs:dateTime. + time_t StartTime 1; ///< Required element. +/// Element CompleteTime of type xs:dateTime. + time_t CompleteTime 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":Reboot of complexType. +/// @brief Reboot message - Annex A.3.2.9 + +/// "urn:dslforum-org:cwmp-1-1":Reboot is a complexType. +struct _cwmp1__Reboot +{ +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":RebootResponse of complexType. +/// @brief RebootResponse message - Annex A.3.2.9 + +/// "urn:dslforum-org:cwmp-1-1":RebootResponse is a complexType. +struct _cwmp1__RebootResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetQueuedTransfers of complexType. +/// @brief GetQueuedTransfers message - Annex A.4.1.1 + +/// "urn:dslforum-org:cwmp-1-1":GetQueuedTransfers is a complexType. +struct _cwmp1__GetQueuedTransfers +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetQueuedTransfersResponse of complexType. +/// @brief GetQueuedTransfersResponse message - Annex A.4.1.1 + +/// "urn:dslforum-org:cwmp-1-1":GetQueuedTransfersResponse is a complexType. +struct _cwmp1__GetQueuedTransfersResponse +{ +/// Element TransferList of type "urn:dslforum-org:cwmp-1-1":TransferList. + struct cwmp1TransferList* TransferList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":ScheduleInform of complexType. +/// @brief ScheduleInform message - Annex A.4.1.2 + +/// "urn:dslforum-org:cwmp-1-1":ScheduleInform is a complexType. +struct _cwmp1__ScheduleInform +{ +/// Element DelaySeconds of type xs:unsignedInt. + unsigned int DelaySeconds 1; ///< Required element. +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":ScheduleInformResponse of complexType. +/// @brief ScheduleInformResponse message - Annex A.4.1.2 + +/// "urn:dslforum-org:cwmp-1-1":ScheduleInformResponse is a complexType. +struct _cwmp1__ScheduleInformResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":SetVouchers of complexType. +/// @brief SetVouchers message - Annex A.4.1.3 + +/// "urn:dslforum-org:cwmp-1-1":SetVouchers is a complexType. +struct _cwmp1__SetVouchers +{ +/// Element VoucherList of type "urn:dslforum-org:cwmp-1-1":VoucherList. + struct cwmp1VoucherList* VoucherList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":SetVouchersResponse of complexType. +/// @brief SetVouchersResponse message - Annex A.4.1.3 + +/// "urn:dslforum-org:cwmp-1-1":SetVouchersResponse is a complexType. +struct _cwmp1__SetVouchersResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetOptions of complexType. +/// @brief GetOptions message - Annex A.4.1.4 + +/// "urn:dslforum-org:cwmp-1-1":GetOptions is a complexType. +struct _cwmp1__GetOptions +{ +/// Length of this string is within 0..64 characters + char* + OptionName 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetOptionsResponse of complexType. +/// @brief GetOptionsResponse message - Annex A.4.1.4 + +/// "urn:dslforum-org:cwmp-1-1":GetOptionsResponse is a complexType. +struct _cwmp1__GetOptionsResponse +{ +/// Element OptionList of type "urn:dslforum-org:cwmp-1-1":OptionList. + struct cwmp1OptionList* OptionList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":Upload of complexType. +/// @brief Upload message - Annex A.4.1.5 + +/// "urn:dslforum-org:cwmp-1-1":Upload is a complexType. +struct _cwmp1__Upload +{ +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. +/// Length of this string is within 0..64 characters +/// Content pattern is "1 Vendor Configuration File" +/// Content pattern is "2 Vendor Log File" +/// Content pattern is "X [0-9A-F]{6} .*" + char* + FileType 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + URL 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + Username 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + Password 1; ///< Required element. +/// Element DelaySeconds of type xs:unsignedInt. + unsigned int DelaySeconds 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":UploadResponse of complexType. +/// @brief UploadResponse message - Annex A.4.1.5 + +/// "urn:dslforum-org:cwmp-1-1":UploadResponse is a complexType. +struct _cwmp1__UploadResponse +{ + enum _cwmp1__UploadResponse_Status + { +/// @brief Upload has been completed + _cwmp1__UploadResponse_Status__0 = 0, ///< xs:int value="0" +/// @brief Upload has not yet completed + _cwmp1__UploadResponse_Status__1 = 1, ///< xs:int value="1" + } + Status 1; ///< Required element. +/// Element StartTime of type xs:dateTime. + time_t StartTime 1; ///< Required element. +/// Element CompleteTime of type xs:dateTime. + time_t CompleteTime 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":FactoryReset of complexType. +/// @brief FactoryReset message - Annex A.4.1.6 + +/// "urn:dslforum-org:cwmp-1-1":FactoryReset is a complexType. +struct _cwmp1__FactoryReset +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":FactoryResetResponse of complexType. +/// @brief FactoryResetResponse message - Annex A.4.1.6 + +/// "urn:dslforum-org:cwmp-1-1":FactoryResetResponse is a complexType. +struct _cwmp1__FactoryResetResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetAllQueuedTransfers of complexType. +/// @brief GetAllQueuedTransfers message - Annex A.4.1.7 + +/// "urn:dslforum-org:cwmp-1-1":GetAllQueuedTransfers is a complexType. +struct _cwmp1__GetAllQueuedTransfers +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":GetAllQueuedTransfersResponse of complexType. +/// @brief GetAllQueuedTransfersResponse message - Annex A.4.1.7 + +/// "urn:dslforum-org:cwmp-1-1":GetAllQueuedTransfersResponse is a complexType. +struct _cwmp1__GetAllQueuedTransfersResponse +{ +/// Element TransferList of type "urn:dslforum-org:cwmp-1-1":AllTransferList. + struct cwmp1AllTransferList* TransferList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":Inform of complexType. +/// @brief Inform message - Annex A.3.3.1 + +/// "urn:dslforum-org:cwmp-1-1":Inform is a complexType. +struct _cwmp1__Inform +{ +/// Element DeviceId of type "urn:dslforum-org:cwmp-1-1":DeviceIdStruct. + struct cwmp1__DeviceIdStruct* DeviceId 1; ///< Required element. +/// Element Event of type "urn:dslforum-org:cwmp-1-1":EventList. + struct cwmp1EventList* Event 1; ///< Required element. +/// Element MaxEnvelopes of type xs:unsignedInt. + unsigned int MaxEnvelopes 1; ///< Required element. +/// Element CurrentTime of type xs:dateTime. + time_t CurrentTime 1; ///< Required element. +/// Element RetryCount of type xs:unsignedInt. + unsigned int RetryCount 1; ///< Required element. +/// Element ParameterList of type "urn:dslforum-org:cwmp-1-1":ParameterValueList. + struct cwmp1ParameterValueList* ParameterList 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":InformResponse of complexType. +/// @brief InformResponse message - Annex A.3.3.1 + +/// "urn:dslforum-org:cwmp-1-1":InformResponse is a complexType. +struct _cwmp1__InformResponse +{ +/// Element MaxEnvelopes of type xs:unsignedInt. + unsigned int MaxEnvelopes 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":TransferComplete of complexType. +/// @brief TransferComplete message - Annex A.3.3.2 + +/// "urn:dslforum-org:cwmp-1-1":TransferComplete is a complexType. +struct _cwmp1__TransferComplete +{ +/// Element CommandKey of type "urn:dslforum-org:cwmp-1-1":CommandKeyType. + cwmp1__CommandKeyType CommandKey 1; ///< Required element. +/// Element FaultStruct of type "urn:dslforum-org:cwmp-1-1":FaultStruct. + struct cwmp1__FaultStruct* FaultStruct 1; ///< Required element. +/// Element StartTime of type xs:dateTime. + time_t StartTime 1; ///< Required element. +/// Element CompleteTime of type xs:dateTime. + time_t CompleteTime 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":TransferCompleteResponse of complexType. +/// @brief TransferCompleteResponse message - Annex A.3.3.2 + +/// "urn:dslforum-org:cwmp-1-1":TransferCompleteResponse is a complexType. +struct _cwmp1__TransferCompleteResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":AutonomousTransferComplete of complexType. +/// @brief AutonomousTransferComplete message - Annex A.3.3.3 + +/// "urn:dslforum-org:cwmp-1-1":AutonomousTransferComplete is a complexType. +struct _cwmp1__AutonomousTransferComplete +{ +/// Length of this string is within 0..1024 characters + char* + AnnounceURL 1; ///< Required element. +/// Length of this string is within 0..1024 characters + char* + TransferURL 1; ///< Required element. +/// Element IsDownload of type xs:boolean. + enum xsd__boolean IsDownload 1; ///< Required element. +/// Length of this string is within 0..64 characters +/// Content pattern is "1 Firmware Upgrade Image" +/// Content pattern is "2 Web Content" +/// Content pattern is "3 Vendor Configuration File" +/// Content pattern is "4 Vendor Log File" +/// Content pattern is "X [0-9A-F]{6} .*" + char* + FileType 1; ///< Required element. +/// Element FileSize of type xs:unsignedInt. + unsigned int FileSize 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + TargetFileName 1; ///< Required element. +/// Element FaultStruct of type "urn:dslforum-org:cwmp-1-1":FaultStruct. + struct cwmp1__FaultStruct* FaultStruct 1; ///< Required element. +/// Element StartTime of type xs:dateTime. + time_t StartTime 1; ///< Required element. +/// Element CompleteTime of type xs:dateTime. + time_t CompleteTime 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":AutonomousTransferCompleteResponse of complexType. +/// @brief AutonomousTransferCompleteResponse message - Annex A.3.3.3 + +/// "urn:dslforum-org:cwmp-1-1":AutonomousTransferCompleteResponse is a complexType. +struct _cwmp1__AutonomousTransferCompleteResponse +{ +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":Kicked of complexType. +/// @brief Kicked message - Annex A.4.2.1 + +/// "urn:dslforum-org:cwmp-1-1":Kicked is a complexType. +struct _cwmp1__Kicked +{ +/// Length of this string is within 0..32 characters + char* + Command 1; ///< Required element. +/// Length of this string is within 0..64 characters + char* + Referer 1; ///< Required element. +/// Length of this string is within 0..256 characters + char* + Arg 1; ///< Required element. +/// Length of this string is within 0..1024 characters + char* + Next 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":KickedResponse of complexType. +/// @brief KickedResponse message - Annex A.4.2.1 + +/// "urn:dslforum-org:cwmp-1-1":KickedResponse is a complexType. +struct _cwmp1__KickedResponse +{ +/// Length of this string is within 0..1024 characters + char* + NextURL 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":RequestDownload of complexType. +/// @brief RequestDownload message - Annex A.4.2.2 + +/// "urn:dslforum-org:cwmp-1-1":RequestDownload is a complexType. +struct _cwmp1__RequestDownload +{ +/// Length of this string is within 0..64 characters +/// Content pattern is "1 Firmware Upgrade Image" +/// Content pattern is "2 Web Content" +/// Content pattern is "3 Vendor Configuration File" +/// Content pattern is "X [0-9A-F]{6} .*" + char* + FileType 1; ///< Required element. +/// Element FileTypeArg of type "urn:dslforum-org:cwmp-1-1":FileTypeArg. + struct cwmp1FileTypeArg* FileTypeArg 1; ///< Required element. +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":RequestDownloadResponse of complexType. +/// @brief RequestDownloadResponse message - Annex A.4.2.2 + +/// "urn:dslforum-org:cwmp-1-1":RequestDownloadResponse is a complexType. +struct _cwmp1__RequestDownloadResponse +{ +}; + +/// "urn:dslforum-org:cwmp-1-1":MethodList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of xs:string +struct cwmp1MethodList +{ +/// Pointer to array of char*. + char* *__ptrstring ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":EventList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":EventStruct +struct cwmp1EventList +{ +/// Pointer to array of struct cwmp1__EventStruct*. + struct cwmp1__EventStruct* *__ptrEventStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterValueList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":ParameterValueStruct +struct cwmp1ParameterValueList +{ +/// Pointer to array of struct cwmp1__ParameterValueStruct*. + struct cwmp1__ParameterValueStruct* *__ptrParameterValueStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterInfoList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":ParameterInfoStruct +struct cwmp1ParameterInfoList +{ +/// Pointer to array of struct cwmp1__ParameterInfoStruct*. + struct cwmp1__ParameterInfoStruct* *__ptrParameterInfoStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterNames is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of xs:string +struct cwmp1ParameterNames +{ +/// Pointer to array of char*. + char* *__ptrstring ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":AccessList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of xs:string +struct cwmp1AccessList +{ +/// Pointer to array of char*. + char* *__ptrstring ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":SetParameterAttributesList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":SetParameterAttributesStruct +struct cwmp1SetParameterAttributesList +{ +/// Pointer to array of struct cwmp1__SetParameterAttributesStruct*. + struct cwmp1__SetParameterAttributesStruct* *__ptrSetParameterAttributesStruct; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":ParameterAttributeList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":ParameterAttributeStruct +struct cwmp1ParameterAttributeList +{ +/// Pointer to array of struct cwmp1__ParameterAttributeStruct*. + struct cwmp1__ParameterAttributeStruct* *__ptrParameterAttributeStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":TransferList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":QueuedTransferStruct +struct cwmp1TransferList +{ +/// Pointer to array of struct cwmp1__QueuedTransferStruct*. + struct cwmp1__QueuedTransferStruct* *__ptrQueuedTransferStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":AllTransferList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":AllQueuedTransferStruct +struct cwmp1AllTransferList +{ +/// Pointer to array of struct cwmp1__AllQueuedTransferStruct*. + struct cwmp1__AllQueuedTransferStruct* *__ptrAllQueuedTransferStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":VoucherList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of SOAP-ENC:base64 +struct cwmp1VoucherList +{ +/// Pointer to array of struct SOAP_ENC__base64*. + struct SOAP_ENC__base64* *__ptrbase64 ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":OptionList is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":OptionStruct +struct cwmp1OptionList +{ +/// Pointer to array of struct cwmp1__OptionStruct*. + struct cwmp1__OptionStruct* *__ptrOptionStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + +/// "urn:dslforum-org:cwmp-1-1":FileTypeArg is a complexType with complexContent restriction of SOAP-ENC:Array. +/// SOAP encoded array of "urn:dslforum-org:cwmp-1-1":ArgStruct +struct cwmp1FileTypeArg +{ +/// Pointer to array of struct cwmp1__ArgStruct*. + struct cwmp1__ArgStruct* *__ptrArgStruct ; +/// Size of the dynamic array. + int __size ; +/// Offset for partially transmitted arrays (uncomment only when required). +// int __offset ; +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":ID of complexType. + +/// "urn:dslforum-org:cwmp-1-1":ID is a complexType with simpleContent. +struct _cwmp1__ID +{ +/// __item wraps 'xs:string' simpleContent. + char* __item ; +/// Imported attribute reference SOAP-ENV:mustUnderstand. + @char* SOAP_ENV__mustUnderstand 1; ///< Fixed value="1". +}; + + +/// Element "urn:dslforum-org:cwmp-1-1":HoldRequests of complexType. + +/// "urn:dslforum-org:cwmp-1-1":HoldRequests is a complexType with simpleContent. +struct _cwmp1__HoldRequests +{ +/// __item wraps 'xs:boolean' simpleContent. + enum xsd__boolean __item ; +/// Imported attribute reference SOAP-ENV:mustUnderstand. + @char* SOAP_ENV__mustUnderstand 1; ///< Fixed value="1". +}; + +/******************************************************************************\ + * * + * Services * + * * +\******************************************************************************/ + + +//gsoap cwmp1 service name: cwmpBinding +//gsoap cwmp1 service type: cwmpPortType +//gsoap cwmp1 service port: http://192.168.2.30:8080/openacs/acs +//gsoap cwmp1 service namespace: urn:dslforum-org:cwmp-1-1 +//gsoap cwmp1 service transport: http://schemas.xmlsoap.org/soap/http + +/** @mainpage cwmp Definitions + +@section cwmp_bindings Bindings + - @ref cwmpBinding + +*/ + +/** + +@page cwmpBinding Binding "cwmpBinding" + +@section cwmpService_service Service Documentation "cwmpService" +Metanoia cwmp service definition + +@section cwmpBinding_operations Operations of Binding "cwmpBinding" + - @ref cwmp1__Inform + +@section cwmpBinding_ports Endpoints of Binding "cwmpBinding" + - http://192.168.2.30:8080/openacs/acs + +Note: use wsdl2h option -N to change the service binding prefix name + +*/ + +/******************************************************************************\ + * * + * cwmpBinding * + * * +\******************************************************************************/ + + +/******************************************************************************\ + * * + * cwmp1__Inform * + * * +\******************************************************************************/ + + +/// Operation "cwmp1__Inform" of service binding "cwmpBinding" + +/** + +Operation details: + +Service definition of function GetRPCMethods + - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" + +C stub function (defined in soapClient.c[pp] generated by soapcpp2): +@code + int soap_call_cwmp1__Inform( + struct soap *soap, + NULL, // char *endpoint = NULL selects default endpoint for this operation + NULL, // char *action = NULL selects default action for this operation + // request parameters: + struct cwmp1__DeviceIdStruct* DeviceId, + struct cwmp1EventList* Event, + unsigned int MaxEnvelopesI, + time_t CurrentTime, + unsigned int RetryCount, + struct cwmp1ParameterValueList* ParameterList, + // response parameters: + unsigned int *MaxEnvelopesO + ); +@endcode + +C server function (called from the service dispatcher defined in soapServer.c[pp]): +@code + int cwmp1__Inform( + struct soap *soap, + // request parameters: + struct cwmp1__DeviceIdStruct* DeviceId, + struct cwmp1EventList* Event, + unsigned int MaxEnvelopesI, + time_t CurrentTime, + unsigned int RetryCount, + struct cwmp1ParameterValueList* ParameterList, + // response parameters: + unsigned int *MaxEnvelopesO + ); +@endcode + +*/ + +//gsoap cwmp1 service method-style: Inform rpc +//gsoap cwmp1 service method-encoding: Inform http://schemas.xmlsoap.org/soap/encoding/ +//gsoap cwmp1 service method-action: Inform "" +int cwmp1__Inform( + struct cwmp1__DeviceIdStruct* DeviceId, ///< Request parameter + struct cwmp1EventList* Event, ///< Request parameter + unsigned int MaxEnvelopesI, ///< Request parameter + time_t CurrentTime, ///< Request parameter + unsigned int RetryCount, ///< Request parameter + struct cwmp1ParameterValueList* ParameterList, ///< Request parameter + unsigned int *MaxEnvelopesO ///< Response parameter +); + +/* End of cwmp-1-1.h */ diff --git a/src/inc/cwmp.h b/src/inc/cwmp.h new file mode 100644 index 0000000..4f459f8 --- /dev/null +++ b/src/inc/cwmp.h @@ -0,0 +1,348 @@ +/* + cwmp.h + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include + +#include "soapH.h" +#include "list.h" + +#define DEFAULT_LOG_FILE_SIZE 10240 +#define DEFAULT_LOG_FILE_NAME "/var/log/cwmpd.log" +#define EMERG 0 +#define ALERT 1 +#define CRITIC 2 +#define ERROR 3 +#define WARNING 4 +#define NOTICE 5 +#define INFO 6 +#define DEBUG 7 + +#define EVENT_RETRY_AFTER_TRANSMIT_FAIL 0x1 +#define EVENT_RETRY_AFTER_REBOOT 0x2 +#define EVENT_RETRY_AFTER_BOOTSTRAP 0x4 +#define EVENT_TYPE_SINGLE 0x0 +#define EVENT_TYPE_MULTIPLE 0x1 +#define EVENT_IDX_0BOOTSTRAP 0 +#define EVENT_IDX_1BOOT 1 +#define EVENT_IDX_2PERIODIC 2 +#define EVENT_IDX_3SCHEDULED 3 +#define EVENT_IDX_4VALUE_CHANGE 4 +#define EVENT_IDX_5KICKED 5 +#define EVENT_IDX_6CONNECTION_REQUEST 6 +#define EVENT_IDX_7TRANSFER_COMPLETE 7 +#define EVENT_IDX_8DIAGNOSTICS_COMPLETE 8 +#define EVENT_IDX_9REQUEST_DOWNLOAD 9 +#define EVENT_IDX_10AUTONOMOUS_TRANSFER_COMPLETE 10 +#define EVENT_IDX_M_Reboot 11 +#define EVENT_IDX_M_ScheduleInform 12 +#define EVENT_IDX_M_Download 13 +#define EVENT_IDX_M_Upload 14 +#define MAX_SIZE_RPC_METHODS_RESPONSE 14 +#define MAX_INT32 2147483646 +#define MAX_INT_ID MAX_INT32 +#define MIN_INT_ID 836464 +#define PERIOD_INFORM_MIN 100 +#define PERIOD_INFORM_DEFAULT 86400 +#define CONNECTION_REQUEST_RESTRICT_PERIOD 10 +#define CONNECTION_REQUEST_RESTRICT_REQUEST 5 +#define RPC_ACS_INFORM_IDX 1 +#define RPC_ACS_GETRPCMETHODS_IDX 2 +#define RPC_ACS_TRANSFERCOMPLETE_IDX 3 + + +#define FAULT_CPE_ARRAY_SIZE 21 +#define FAULT_CPE_NO_FAULT_IDX 0 +#define FAULT_CPE_METHOD_NOT_SUPPORTED_IDX 1 +#define FAULT_CPE_REQUEST_DENIED_IDX 2 +#define FAULT_CPE_INTERNAL_ERROR_IDX 3 +#define FAULT_CPE_INVALID_ARGUMENTS_IDX 4 +#define FAULT_CPE_RESOURCES_EXCEEDED_IDX 5 +#define FAULT_CPE_INVALID_PARAMETER_NAME_IDX 6 +#define FAULT_CPE_INVALID_PARAMETER_TYPE_IDX 7 +#define FAULT_CPE_INVALID_PARAMETER_VALUE_IDX 8 +#define FAULT_CPE_NON_WRITABLE_PARAMETER_IDX 9 +#define FAULT_CPE_NOTIFICATION_REJECTED_IDX 10 +#define FAULT_CPE_DOWNLOAD_FAILURE_IDX 11 +#define FAULT_CPE_UPLOAD_FAILURE_IDX 12 +#define FAULT_CPE_FILE_TRANSFER_AUTHENTICATION_FAILURE_IDX 13 +#define FAULT_CPE_FILE_TRANSFER_UNSUPPORTED_PROTOCOL_IDX 14 +#define FAULT_CPE_DOWNLOAD_FAIL_MULTICAST_GROUP_IDX 15 +#define FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER_IDX 16 +#define FAULT_CPE_DOWNLOAD_FAIL_ACCESS_FILE_IDX 17 +#define FAULT_CPE_DOWNLOAD_FAIL_COMPLETE_DOWNLOAD_IDX 18 +#define FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED_IDX 19 +#define FAULT_CPE_DOWNLOAD_FAIL_FILE_AUTHENTICATION_IDX 20 + +#define CWMP_START_BOOT 1 +#define CWMP_START_PERIODIC 2 +#define CWMP_START_ICCU 3 +#define CWMP_OK 0 /* No Error */ +#define CWMP_GEN_ERR 1 /* General Error */ +#define CWMP_MEM_ERR 2 /* Memory Error */ +#define CWMP_OWF_ERR 3 /* Open Writing File Error */ +#define CWMP_ORF_ERR 4 /* Open Reading File Error */ +#define CWMP_MUTEX_ERR 5 +#define CWMP_FAIL_RPC 6 +#define CWMP_RETRY_RPC 7 +#define CWMP_SUCCESS_RPC 8 +#define CWMP_UNAUTHORIZED_401 9 +#define CWMP_GET_RETRY_8005 10 +#define CWMP_RETRY_SESSION 11 +#define CWMP_CONTINUE_SESSION 12 +#define CWMP_SUCCESS_SESSION 13 +#define CWMP_FAULT_CPE 14 +#define CWMP_EXACT_FOUND 15 +#define CWMP_CHILD_FOUND 16 +#define CWMP_PARENT_FOUND 17 +#define MAX_EVENTS 64 +#define SOAP_TIMEOUT 30 + +#define DEFAULT_ACSURL "http://192.168.1.1:8080/openacs/acs" +#define DEFAULT_CONNECTION_REQUEST_PORT 7547 +#define COUNT_RPC_CPE 17 +#define COUNT_EVENT 15 +#define COUNT_ACCESSLIST 1 +#define DOWNLOADED_CONFIG_FILE "/tmp/configuration.cfg" +#define DOWNLOADED_FIRMWARE_FILE "/tmp/firmware.img" +#define DOWNLOADED_LAST_VALID_FIRMWARE_FILE "/tmp/valid_firmware.img" +#define DOWNLOADED_WEBCONTENT_FILE "/tmp/webcontent.ipk" +#define UCI_DM_XML_FILE_LIST "cwmp.dm.xml" +#define UCI_DHCP_DISCOVERY_PATH "cwmp.acs.dhcp_discovery" +#define UCI_DHCP_ACS_URL_PATH "provisioning.iup.tr069url" +#define UCI_STATE_CONNECTION_REQUEST_URL_PATH "cwmp.acs.cr_url" +#define UCI_ACS_URL_PATH "cwmp.acs.url" +#define UCI_PERIODIC_INFORM_INTERVAL_PATH "cwmp.acs.periodic_inform_interval" +#define UCI_PERIODIC_INFORM_ENABLE_PATH "cwmp.acs.periodic_inform_enable" +#define UCI_ACS_USERID_PATH "cwmp.acs.userid" +#define UCI_ACS_PASSWD_PATH "cwmp.acs.passwd" +#define UCI_ACS_PARAMETERKEY_PATH "cwmp.acs.ParameterKey" +#define UCI_LOG_SEVERITY_PATH "cwmp.cpe.log_severity" +#define UCI_CPE_USERID_PATH "cwmp.cpe.userid" +#define UCI_CPE_PASSWD_PATH "cwmp.cpe.passwd" +#define UCI_CPE_PORT_PATH "cwmp.cpe.port" +#define UCI_NOTIFICATION_PASSIVE_PATH "cwmp.notification.passive" +#define UCI_NOTIFICATION_ACTIVE_PATH "cwmp.notification.active" +#define UCI_NOTIFICATION_DENIED_PATH "cwmp.notification.deny" +#define UCI_CPE_LOG_FILE_NAME "cwmp.cpe.log_file_name" +#define UCI_CPE_LOG_MAX_SIZE "cwmp.cpe.log_max_size" +#define UCI_CPE_ENABLE_STDOUT_LOG "cwmp.cpe.log_to_console" +#define UCI_CPE_ENABLE_FILE_LOG "cwmp.cpe.log_to_file" + +#define UCI_TRACK_CONF "ucitrack" +#define UCI_TRACK_INIT "init" +#define UCI_TRACK_AFFECTS "affects" +#define UCI_TRACK_CONF_CWMP "cwmp" + +#define FIRMWARE_FILE_TYPE "1 Firmware Upgrade Image" +#define WEB_CONTENT_FILE_TYPE "2 Web Content" +#define CONFIGURATION_FILE_TYPE "3 Vendor Configuration File" +#define DOWNLOAD_PROTOCOL_HTTP "http://" +#define DOWNLOAD_PROTOCOL_FTP "ftp://" +#define MAX_DOWNLOAD_QUEUE 10 +#define ENABLE_CHECK_SIZE 0x0 +#define DISABLE_CHECK_SIZE 0x1 + +#define ENCODING_STYLE_URL "http://schemas.xmlsoap.org/soap/encoding/" + +typedef enum bool { + FALSE, + TRUE +} bool; + + +typedef struct config { + char *acsurl; + char *confFile; + char *acs_userid; + char *acs_passwd; + char *cpe_userid; + char *cpe_passwd; + int connection_request_port; + int period; + bool periodic_enable; +} config; + +typedef struct env { + unsigned short boot; + unsigned short periodic; + unsigned short iccu; + long int max_firmware_size; +} env; + +typedef struct api_value_change { + struct list_head parameter_list; + int parameter_size; + pthread_mutex_t mutex; +} api_value_change; + +typedef struct cwmp { + struct env env; + struct config conf; + struct list_head head_session_queue; + pthread_mutex_t mutex_session_queue; + struct session *session_send; + pthread_mutex_t mutex_session_send; + pthread_cond_t threshold_session_send; + pthread_mutex_t mutex_periodic; + pthread_cond_t threshold_periodic; + int retry_count_session; + struct list_head *head_event_container; + struct api_value_change api_value_change; + int error; +} cwmp; + +typedef struct session { + struct list_head list; + char acs_url[256]; + struct list_head head_event_container; + int event_size; + int parameter_size; + unsigned int single_event_flag; + struct list_head head_rpc_cpe; + struct list_head head_rpc_acs; + struct list_head head_session_end_func; + struct soap soap; + bool hold_request; + bool digest_auth; + int error; +} session; + +typedef struct session_end_func { + struct list_head list; + int (*func)(struct cwmp *cwmp, void *input); + void *input; +} session_end_func; + + +typedef struct event_container { + struct list_head list; + struct cwmp1__EventStruct event; + struct list_head head_paramater_container; + int id; + int idx; +} event_container; + +typedef struct paramater_container { + struct list_head list; + struct cwmp1__ParameterValueStruct paramater; +} paramater_container; + +typedef struct soap_cwmp1_methods__rpc +{ + void (*soap_serialize_cwmp1__send_data)(struct soap *soap, void *data); + int (*soap_put_cwmp1__send_data)(struct soap *soap, void *data, char *envelope, char *action); + void *(*soap_get_cwmp1__rpc_received_data)(struct soap *, void *data, char *envelope_response, char *action); + char *envelope; + char *envelope_response; +} soap_cwmp1_methods__rpc; +typedef struct fault +{ + int code_idx; + char *parameter_cause; +} fault; +typedef struct rpc_acs { + struct list_head list; + void *method_data; + int (*method_data_init)(struct cwmp *cwmp, struct session *session, struct rpc_acs *this); + int (*method_remote_call)(struct cwmp *cwmp, struct session *session, struct rpc_acs *this); + void *method_response_data; + int (*method_response)(struct cwmp *cwmp, struct session *session, struct rpc_acs *this); + int (*method_end)(struct cwmp *cwmp, struct session *session, struct rpc_acs *this); + int (*destructor)(struct cwmp *cwmp, struct session *session, struct rpc_acs *this); + struct soap_cwmp1_methods__rpc soap_methods; + struct fault fault; + int type; + int error; +} rpc_acs; + +typedef struct rpc_cpe { + struct list_head list; + void *method_data; + int (*method)(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); + void *method_response_data; + int (*method_response_data_init)(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); + int (*method_response)(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); + int (*method_end)(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); + int (*destructor)(struct cwmp *cwmp, struct session *session, struct rpc_cpe *this); + struct soap_cwmp1_methods__rpc soap_methods; + struct fault fault; + int error; +} rpc_cpe; + +typedef struct CPE_METHOD_CONSTRUCTORS +{ + char *METHOD; + struct rpc_cpe *(*CONSTRUCTOR)(struct session *session); +} CPE_METHOD_CONSTRUCTORS; + +typedef struct FAULT_CPE +{ + char *CODE; + int TYPE; + char *DESCRIPTION; +} FAULT_CPE; + +typedef struct EVENT_CONST_STRUCT +{ + char *CODE; + unsigned int TYPE; + unsigned short RETRY; + +} EVENT_CONST_STRUCT; + +typedef struct schedule_inform { + struct list_head list; + time_t scheduled_time; + char *commandKey; +} schedule_inform; + +typedef struct download { + struct list_head list; + time_t scheduled_time; + char *CommandKey; + char *FileType; + char *URL; + char *Username; + char *Password; +} download; + +struct download_end_func { + int (*func)(struct cwmp *cwmp, void *input); + void *input; +}; + +#define sizearray(a) (sizeof(a) / sizeof((a)[0])) +typedef struct config_uci_list { + struct list_head list; + char *value; +} config_uci_list; + +typedef struct ACCESSLIST_CONST_STRUCT +{ + char *NAME; + char *UCI_ACCESSLIST_PATH; +} ACCESSLIST_CONST_STRUCT; + +#ifdef WITH_CWMP_DEBUG +# ifndef CWMP_LOG +# define CWMP_LOG(SEV,MESSAGE,args...) puts_log(SEV,MESSAGE,##args); +# endif +#else +# define CWMP_LOG(SEV,MESSAGE,args...) +#endif diff --git a/src/inc/cwmpBinding.nsmap b/src/inc/cwmpBinding.nsmap new file mode 100644 index 0000000..ada4c20 --- /dev/null +++ b/src/inc/cwmpBinding.nsmap @@ -0,0 +1,11 @@ + +#include "soapH.h" +SOAP_NMAC struct Namespace namespaces[] = +{ + {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL}, + {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL}, + {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, + {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, + {"cwmp", "urn:dslforum-org:cwmp-1-0", "urn:dslforum-org:cwmp*", NULL}, + {NULL, NULL, NULL, NULL} +}; diff --git a/src/inc/cwmp_kernel.h b/src/inc/cwmp_kernel.h new file mode 100644 index 0000000..dc0c862 --- /dev/null +++ b/src/inc/cwmp_kernel.h @@ -0,0 +1,8 @@ + +#define NETLINK_MAX_PAYLOAD 1024 +#define NETLINK_USER 31 +#define NETLINK_CWMP_ID "NETLINK_CWMP_ID" +#define NETLINK_END_DATA "END_DATA" +#define NETLINK_NULL "NULL" + +int kernel_api_cwmp_value_change_call (int count, ...); diff --git a/src/inc/cwmp_lib.h b/src/inc/cwmp_lib.h new file mode 100644 index 0000000..7fe3bf7 --- /dev/null +++ b/src/inc/cwmp_lib.h @@ -0,0 +1,6 @@ + +#define AF_UNIX_ADDRESS ".AF_UNIX_CWMP_ID" +#define AF_UNIX_END_DATA "END_DATA" +#define AF_UNIX_NULL "NULL" + +int lib_api_cwmp_value_change_call (int count, ...); diff --git a/src/inc/dm.h b/src/inc/dm.h new file mode 100644 index 0000000..d30356a --- /dev/null +++ b/src/inc/dm.h @@ -0,0 +1,227 @@ +/* + dm.h + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ +#include +#define DM_OK 0 +#define DM_ERR 1 +#define DM_GEN_ERR 2 +#define DM_MEM_ERR 3 +#define DM_ORF_ERR 4 +#define NODE_PATH_SIZE 16 +#define INDEX_PATH_SIZE 8 + +#define COUNT_TYPE_VALUES 44 +#define SYSTEM_CMD_TIMEOUT 10 + +#define TYPE_VALUE_string_IDX 0 +#define TYPE_VALUE_int_IDX 1 +#define TYPE_VALUE_unsignedInt_IDX 2 +#define TYPE_VALUE_boolean_IDX 3 +#define TYPE_VALUE_dateTime_IDX 4 +#define TYPE_VALUE_base64Binary_IDX 5 +#define TYPE_VALUE_integer_IDX 6 +#define TYPE_VALUE_unsignedByte_IDX 7 +#define TYPE_VALUE_unsignedLong_IDX 8 +#define TYPE_VALUE_unsignedShort_IDX 9 +#define TYPE_VALUE_anyURI_IDX 10 +#define TYPE_VALUE_byte_IDX 11 +#define TYPE_VALUE_date_IDX 12 +#define TYPE_VALUE_time_IDX 13 +#define TYPE_VALUE_decimal_IDX 14 +#define TYPE_VALUE_double_IDX 15 +#define TYPE_VALUE_duration_IDX 16 +#define TYPE_VALUE_ENTITIES_IDX 17 +#define TYPE_VALUE_ENTITY_IDX 18 +#define TYPE_VALUE_float_IDX 19 +#define TYPE_VALUE_gDay_IDX 20 +#define TYPE_VALUE_gMonth_IDX 21 +#define TYPE_VALUE_gMonthDay_IDX 22 +#define TYPE_VALUE_gYear_IDX 23 +#define TYPE_VALUE_gYearMonth_IDX 24 +#define TYPE_VALUE_hexBinary_IDX 25 +#define TYPE_VALUE_ID_IDX 26 +#define TYPE_VALUE_IDREF_IDX 27 +#define TYPE_VALUE_IDREFS_IDX 28 +#define TYPE_VALUE_language_IDX 29 +#define TYPE_VALUE_long_IDX 30 +#define TYPE_VALUE_Name_IDX 31 +#define TYPE_VALUE_NCName_IDX 32 +#define TYPE_VALUE_negativeInteger_IDX 33 +#define TYPE_VALUE_NMTOKEN_IDX 34 +#define TYPE_VALUE_NMTOKENS_IDX 35 +#define TYPE_VALUE_nonNegativeInteger_IDX 36 +#define TYPE_VALUE_nonPositiveInteger_IDX 37 +#define TYPE_VALUE_normalizedString_IDX 38 +#define TYPE_VALUE_NOTATION_IDX 39 +#define TYPE_VALUE_positiveInteger_IDX 40 +#define TYPE_VALUE_QName_IDX 41 +#define TYPE_VALUE_short_IDX 42 +#define TYPE_VALUE_token_IDX 43 + +typedef struct dm_notification { + __u8 can_deny :1; + __u8 force_enabled :1; + __u8 force_default_enabled :1; +} dm_notification; + +typedef enum node_type { + DM_OBJECT, + DM_INSTANCE, + DM_PARAMETER +} node_type; + +typedef enum param_type { + DM_SYSTEM, + DM_UCI, + DM_STRING, + DM_DEBUG, + DM_CORRESPONDENCE, + DM_DEFAULT_VALUE, + DM_REGEXP +} param_type; + +typedef enum action_type { + DM_APPLY, + DM_GET, + DM_SET, + DM_CANCEL, + DM_ADD, + DM_DEL +} action_type; + +typedef enum permission { + DM_READ, + DM_READ_WRITE, + DM_CREATE, + DM_PRESENT +} permission; + +typedef struct dm_data { + unsigned short line_size; + unsigned short column_size; + char ***data; +} dm_data; + +typedef struct dm_map { + unsigned short size; + char **map; +} dm_map; + +typedef struct dm_uci { + __u8 reboot_required; + __u8 end_session; + char *cmd; +} dm_uci; + +typedef struct dm_system { + __u8 type; + __u8 reboot_required; + __u8 end_session; + struct dm_map *dm_map; + char *cmd; +} dm_system; + +typedef struct dm_correspondence { + struct dm_data *dm_data; + struct dm_map *dm_map; +} dm_correspondence; + +typedef struct dm_debug { + char *data; +} dm_debug; + +typedef struct data_handler { + enum param_type type; + void *handler; +} data_handler; + +struct list_data_handler { + struct list_head list; + struct data_handler *data_handler; +} list_data_handler; + +typedef struct dm_node { + struct list_head list; + char *name; + struct data_handler **data_handler; + __u8 type:4; + __u8 permission:4; + __u8 size_data_handler; + struct dm_notification active_notify; + /* the position of above parameters should be the same of struct dm_node_leaf*/ + struct list_head head_child; +} dm_node; + +typedef struct dm_node_leaf { + struct list_head list; + char *name; + struct data_handler **data_handler; + __u8 type:4; + __u8 permission:4; + __u8 size_data_handler; + struct dm_notification active_notify; + /* the position of above parameters should be the same of struct dm_node*/ + __u8 value_type; +} dm_node_leaf; + +typedef struct forced_inform_parameter { + char *name; + struct list_head list; + struct dm_node_leaf *node; +} _forced_inform_parameter; + +enum dm_data_type { + DM_XML_DATA, + DM_SYSTEM_DATA +}; + +typedef struct dm_index_path { + struct dm_map *map; + struct dm_data *data; + enum dm_data_type data_type; + char *index; + int indice; + struct dm_node_path *node_path; +} dm_index_path; + +typedef struct dm_node_path { + struct dm_node *node; + struct dm_index_path *index_path; +} dm_node_path; + +typedef struct dm_rpc { + void *input; + int (*method)(struct dm_node *node, struct dm_rpc *dm_rpc, struct dm_node_path *node_path, int pos_np, struct dm_index_path *index_path, int pos_xp); + bool subtree; +} dm_rpc; + +#ifdef WITH_DM_DEBUG +# ifndef DM_LOG +# define DM_LOG(SEV,MESSAGE,args...) puts_log(SEV,MESSAGE,##args); +# endif +#else +# define DM_LOG(SEV,MESSAGE,args...) +#endif + +#ifdef WITH_DM_XML_DEBUG +# ifndef DM_XML_LOG +# define DM_XML_LOG(SEV,MESSAGE,args...) puts_log(SEV,MESSAGE,##args); +# define DM_XML_GET_HANDLER_DEBUG(NODE,INDEX_PATH,POS_XP) dm_get_handler_debug(NODE,INDEX_PATH,POS_XP); +# endif +#else +# define DM_XML_LOG(SEV,MESSAGE,args...) +# define DM_XML_GET_HANDLER_DEBUG(NODE,INDEX_PATH,POS_XP) +#endif diff --git a/src/inc/dm_rpc.h b/src/inc/dm_rpc.h new file mode 100644 index 0000000..864eee5 --- /dev/null +++ b/src/inc/dm_rpc.h @@ -0,0 +1,121 @@ +/* + dm_rpc.h + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +typedef struct dm_indice { + int type; + char *indice; +} dm_indice; + +typedef struct sub_path { + char *name; + struct dm_node *node; + struct dm_indice dm_indice; +} sub_path; + +typedef struct dm_input_getParameterValues { + int *n; + struct list_head *list; +} dm_input_getParameterValues; + +typedef struct dm_input_getParameterNames { + int *n; + struct list_head *list; + enum xsd__boolean NextLevel; +} dm_input_getParameterNames; + +typedef struct dm_input_getParameterAttributes { + int *n; + struct list_head *list; +} dm_input_getParameterAttributes; + +typedef struct dm_input_setParameterAttributes { + struct cwmp1__SetParameterAttributesStruct *ParameterAttributesStruct; +} dm_input_setParameterAttributes; + +typedef struct dm_input_getParameterPaths_by_correspondence { + struct list_head *list; + struct list_head *elist; + int *n; + struct dm_node *prefix_node; + struct sub_path *sub_path; + int sub_path_size; + bool get_value; + bool get_attribute; + bool is_actif; +} dm_input_getParameterPaths_by_correspondence; + +typedef struct dm_input_setParameterValues { + char *value; + struct dm_set_handler *dm_set_handler; +} dm_input_setParameterValues; + +typedef struct dm_input_addObject { + int *n; + char *path; + struct dm_set_handler *dm_set_handler; +} dm_input_addObject; + +typedef struct dm_input_deleteObject { + char *path; + struct dm_set_handler *dm_set_handler; +} dm_input_deleteObject; + +typedef struct handler_ParameterInfoStruct { + struct list_head list; + struct cwmp1__ParameterInfoStruct *ParameterInfoStruct; +} handler_ParameterInfoStruct; + +typedef struct handler_ParameterValueStruct { + struct list_head list; + struct cwmp1__ParameterValueStruct *ParameterValueStruct; +} handler_ParameterValueStruct; + +typedef struct dm_set_handler { + struct list_head list; + struct list_head cmd_list; + struct list_head cancel_list; + struct list_head service_list; + bool reboot_required; + bool cwmp_reload; + bool uci; +} dm_set_handler; + +typedef struct service_handler { + struct list_head list; + char *service; +} service_handler; + +typedef struct cmd_handler { + struct list_head list; + char *cmd; + enum param_type type; + __u8 end_session; +} cmd_handler; + +typedef struct cancel_handler { + struct list_head list; + char *cmd; +} cancel_handler; + +typedef struct handler_ParameterAttributeStruct { + struct list_head list; + struct cwmp1__ParameterAttributeStruct *ParameterAttributeStruct; +} handler_ParameterAttributeStruct; + +#define DM_INDICE_INDEX 1 +#define DM_INDICE_CORRESPONDENCE 2 +#define DM_MAX_INDICE 16 diff --git a/src/inc/httpda.h b/src/inc/httpda.h new file mode 100644 index 0000000..29c1f9a --- /dev/null +++ b/src/inc/httpda.h @@ -0,0 +1,121 @@ +/* + httpda.h + + gSOAP HTTP Digest Authentication plugin. + Supports both Basic and Digest authentication. + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#ifndef HTTPDA_H +#define HTTPDA_H + +#include "stdsoap2.h" +#include "md5evp.h" /* requires MD5 */ +#include "threads.h" /* mutex for multi-threaded server implementations */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define HTTP_DA_ID "HTTP-DA-1.0" /* plugin identification */ + +#define HTTP_DA_SESSION_TIMEOUT (600) /* sessions time out after ten minutes */ + +extern const char http_da_id[]; + +struct http_da_data +{ + int (*fposthdr)(struct soap*, const char*, const char*); + int (*fparsehdr)(struct soap*, const char*, const char*); + int (*fprepareinit)(struct soap*); + int (*fpreparesend)(struct soap*, const char*, size_t); + int (*fpreparerecv)(struct soap*, const char*, size_t); + int (*fdisconnect)(struct soap*); + void *context; /* ptr to MD5 context for MD5 handler */ + char digest[16]; /* MD5 entity body digest */ + char *nonce; /* client/server-side copy of server's nonce value */ + char *opaque; /* client/server-side copy of server's opaque value */ + char *qop; /* client/server-side copy of server's qop value(s) */ + char *alg; /* client-side: server's algorithm value */ + unsigned long nc; /* client-side: generated nonce count */ + char *ncount; /* server-side: client's nonce count */ + char *cnonce; /* server-side: client's nonce */ + char *response; /* server-side: client's response digest key */ +}; + +struct http_da_session +{ + struct http_da_session *next; + time_t modified; + char *realm; + char *nonce; + char *opaque; + unsigned long nc; +}; + +int http_da(struct soap *soap, struct soap_plugin *p, void *arg); + +int http_da_verify_post(struct soap *soap, char *passwd); +int http_da_verify_get(struct soap *soap, char *passwd); + +struct http_da_info +{ + char *authrealm; + char *userid; + char *passwd; + char *nonce; + char *opaque; + char *qop; + char *alg; +}; + +void http_da_save(struct soap *soap, struct http_da_info *info, const char *realm, const char *userid, const char *passwd); +void http_da_restore(struct soap *soap, struct http_da_info *info); +void http_da_release(struct soap *soap, struct http_da_info *info); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/inc/list.h b/src/inc/list.h new file mode 100644 index 0000000..3ace4e2 --- /dev/null +++ b/src/inc/list.h @@ -0,0 +1,471 @@ +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +/* + * These are non-NULL pointers that will result in page faults + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ +} while (0) + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +/** + * list_del_init - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static inline void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +/** + * list_move - delete from one list and add as another's head + * @list: the entry to move + * @head: the head that will precede our entry + */ +static inline void list_move(struct list_head *list, struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add(list, head); +} + +/** + * list_move_tail - delete from one list and add as another's tail + * @list: the entry to move + * @head: the head that will follow our entry + */ +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add_tail(list, head); +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/** + * list_empty_careful - tests whether a list is + * empty _and_ checks that no other CPU might be + * in the process of still modifying either member + * + * NOTE: using list_empty_careful() without synchronization + * can only be safe if the only activity that can happen + * to the list entry is list_del_init(). Eg. it cannot be used + * if another CPU could re-list_add() it. + * + * @head: the list to test. + */ +static inline int list_empty_careful(const struct list_head *head) +{ + struct list_head *next = head->next; + return (next == head) && (next == head->prev); +} + +static inline void __list_splice(struct list_head *list, + struct list_head *head) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; +} + +/** + * list_splice - join two lists + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head); +} + +/** + * list_splice_init - join two lists and reinitialise the emptied list. + * @list: the new list to add. + * @head: the place to add it in the first list. + * + * The list at @list is reinitialised + */ +static inline void list_splice_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head); + INIT_LIST_HEAD(list); + } +} + +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +/** + * container_of - cast a member of a structure out to the containing structure + * + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next; prefetch(pos->next), pos != (head); \ + pos = pos->next) + +/** + * __list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + * + * This variant differs from list_for_each() in that it's the + * simplest possible list iteration code, no prefetching is done. + * Use this for code that knows the list to be very short (empty + * or 1 entry) most of the time. + */ +#define __list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * list_for_each_prev - iterate over a list backwards + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + */ +#define list_for_each_prev(pos, head) \ + for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ + pos = pos->prev) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop counter. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + prefetch(pos->member.next), &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_reverse - iterate backwards over list of given type. + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_reverse(pos, head, member) \ + for (pos = list_entry((head)->prev, typeof(*pos), member); \ + prefetch(pos->member.prev), &pos->member != (head); \ + pos = list_entry(pos->member.prev, typeof(*pos), member)) + +/** + * list_prepare_entry - prepare a pos entry for use as a start point in + * list_for_each_entry_continue + * @pos: the type * to use as a start point + * @head: the head of the list + * @member: the name of the list_struct within the struct. + */ +#define list_prepare_entry(pos, head, member) \ + ((pos) ? : list_entry(head, typeof(*pos), member)) + +/** + * list_for_each_entry_continue - iterate over list of given type + * continuing after existing point + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_continue(pos, head, member) \ + for (pos = list_entry(pos->member.next, typeof(*pos), member); \ + prefetch(pos->member.next), &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop counter. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/* + * Double linked lists with a single pointer list head. + * Mostly useful for hash tables where the two pointer list head is + * too wasteful. + * You lose the ability to access the tail in O(1). + */ + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next, **pprev; +}; + +#define HLIST_HEAD_INIT { .first = NULL } +#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } +#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) +#define INIT_HLIST_NODE(ptr) ((ptr)->next = NULL, (ptr)->pprev = NULL) + +static inline int hlist_unhashed(const struct hlist_node *h) +{ + return !h->pprev; +} + +static inline int hlist_empty(const struct hlist_head *h) +{ + return !h->first; +} + +static inline void __hlist_del(struct hlist_node *n) +{ + struct hlist_node *next = n->next; + struct hlist_node **pprev = n->pprev; + *pprev = next; + if (next) + next->pprev = pprev; +} + +static inline void hlist_del(struct hlist_node *n) +{ + __hlist_del(n); + n->next = LIST_POISON1; + n->pprev = LIST_POISON2; +} + +static inline void hlist_del_init(struct hlist_node *n) +{ + if (n->pprev) { + __hlist_del(n); + INIT_HLIST_NODE(n); + } +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *first = h->first; + n->next = first; + if (first) + first->pprev = &n->next; + h->first = n; + n->pprev = &h->first; +} + +/* next must be != NULL */ +static inline void hlist_add_before(struct hlist_node *n, + struct hlist_node *next) +{ + n->pprev = next->pprev; + n->next = next; + next->pprev = &n->next; + *(n->pprev) = n; +} + +static inline void hlist_add_after(struct hlist_node *n, + struct hlist_node *next) +{ + next->next = n->next; + n->next = next; + next->pprev = &n->next; + + if(next->next) + next->next->pprev = &next->next; +} + +#define hlist_entry(ptr, type, member) container_of(ptr,type,member) + +#define hlist_for_each(pos, head) \ + for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \ + pos = pos->next) + +#define hlist_for_each_safe(pos, n, head) \ + for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ + pos = n) + +/** + * hlist_for_each_entry - iterate over list of given type + * @tpos: the type * to use as a loop counter. + * @pos: the &struct hlist_node to use as a loop counter. + * @head: the head for your list. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry(tpos, pos, head, member) \ + for (pos = (head)->first; \ + pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +/** + * hlist_for_each_entry_continue - iterate over a hlist continuing after existing point + * @tpos: the type * to use as a loop counter. + * @pos: the &struct hlist_node to use as a loop counter. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_continue(tpos, pos, member) \ + for (pos = (pos)->next; \ + pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +/** + * hlist_for_each_entry_from - iterate over a hlist continuing from existing point + * @tpos: the type * to use as a loop counter. + * @pos: the &struct hlist_node to use as a loop counter. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_from(tpos, pos, member) \ + for (; pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +/** + * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @tpos: the type * to use as a loop counter. + * @pos: the &struct hlist_node to use as a loop counter. + * @n: another &struct hlist_node to use as temporary storage + * @head: the head for your list. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ + for (pos = (head)->first; \ + pos && ({ n = pos->next; 1; }) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = n) + +#endif diff --git a/src/inc/md5evp.h b/src/inc/md5evp.h new file mode 100644 index 0000000..a522db7 --- /dev/null +++ b/src/inc/md5evp.h @@ -0,0 +1,81 @@ +/* + +md5evp.h + +gSOAP HTTP Content-MD5 digest plugin. + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- + + Defines MD5 handler using EVP interface (e.g. using OpenSSL) + + int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len) + context can be set and passed to subsequent calls. Parameters: + action = + MD5_INIT: init context + MD5_UPDATE: update context with data from buf with size len + MD5_FINAL: fill buf with 16 bytes MD5 hash value + MD5_DELETE: delete context + buf input data, output MD5 128 bit hash value + len length of input data + +*/ + +#ifndef MD5EVP_H +#define MD5EVP_H + +#include "stdsoap2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum md5_action { MD5_INIT, MD5_UPDATE, MD5_FINAL, MD5_DELETE }; + +int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/inc/soapH.h b/src/inc/soapH.h new file mode 100644 index 0000000..4a6eaaf --- /dev/null +++ b/src/inc/soapH.h @@ -0,0 +1,1532 @@ +/* soapH.h + Generated by gSOAP 2.7.12 from cwmp-1-1.h + Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. + This part of the software is released under one of the following licenses: + GPL, the gSOAP public license, or Genivia's license for commercial use. +*/ + +#ifndef soapH_H +#define soapH_H +#include "soapStub.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifndef WITH_NOIDREF +SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); +SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); +SOAP_FMAC3 void *SOAP_FMAC4 soap_getelement(struct soap*, int*); +SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); +SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); +#endif +SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); + +#ifndef SOAP_TYPE_byte +#define SOAP_TYPE_byte (3) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap*, char *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap*, const char*, int, const char *, const char*); +SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); +SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); + +#ifndef SOAP_TYPE_int +#define SOAP_TYPE_int (1) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap*, int *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap*, const char*, int, const int *, const char*); +SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); +SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); + +#ifndef SOAP_TYPE_unsignedByte +#define SOAP_TYPE_unsignedByte (9) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_unsignedByte(struct soap*, unsigned char *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_unsignedByte(struct soap*, const unsigned char *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_unsignedByte(struct soap*, const char*, int, const unsigned char *, const char*); +SOAP_FMAC3 unsigned char * SOAP_FMAC4 soap_get_unsignedByte(struct soap*, unsigned char *, const char*, const char*); +SOAP_FMAC3 unsigned char * SOAP_FMAC4 soap_in_unsignedByte(struct soap*, const char*, unsigned char *, const char*); + +#ifndef SOAP_TYPE_unsignedInt +#define SOAP_TYPE_unsignedInt (8) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_unsignedInt(struct soap*, unsigned int *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_unsignedInt(struct soap*, const unsigned int *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_unsignedInt(struct soap*, const char*, int, const unsigned int *, const char*); +SOAP_FMAC3 unsigned int * SOAP_FMAC4 soap_get_unsignedInt(struct soap*, unsigned int *, const char*, const char*); +SOAP_FMAC3 unsigned int * SOAP_FMAC4 soap_in_unsignedInt(struct soap*, const char*, unsigned int *, const char*); + +#ifndef SOAP_TYPE_time +#define SOAP_TYPE_time (37) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_time(struct soap*, time_t *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_time(struct soap*, const time_t *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_time(struct soap*, const char*, int, const time_t *, const char*); +SOAP_FMAC3 time_t * SOAP_FMAC4 soap_get_time(struct soap*, time_t *, const char*, const char*); +SOAP_FMAC3 time_t * SOAP_FMAC4 soap_in_time(struct soap*, const char*, time_t *, const char*); + +#ifndef SOAP_TYPE__cwmp1__UploadResponse_Status +#define SOAP_TYPE__cwmp1__UploadResponse_Status (95) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__UploadResponse_Status(struct soap*, enum _cwmp1__UploadResponse_Status *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__UploadResponse_Status(struct soap*, const enum _cwmp1__UploadResponse_Status *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__UploadResponse_Status(struct soap*, const char*, int, const enum _cwmp1__UploadResponse_Status *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__UploadResponse_Status2s(struct soap*, enum _cwmp1__UploadResponse_Status); +SOAP_FMAC3 enum _cwmp1__UploadResponse_Status * SOAP_FMAC4 soap_get__cwmp1__UploadResponse_Status(struct soap*, enum _cwmp1__UploadResponse_Status *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__UploadResponse_Status * SOAP_FMAC4 soap_in__cwmp1__UploadResponse_Status(struct soap*, const char*, enum _cwmp1__UploadResponse_Status *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__UploadResponse_Status(struct soap*, const char*, enum _cwmp1__UploadResponse_Status *); + +#ifndef SOAP_TYPE__cwmp1__DownloadResponse_Status +#define SOAP_TYPE__cwmp1__DownloadResponse_Status (76) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DownloadResponse_Status(struct soap*, enum _cwmp1__DownloadResponse_Status *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DownloadResponse_Status(struct soap*, const enum _cwmp1__DownloadResponse_Status *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DownloadResponse_Status(struct soap*, const char*, int, const enum _cwmp1__DownloadResponse_Status *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__DownloadResponse_Status2s(struct soap*, enum _cwmp1__DownloadResponse_Status); +SOAP_FMAC3 enum _cwmp1__DownloadResponse_Status * SOAP_FMAC4 soap_get__cwmp1__DownloadResponse_Status(struct soap*, enum _cwmp1__DownloadResponse_Status *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__DownloadResponse_Status * SOAP_FMAC4 soap_in__cwmp1__DownloadResponse_Status(struct soap*, const char*, enum _cwmp1__DownloadResponse_Status *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__DownloadResponse_Status(struct soap*, const char*, enum _cwmp1__DownloadResponse_Status *); + +#ifndef SOAP_TYPE__cwmp1__DeleteObjectResponse_Status +#define SOAP_TYPE__cwmp1__DeleteObjectResponse_Status (73) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DeleteObjectResponse_Status(struct soap*, enum _cwmp1__DeleteObjectResponse_Status *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DeleteObjectResponse_Status(struct soap*, const enum _cwmp1__DeleteObjectResponse_Status *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DeleteObjectResponse_Status(struct soap*, const char*, int, const enum _cwmp1__DeleteObjectResponse_Status *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__DeleteObjectResponse_Status2s(struct soap*, enum _cwmp1__DeleteObjectResponse_Status); +SOAP_FMAC3 enum _cwmp1__DeleteObjectResponse_Status * SOAP_FMAC4 soap_get__cwmp1__DeleteObjectResponse_Status(struct soap*, enum _cwmp1__DeleteObjectResponse_Status *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__DeleteObjectResponse_Status * SOAP_FMAC4 soap_in__cwmp1__DeleteObjectResponse_Status(struct soap*, const char*, enum _cwmp1__DeleteObjectResponse_Status *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__DeleteObjectResponse_Status(struct soap*, const char*, enum _cwmp1__DeleteObjectResponse_Status *); + +#ifndef SOAP_TYPE__cwmp1__AddObjectResponse_Status +#define SOAP_TYPE__cwmp1__AddObjectResponse_Status (70) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AddObjectResponse_Status(struct soap*, enum _cwmp1__AddObjectResponse_Status *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AddObjectResponse_Status(struct soap*, const enum _cwmp1__AddObjectResponse_Status *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AddObjectResponse_Status(struct soap*, const char*, int, const enum _cwmp1__AddObjectResponse_Status *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__AddObjectResponse_Status2s(struct soap*, enum _cwmp1__AddObjectResponse_Status); +SOAP_FMAC3 enum _cwmp1__AddObjectResponse_Status * SOAP_FMAC4 soap_get__cwmp1__AddObjectResponse_Status(struct soap*, enum _cwmp1__AddObjectResponse_Status *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__AddObjectResponse_Status * SOAP_FMAC4 soap_in__cwmp1__AddObjectResponse_Status(struct soap*, const char*, enum _cwmp1__AddObjectResponse_Status *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__AddObjectResponse_Status(struct soap*, const char*, enum _cwmp1__AddObjectResponse_Status *); + +#ifndef SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status +#define SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status (51) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterValuesResponse_Status(struct soap*, enum _cwmp1__SetParameterValuesResponse_Status *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterValuesResponse_Status(struct soap*, const enum _cwmp1__SetParameterValuesResponse_Status *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterValuesResponse_Status(struct soap*, const char*, int, const enum _cwmp1__SetParameterValuesResponse_Status *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__SetParameterValuesResponse_Status2s(struct soap*, enum _cwmp1__SetParameterValuesResponse_Status); +SOAP_FMAC3 enum _cwmp1__SetParameterValuesResponse_Status * SOAP_FMAC4 soap_get__cwmp1__SetParameterValuesResponse_Status(struct soap*, enum _cwmp1__SetParameterValuesResponse_Status *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__SetParameterValuesResponse_Status * SOAP_FMAC4 soap_in__cwmp1__SetParameterValuesResponse_Status(struct soap*, const char*, enum _cwmp1__SetParameterValuesResponse_Status *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__SetParameterValuesResponse_Status(struct soap*, const char*, enum _cwmp1__SetParameterValuesResponse_Status *); + +#ifndef SOAP_TYPE__cwmp1__OptionStruct_IsTransferable +#define SOAP_TYPE__cwmp1__OptionStruct_IsTransferable (39) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__OptionStruct_IsTransferable(struct soap*, enum _cwmp1__OptionStruct_IsTransferable *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__OptionStruct_IsTransferable(struct soap*, const enum _cwmp1__OptionStruct_IsTransferable *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__OptionStruct_IsTransferable(struct soap*, const char*, int, const enum _cwmp1__OptionStruct_IsTransferable *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__OptionStruct_IsTransferable2s(struct soap*, enum _cwmp1__OptionStruct_IsTransferable); +SOAP_FMAC3 enum _cwmp1__OptionStruct_IsTransferable * SOAP_FMAC4 soap_get__cwmp1__OptionStruct_IsTransferable(struct soap*, enum _cwmp1__OptionStruct_IsTransferable *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__OptionStruct_IsTransferable * SOAP_FMAC4 soap_in__cwmp1__OptionStruct_IsTransferable(struct soap*, const char*, enum _cwmp1__OptionStruct_IsTransferable *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__OptionStruct_IsTransferable(struct soap*, const char*, enum _cwmp1__OptionStruct_IsTransferable *); + +#ifndef SOAP_TYPE__cwmp1__OptionStruct_Mode +#define SOAP_TYPE__cwmp1__OptionStruct_Mode (36) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__OptionStruct_Mode(struct soap*, enum _cwmp1__OptionStruct_Mode *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__OptionStruct_Mode(struct soap*, const enum _cwmp1__OptionStruct_Mode *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__OptionStruct_Mode(struct soap*, const char*, int, const enum _cwmp1__OptionStruct_Mode *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__OptionStruct_Mode2s(struct soap*, enum _cwmp1__OptionStruct_Mode); +SOAP_FMAC3 enum _cwmp1__OptionStruct_Mode * SOAP_FMAC4 soap_get__cwmp1__OptionStruct_Mode(struct soap*, enum _cwmp1__OptionStruct_Mode *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__OptionStruct_Mode * SOAP_FMAC4 soap_in__cwmp1__OptionStruct_Mode(struct soap*, const char*, enum _cwmp1__OptionStruct_Mode *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__OptionStruct_Mode(struct soap*, const char*, enum _cwmp1__OptionStruct_Mode *); + +#ifndef SOAP_TYPE__cwmp1__OptionStruct_State +#define SOAP_TYPE__cwmp1__OptionStruct_State (35) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__OptionStruct_State(struct soap*, enum _cwmp1__OptionStruct_State *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__OptionStruct_State(struct soap*, const enum _cwmp1__OptionStruct_State *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__OptionStruct_State(struct soap*, const char*, int, const enum _cwmp1__OptionStruct_State *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__OptionStruct_State2s(struct soap*, enum _cwmp1__OptionStruct_State); +SOAP_FMAC3 enum _cwmp1__OptionStruct_State * SOAP_FMAC4 soap_get__cwmp1__OptionStruct_State(struct soap*, enum _cwmp1__OptionStruct_State *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__OptionStruct_State * SOAP_FMAC4 soap_in__cwmp1__OptionStruct_State(struct soap*, const char*, enum _cwmp1__OptionStruct_State *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__OptionStruct_State(struct soap*, const char*, enum _cwmp1__OptionStruct_State *); + +#ifndef SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State +#define SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State (32) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AllQueuedTransferStruct_State(struct soap*, enum _cwmp1__AllQueuedTransferStruct_State *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AllQueuedTransferStruct_State(struct soap*, const enum _cwmp1__AllQueuedTransferStruct_State *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AllQueuedTransferStruct_State(struct soap*, const char*, int, const enum _cwmp1__AllQueuedTransferStruct_State *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__AllQueuedTransferStruct_State2s(struct soap*, enum _cwmp1__AllQueuedTransferStruct_State); +SOAP_FMAC3 enum _cwmp1__AllQueuedTransferStruct_State * SOAP_FMAC4 soap_get__cwmp1__AllQueuedTransferStruct_State(struct soap*, enum _cwmp1__AllQueuedTransferStruct_State *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__AllQueuedTransferStruct_State * SOAP_FMAC4 soap_in__cwmp1__AllQueuedTransferStruct_State(struct soap*, const char*, enum _cwmp1__AllQueuedTransferStruct_State *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__AllQueuedTransferStruct_State(struct soap*, const char*, enum _cwmp1__AllQueuedTransferStruct_State *); + +#ifndef SOAP_TYPE__cwmp1__QueuedTransferStruct_State +#define SOAP_TYPE__cwmp1__QueuedTransferStruct_State (30) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__QueuedTransferStruct_State(struct soap*, enum _cwmp1__QueuedTransferStruct_State *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__QueuedTransferStruct_State(struct soap*, const enum _cwmp1__QueuedTransferStruct_State *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__QueuedTransferStruct_State(struct soap*, const char*, int, const enum _cwmp1__QueuedTransferStruct_State *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__QueuedTransferStruct_State2s(struct soap*, enum _cwmp1__QueuedTransferStruct_State); +SOAP_FMAC3 enum _cwmp1__QueuedTransferStruct_State * SOAP_FMAC4 soap_get__cwmp1__QueuedTransferStruct_State(struct soap*, enum _cwmp1__QueuedTransferStruct_State *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__QueuedTransferStruct_State * SOAP_FMAC4 soap_in__cwmp1__QueuedTransferStruct_State(struct soap*, const char*, enum _cwmp1__QueuedTransferStruct_State *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__QueuedTransferStruct_State(struct soap*, const char*, enum _cwmp1__QueuedTransferStruct_State *); + +#ifndef SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification +#define SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification (28) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ParameterAttributeStruct_Notification(struct soap*, enum _cwmp1__ParameterAttributeStruct_Notification *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ParameterAttributeStruct_Notification(struct soap*, const enum _cwmp1__ParameterAttributeStruct_Notification *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ParameterAttributeStruct_Notification(struct soap*, const char*, int, const enum _cwmp1__ParameterAttributeStruct_Notification *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__ParameterAttributeStruct_Notification2s(struct soap*, enum _cwmp1__ParameterAttributeStruct_Notification); +SOAP_FMAC3 enum _cwmp1__ParameterAttributeStruct_Notification * SOAP_FMAC4 soap_get__cwmp1__ParameterAttributeStruct_Notification(struct soap*, enum _cwmp1__ParameterAttributeStruct_Notification *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__ParameterAttributeStruct_Notification * SOAP_FMAC4 soap_in__cwmp1__ParameterAttributeStruct_Notification(struct soap*, const char*, enum _cwmp1__ParameterAttributeStruct_Notification *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__ParameterAttributeStruct_Notification(struct soap*, const char*, enum _cwmp1__ParameterAttributeStruct_Notification *); + +#ifndef SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification +#define SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification (24) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterAttributesStruct_Notification(struct soap*, enum _cwmp1__SetParameterAttributesStruct_Notification *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterAttributesStruct_Notification(struct soap*, const enum _cwmp1__SetParameterAttributesStruct_Notification *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterAttributesStruct_Notification(struct soap*, const char*, int, const enum _cwmp1__SetParameterAttributesStruct_Notification *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__SetParameterAttributesStruct_Notification2s(struct soap*, enum _cwmp1__SetParameterAttributesStruct_Notification); +SOAP_FMAC3 enum _cwmp1__SetParameterAttributesStruct_Notification * SOAP_FMAC4 soap_get__cwmp1__SetParameterAttributesStruct_Notification(struct soap*, enum _cwmp1__SetParameterAttributesStruct_Notification *, const char*, const char*); +SOAP_FMAC3 enum _cwmp1__SetParameterAttributesStruct_Notification * SOAP_FMAC4 soap_in__cwmp1__SetParameterAttributesStruct_Notification(struct soap*, const char*, enum _cwmp1__SetParameterAttributesStruct_Notification *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__SetParameterAttributesStruct_Notification(struct soap*, const char*, enum _cwmp1__SetParameterAttributesStruct_Notification *); + +#ifndef SOAP_TYPE_xsd__boolean +#define SOAP_TYPE_xsd__boolean (12) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__boolean(struct soap*, enum xsd__boolean *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__boolean(struct soap*, const enum xsd__boolean *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__boolean(struct soap*, const char*, int, const enum xsd__boolean *, const char*); + +SOAP_FMAC3S const char* SOAP_FMAC4S soap_xsd__boolean2s(struct soap*, enum xsd__boolean); +SOAP_FMAC3 enum xsd__boolean * SOAP_FMAC4 soap_get_xsd__boolean(struct soap*, enum xsd__boolean *, const char*, const char*); +SOAP_FMAC3 enum xsd__boolean * SOAP_FMAC4 soap_in_xsd__boolean(struct soap*, const char*, enum xsd__boolean *, const char*); + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2xsd__boolean(struct soap*, const char*, enum xsd__boolean *); + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_SOAP_ENV__Fault +#define SOAP_TYPE_SOAP_ENV__Fault (151) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap*, const char*, int, const struct SOAP_ENV__Fault *, const char*); +SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); + +#endif + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_SOAP_ENV__Reason +#define SOAP_TYPE_SOAP_ENV__Reason (150) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap*, const char*, int, const struct SOAP_ENV__Reason *, const char*); +SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); + +#endif + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_SOAP_ENV__Detail +#define SOAP_TYPE_SOAP_ENV__Detail (147) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap*, const char*, int, const struct SOAP_ENV__Detail *, const char*); +SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); + +#endif + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_SOAP_ENV__Code +#define SOAP_TYPE_SOAP_ENV__Code (145) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap*, const char*, int, const struct SOAP_ENV__Code *, const char*); +SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); + +#endif + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_SOAP_ENV__Header +#define SOAP_TYPE_SOAP_ENV__Header (144) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap*, const char*, int, const struct SOAP_ENV__Header *, const char*); +SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); + +#endif + +#ifndef SOAP_TYPE_cwmp1__Inform +#define SOAP_TYPE_cwmp1__Inform (143) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__Inform(struct soap*, struct cwmp1__Inform *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__Inform(struct soap*, const struct cwmp1__Inform *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__Inform(struct soap*, const struct cwmp1__Inform *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__Inform(struct soap*, const char*, int, const struct cwmp1__Inform *, const char*); +SOAP_FMAC3 struct cwmp1__Inform * SOAP_FMAC4 soap_get_cwmp1__Inform(struct soap*, struct cwmp1__Inform *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__Inform * SOAP_FMAC4 soap_in_cwmp1__Inform(struct soap*, const char*, struct cwmp1__Inform *, const char*); + +#ifndef SOAP_TYPE_cwmp1__InformResponse +#define SOAP_TYPE_cwmp1__InformResponse (142) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__InformResponse(struct soap*, struct cwmp1__InformResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__InformResponse(struct soap*, const struct cwmp1__InformResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__InformResponse(struct soap*, const struct cwmp1__InformResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__InformResponse(struct soap*, const char*, int, const struct cwmp1__InformResponse *, const char*); +SOAP_FMAC3 struct cwmp1__InformResponse * SOAP_FMAC4 soap_get_cwmp1__InformResponse(struct soap*, struct cwmp1__InformResponse *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__InformResponse * SOAP_FMAC4 soap_in_cwmp1__InformResponse(struct soap*, const char*, struct cwmp1__InformResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__HoldRequests +#define SOAP_TYPE__cwmp1__HoldRequests (139) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__HoldRequests(struct soap*, struct _cwmp1__HoldRequests *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__HoldRequests(struct soap*, const struct _cwmp1__HoldRequests *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__HoldRequests(struct soap*, const struct _cwmp1__HoldRequests *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__HoldRequests(struct soap*, const char*, int, const struct _cwmp1__HoldRequests *, const char*); +SOAP_FMAC3 struct _cwmp1__HoldRequests * SOAP_FMAC4 soap_get__cwmp1__HoldRequests(struct soap*, struct _cwmp1__HoldRequests *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__HoldRequests * SOAP_FMAC4 soap_in__cwmp1__HoldRequests(struct soap*, const char*, struct _cwmp1__HoldRequests *, const char*); + +#ifndef SOAP_TYPE__cwmp1__ID +#define SOAP_TYPE__cwmp1__ID (138) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ID(struct soap*, struct _cwmp1__ID *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__ID(struct soap*, const struct _cwmp1__ID *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ID(struct soap*, const struct _cwmp1__ID *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ID(struct soap*, const char*, int, const struct _cwmp1__ID *, const char*); +SOAP_FMAC3 struct _cwmp1__ID * SOAP_FMAC4 soap_get__cwmp1__ID(struct soap*, struct _cwmp1__ID *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__ID * SOAP_FMAC4 soap_in__cwmp1__ID(struct soap*, const char*, struct _cwmp1__ID *, const char*); + +#ifndef SOAP_TYPE__cwmp1__RequestDownloadResponse +#define SOAP_TYPE__cwmp1__RequestDownloadResponse (117) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__RequestDownloadResponse(struct soap*, struct _cwmp1__RequestDownloadResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__RequestDownloadResponse(struct soap*, const struct _cwmp1__RequestDownloadResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__RequestDownloadResponse(struct soap*, const struct _cwmp1__RequestDownloadResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__RequestDownloadResponse(struct soap*, const char*, int, const struct _cwmp1__RequestDownloadResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__RequestDownloadResponse * SOAP_FMAC4 soap_get__cwmp1__RequestDownloadResponse(struct soap*, struct _cwmp1__RequestDownloadResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__RequestDownloadResponse * SOAP_FMAC4 soap_in__cwmp1__RequestDownloadResponse(struct soap*, const char*, struct _cwmp1__RequestDownloadResponse *, const char*); + +#ifndef SOAP_TYPE_cwmp1FileTypeArg +#define SOAP_TYPE_cwmp1FileTypeArg (115) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1FileTypeArg(struct soap*, struct cwmp1FileTypeArg *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1FileTypeArg(struct soap*, struct cwmp1FileTypeArg const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1FileTypeArg(struct soap*, const struct cwmp1FileTypeArg *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1FileTypeArg(struct soap*, const char*, int, const struct cwmp1FileTypeArg *, const char*); +SOAP_FMAC3 struct cwmp1FileTypeArg * SOAP_FMAC4 soap_get_cwmp1FileTypeArg(struct soap*, struct cwmp1FileTypeArg *, const char*, const char*); +SOAP_FMAC3 struct cwmp1FileTypeArg * SOAP_FMAC4 soap_in_cwmp1FileTypeArg(struct soap*, const char*, struct cwmp1FileTypeArg *, const char*); + +#ifndef SOAP_TYPE__cwmp1__RequestDownload +#define SOAP_TYPE__cwmp1__RequestDownload (114) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__RequestDownload(struct soap*, struct _cwmp1__RequestDownload *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__RequestDownload(struct soap*, const struct _cwmp1__RequestDownload *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__RequestDownload(struct soap*, const struct _cwmp1__RequestDownload *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__RequestDownload(struct soap*, const char*, int, const struct _cwmp1__RequestDownload *, const char*); +SOAP_FMAC3 struct _cwmp1__RequestDownload * SOAP_FMAC4 soap_get__cwmp1__RequestDownload(struct soap*, struct _cwmp1__RequestDownload *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__RequestDownload * SOAP_FMAC4 soap_in__cwmp1__RequestDownload(struct soap*, const char*, struct _cwmp1__RequestDownload *, const char*); + +#ifndef SOAP_TYPE__cwmp1__KickedResponse +#define SOAP_TYPE__cwmp1__KickedResponse (113) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__KickedResponse(struct soap*, struct _cwmp1__KickedResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__KickedResponse(struct soap*, const struct _cwmp1__KickedResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__KickedResponse(struct soap*, const struct _cwmp1__KickedResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__KickedResponse(struct soap*, const char*, int, const struct _cwmp1__KickedResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__KickedResponse * SOAP_FMAC4 soap_get__cwmp1__KickedResponse(struct soap*, struct _cwmp1__KickedResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__KickedResponse * SOAP_FMAC4 soap_in__cwmp1__KickedResponse(struct soap*, const char*, struct _cwmp1__KickedResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Kicked +#define SOAP_TYPE__cwmp1__Kicked (112) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Kicked(struct soap*, struct _cwmp1__Kicked *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Kicked(struct soap*, const struct _cwmp1__Kicked *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Kicked(struct soap*, const struct _cwmp1__Kicked *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Kicked(struct soap*, const char*, int, const struct _cwmp1__Kicked *, const char*); +SOAP_FMAC3 struct _cwmp1__Kicked * SOAP_FMAC4 soap_get__cwmp1__Kicked(struct soap*, struct _cwmp1__Kicked *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Kicked * SOAP_FMAC4 soap_in__cwmp1__Kicked(struct soap*, const char*, struct _cwmp1__Kicked *, const char*); + +#ifndef SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse +#define SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse (111) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AutonomousTransferCompleteResponse(struct soap*, struct _cwmp1__AutonomousTransferCompleteResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AutonomousTransferCompleteResponse(struct soap*, const struct _cwmp1__AutonomousTransferCompleteResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AutonomousTransferCompleteResponse(struct soap*, const struct _cwmp1__AutonomousTransferCompleteResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AutonomousTransferCompleteResponse(struct soap*, const char*, int, const struct _cwmp1__AutonomousTransferCompleteResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__AutonomousTransferCompleteResponse * SOAP_FMAC4 soap_get__cwmp1__AutonomousTransferCompleteResponse(struct soap*, struct _cwmp1__AutonomousTransferCompleteResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__AutonomousTransferCompleteResponse * SOAP_FMAC4 soap_in__cwmp1__AutonomousTransferCompleteResponse(struct soap*, const char*, struct _cwmp1__AutonomousTransferCompleteResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__AutonomousTransferComplete +#define SOAP_TYPE__cwmp1__AutonomousTransferComplete (110) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AutonomousTransferComplete(struct soap*, struct _cwmp1__AutonomousTransferComplete *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AutonomousTransferComplete(struct soap*, const struct _cwmp1__AutonomousTransferComplete *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AutonomousTransferComplete(struct soap*, const struct _cwmp1__AutonomousTransferComplete *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AutonomousTransferComplete(struct soap*, const char*, int, const struct _cwmp1__AutonomousTransferComplete *, const char*); +SOAP_FMAC3 struct _cwmp1__AutonomousTransferComplete * SOAP_FMAC4 soap_get__cwmp1__AutonomousTransferComplete(struct soap*, struct _cwmp1__AutonomousTransferComplete *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__AutonomousTransferComplete * SOAP_FMAC4 soap_in__cwmp1__AutonomousTransferComplete(struct soap*, const char*, struct _cwmp1__AutonomousTransferComplete *, const char*); + +#ifndef SOAP_TYPE__cwmp1__TransferCompleteResponse +#define SOAP_TYPE__cwmp1__TransferCompleteResponse (109) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__TransferCompleteResponse(struct soap*, struct _cwmp1__TransferCompleteResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__TransferCompleteResponse(struct soap*, const struct _cwmp1__TransferCompleteResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__TransferCompleteResponse(struct soap*, const struct _cwmp1__TransferCompleteResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__TransferCompleteResponse(struct soap*, const char*, int, const struct _cwmp1__TransferCompleteResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__TransferCompleteResponse * SOAP_FMAC4 soap_get__cwmp1__TransferCompleteResponse(struct soap*, struct _cwmp1__TransferCompleteResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__TransferCompleteResponse * SOAP_FMAC4 soap_in__cwmp1__TransferCompleteResponse(struct soap*, const char*, struct _cwmp1__TransferCompleteResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__TransferComplete +#define SOAP_TYPE__cwmp1__TransferComplete (107) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__TransferComplete(struct soap*, struct _cwmp1__TransferComplete *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__TransferComplete(struct soap*, const struct _cwmp1__TransferComplete *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__TransferComplete(struct soap*, const struct _cwmp1__TransferComplete *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__TransferComplete(struct soap*, const char*, int, const struct _cwmp1__TransferComplete *, const char*); +SOAP_FMAC3 struct _cwmp1__TransferComplete * SOAP_FMAC4 soap_get__cwmp1__TransferComplete(struct soap*, struct _cwmp1__TransferComplete *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__TransferComplete * SOAP_FMAC4 soap_in__cwmp1__TransferComplete(struct soap*, const char*, struct _cwmp1__TransferComplete *, const char*); + +#ifndef SOAP_TYPE__cwmp1__InformResponse +#define SOAP_TYPE__cwmp1__InformResponse (106) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__InformResponse(struct soap*, struct _cwmp1__InformResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__InformResponse(struct soap*, const struct _cwmp1__InformResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__InformResponse(struct soap*, const struct _cwmp1__InformResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__InformResponse(struct soap*, const char*, int, const struct _cwmp1__InformResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__InformResponse * SOAP_FMAC4 soap_get__cwmp1__InformResponse(struct soap*, struct _cwmp1__InformResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__InformResponse * SOAP_FMAC4 soap_in__cwmp1__InformResponse(struct soap*, const char*, struct _cwmp1__InformResponse *, const char*); + +#ifndef SOAP_TYPE_cwmp1EventList +#define SOAP_TYPE_cwmp1EventList (104) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1EventList(struct soap*, struct cwmp1EventList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1EventList(struct soap*, struct cwmp1EventList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1EventList(struct soap*, const struct cwmp1EventList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1EventList(struct soap*, const char*, int, const struct cwmp1EventList *, const char*); +SOAP_FMAC3 struct cwmp1EventList * SOAP_FMAC4 soap_get_cwmp1EventList(struct soap*, struct cwmp1EventList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1EventList * SOAP_FMAC4 soap_in_cwmp1EventList(struct soap*, const char*, struct cwmp1EventList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Inform +#define SOAP_TYPE__cwmp1__Inform (102) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Inform(struct soap*, struct _cwmp1__Inform *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Inform(struct soap*, const struct _cwmp1__Inform *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Inform(struct soap*, const struct _cwmp1__Inform *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Inform(struct soap*, const char*, int, const struct _cwmp1__Inform *, const char*); +SOAP_FMAC3 struct _cwmp1__Inform * SOAP_FMAC4 soap_get__cwmp1__Inform(struct soap*, struct _cwmp1__Inform *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Inform * SOAP_FMAC4 soap_in__cwmp1__Inform(struct soap*, const char*, struct _cwmp1__Inform *, const char*); + +#ifndef SOAP_TYPE_cwmp1AllTransferList +#define SOAP_TYPE_cwmp1AllTransferList (100) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1AllTransferList(struct soap*, struct cwmp1AllTransferList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1AllTransferList(struct soap*, struct cwmp1AllTransferList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1AllTransferList(struct soap*, const struct cwmp1AllTransferList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1AllTransferList(struct soap*, const char*, int, const struct cwmp1AllTransferList *, const char*); +SOAP_FMAC3 struct cwmp1AllTransferList * SOAP_FMAC4 soap_get_cwmp1AllTransferList(struct soap*, struct cwmp1AllTransferList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1AllTransferList * SOAP_FMAC4 soap_in_cwmp1AllTransferList(struct soap*, const char*, struct cwmp1AllTransferList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse +#define SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse (99) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetAllQueuedTransfersResponse(struct soap*, struct _cwmp1__GetAllQueuedTransfersResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetAllQueuedTransfersResponse(struct soap*, const struct _cwmp1__GetAllQueuedTransfersResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetAllQueuedTransfersResponse(struct soap*, const struct _cwmp1__GetAllQueuedTransfersResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetAllQueuedTransfersResponse(struct soap*, const char*, int, const struct _cwmp1__GetAllQueuedTransfersResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfersResponse * SOAP_FMAC4 soap_get__cwmp1__GetAllQueuedTransfersResponse(struct soap*, struct _cwmp1__GetAllQueuedTransfersResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfersResponse * SOAP_FMAC4 soap_in__cwmp1__GetAllQueuedTransfersResponse(struct soap*, const char*, struct _cwmp1__GetAllQueuedTransfersResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetAllQueuedTransfers +#define SOAP_TYPE__cwmp1__GetAllQueuedTransfers (98) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetAllQueuedTransfers(struct soap*, struct _cwmp1__GetAllQueuedTransfers *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetAllQueuedTransfers(struct soap*, const struct _cwmp1__GetAllQueuedTransfers *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetAllQueuedTransfers(struct soap*, const struct _cwmp1__GetAllQueuedTransfers *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetAllQueuedTransfers(struct soap*, const char*, int, const struct _cwmp1__GetAllQueuedTransfers *, const char*); +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfers * SOAP_FMAC4 soap_get__cwmp1__GetAllQueuedTransfers(struct soap*, struct _cwmp1__GetAllQueuedTransfers *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfers * SOAP_FMAC4 soap_in__cwmp1__GetAllQueuedTransfers(struct soap*, const char*, struct _cwmp1__GetAllQueuedTransfers *, const char*); + +#ifndef SOAP_TYPE__cwmp1__FactoryResetResponse +#define SOAP_TYPE__cwmp1__FactoryResetResponse (97) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__FactoryResetResponse(struct soap*, struct _cwmp1__FactoryResetResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__FactoryResetResponse(struct soap*, const struct _cwmp1__FactoryResetResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__FactoryResetResponse(struct soap*, const struct _cwmp1__FactoryResetResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__FactoryResetResponse(struct soap*, const char*, int, const struct _cwmp1__FactoryResetResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__FactoryResetResponse * SOAP_FMAC4 soap_get__cwmp1__FactoryResetResponse(struct soap*, struct _cwmp1__FactoryResetResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__FactoryResetResponse * SOAP_FMAC4 soap_in__cwmp1__FactoryResetResponse(struct soap*, const char*, struct _cwmp1__FactoryResetResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__FactoryReset +#define SOAP_TYPE__cwmp1__FactoryReset (96) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__FactoryReset(struct soap*, struct _cwmp1__FactoryReset *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__FactoryReset(struct soap*, const struct _cwmp1__FactoryReset *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__FactoryReset(struct soap*, const struct _cwmp1__FactoryReset *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__FactoryReset(struct soap*, const char*, int, const struct _cwmp1__FactoryReset *, const char*); +SOAP_FMAC3 struct _cwmp1__FactoryReset * SOAP_FMAC4 soap_get__cwmp1__FactoryReset(struct soap*, struct _cwmp1__FactoryReset *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__FactoryReset * SOAP_FMAC4 soap_in__cwmp1__FactoryReset(struct soap*, const char*, struct _cwmp1__FactoryReset *, const char*); + +#ifndef SOAP_TYPE__cwmp1__UploadResponse +#define SOAP_TYPE__cwmp1__UploadResponse (94) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__UploadResponse(struct soap*, struct _cwmp1__UploadResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__UploadResponse(struct soap*, const struct _cwmp1__UploadResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__UploadResponse(struct soap*, const struct _cwmp1__UploadResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__UploadResponse(struct soap*, const char*, int, const struct _cwmp1__UploadResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__UploadResponse * SOAP_FMAC4 soap_get__cwmp1__UploadResponse(struct soap*, struct _cwmp1__UploadResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__UploadResponse * SOAP_FMAC4 soap_in__cwmp1__UploadResponse(struct soap*, const char*, struct _cwmp1__UploadResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Upload +#define SOAP_TYPE__cwmp1__Upload (93) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Upload(struct soap*, struct _cwmp1__Upload *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Upload(struct soap*, const struct _cwmp1__Upload *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Upload(struct soap*, const struct _cwmp1__Upload *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Upload(struct soap*, const char*, int, const struct _cwmp1__Upload *, const char*); +SOAP_FMAC3 struct _cwmp1__Upload * SOAP_FMAC4 soap_get__cwmp1__Upload(struct soap*, struct _cwmp1__Upload *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Upload * SOAP_FMAC4 soap_in__cwmp1__Upload(struct soap*, const char*, struct _cwmp1__Upload *, const char*); + +#ifndef SOAP_TYPE_cwmp1OptionList +#define SOAP_TYPE_cwmp1OptionList (91) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1OptionList(struct soap*, struct cwmp1OptionList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1OptionList(struct soap*, struct cwmp1OptionList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1OptionList(struct soap*, const struct cwmp1OptionList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1OptionList(struct soap*, const char*, int, const struct cwmp1OptionList *, const char*); +SOAP_FMAC3 struct cwmp1OptionList * SOAP_FMAC4 soap_get_cwmp1OptionList(struct soap*, struct cwmp1OptionList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1OptionList * SOAP_FMAC4 soap_in_cwmp1OptionList(struct soap*, const char*, struct cwmp1OptionList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetOptionsResponse +#define SOAP_TYPE__cwmp1__GetOptionsResponse (90) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetOptionsResponse(struct soap*, struct _cwmp1__GetOptionsResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetOptionsResponse(struct soap*, const struct _cwmp1__GetOptionsResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetOptionsResponse(struct soap*, const struct _cwmp1__GetOptionsResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetOptionsResponse(struct soap*, const char*, int, const struct _cwmp1__GetOptionsResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetOptionsResponse * SOAP_FMAC4 soap_get__cwmp1__GetOptionsResponse(struct soap*, struct _cwmp1__GetOptionsResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetOptionsResponse * SOAP_FMAC4 soap_in__cwmp1__GetOptionsResponse(struct soap*, const char*, struct _cwmp1__GetOptionsResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetOptions +#define SOAP_TYPE__cwmp1__GetOptions (89) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetOptions(struct soap*, struct _cwmp1__GetOptions *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetOptions(struct soap*, const struct _cwmp1__GetOptions *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetOptions(struct soap*, const struct _cwmp1__GetOptions *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetOptions(struct soap*, const char*, int, const struct _cwmp1__GetOptions *, const char*); +SOAP_FMAC3 struct _cwmp1__GetOptions * SOAP_FMAC4 soap_get__cwmp1__GetOptions(struct soap*, struct _cwmp1__GetOptions *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetOptions * SOAP_FMAC4 soap_in__cwmp1__GetOptions(struct soap*, const char*, struct _cwmp1__GetOptions *, const char*); + +#ifndef SOAP_TYPE__cwmp1__SetVouchersResponse +#define SOAP_TYPE__cwmp1__SetVouchersResponse (88) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetVouchersResponse(struct soap*, struct _cwmp1__SetVouchersResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetVouchersResponse(struct soap*, const struct _cwmp1__SetVouchersResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetVouchersResponse(struct soap*, const struct _cwmp1__SetVouchersResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetVouchersResponse(struct soap*, const char*, int, const struct _cwmp1__SetVouchersResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__SetVouchersResponse * SOAP_FMAC4 soap_get__cwmp1__SetVouchersResponse(struct soap*, struct _cwmp1__SetVouchersResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__SetVouchersResponse * SOAP_FMAC4 soap_in__cwmp1__SetVouchersResponse(struct soap*, const char*, struct _cwmp1__SetVouchersResponse *, const char*); + +#ifndef SOAP_TYPE_cwmp1VoucherList +#define SOAP_TYPE_cwmp1VoucherList (86) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1VoucherList(struct soap*, struct cwmp1VoucherList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1VoucherList(struct soap*, struct cwmp1VoucherList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1VoucherList(struct soap*, const struct cwmp1VoucherList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1VoucherList(struct soap*, const char*, int, const struct cwmp1VoucherList *, const char*); +SOAP_FMAC3 struct cwmp1VoucherList * SOAP_FMAC4 soap_get_cwmp1VoucherList(struct soap*, struct cwmp1VoucherList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1VoucherList * SOAP_FMAC4 soap_in_cwmp1VoucherList(struct soap*, const char*, struct cwmp1VoucherList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__SetVouchers +#define SOAP_TYPE__cwmp1__SetVouchers (85) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetVouchers(struct soap*, struct _cwmp1__SetVouchers *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetVouchers(struct soap*, const struct _cwmp1__SetVouchers *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetVouchers(struct soap*, const struct _cwmp1__SetVouchers *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetVouchers(struct soap*, const char*, int, const struct _cwmp1__SetVouchers *, const char*); +SOAP_FMAC3 struct _cwmp1__SetVouchers * SOAP_FMAC4 soap_get__cwmp1__SetVouchers(struct soap*, struct _cwmp1__SetVouchers *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__SetVouchers * SOAP_FMAC4 soap_in__cwmp1__SetVouchers(struct soap*, const char*, struct _cwmp1__SetVouchers *, const char*); + +#ifndef SOAP_TYPE__cwmp1__ScheduleInformResponse +#define SOAP_TYPE__cwmp1__ScheduleInformResponse (84) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ScheduleInformResponse(struct soap*, struct _cwmp1__ScheduleInformResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__ScheduleInformResponse(struct soap*, const struct _cwmp1__ScheduleInformResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ScheduleInformResponse(struct soap*, const struct _cwmp1__ScheduleInformResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ScheduleInformResponse(struct soap*, const char*, int, const struct _cwmp1__ScheduleInformResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__ScheduleInformResponse * SOAP_FMAC4 soap_get__cwmp1__ScheduleInformResponse(struct soap*, struct _cwmp1__ScheduleInformResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__ScheduleInformResponse * SOAP_FMAC4 soap_in__cwmp1__ScheduleInformResponse(struct soap*, const char*, struct _cwmp1__ScheduleInformResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__ScheduleInform +#define SOAP_TYPE__cwmp1__ScheduleInform (83) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ScheduleInform(struct soap*, struct _cwmp1__ScheduleInform *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__ScheduleInform(struct soap*, const struct _cwmp1__ScheduleInform *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ScheduleInform(struct soap*, const struct _cwmp1__ScheduleInform *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ScheduleInform(struct soap*, const char*, int, const struct _cwmp1__ScheduleInform *, const char*); +SOAP_FMAC3 struct _cwmp1__ScheduleInform * SOAP_FMAC4 soap_get__cwmp1__ScheduleInform(struct soap*, struct _cwmp1__ScheduleInform *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__ScheduleInform * SOAP_FMAC4 soap_in__cwmp1__ScheduleInform(struct soap*, const char*, struct _cwmp1__ScheduleInform *, const char*); + +#ifndef SOAP_TYPE_cwmp1TransferList +#define SOAP_TYPE_cwmp1TransferList (81) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1TransferList(struct soap*, struct cwmp1TransferList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1TransferList(struct soap*, struct cwmp1TransferList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1TransferList(struct soap*, const struct cwmp1TransferList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1TransferList(struct soap*, const char*, int, const struct cwmp1TransferList *, const char*); +SOAP_FMAC3 struct cwmp1TransferList * SOAP_FMAC4 soap_get_cwmp1TransferList(struct soap*, struct cwmp1TransferList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1TransferList * SOAP_FMAC4 soap_in_cwmp1TransferList(struct soap*, const char*, struct cwmp1TransferList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetQueuedTransfersResponse +#define SOAP_TYPE__cwmp1__GetQueuedTransfersResponse (80) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetQueuedTransfersResponse(struct soap*, struct _cwmp1__GetQueuedTransfersResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetQueuedTransfersResponse(struct soap*, const struct _cwmp1__GetQueuedTransfersResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetQueuedTransfersResponse(struct soap*, const struct _cwmp1__GetQueuedTransfersResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetQueuedTransfersResponse(struct soap*, const char*, int, const struct _cwmp1__GetQueuedTransfersResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfersResponse * SOAP_FMAC4 soap_get__cwmp1__GetQueuedTransfersResponse(struct soap*, struct _cwmp1__GetQueuedTransfersResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfersResponse * SOAP_FMAC4 soap_in__cwmp1__GetQueuedTransfersResponse(struct soap*, const char*, struct _cwmp1__GetQueuedTransfersResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetQueuedTransfers +#define SOAP_TYPE__cwmp1__GetQueuedTransfers (79) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetQueuedTransfers(struct soap*, struct _cwmp1__GetQueuedTransfers *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetQueuedTransfers(struct soap*, const struct _cwmp1__GetQueuedTransfers *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetQueuedTransfers(struct soap*, const struct _cwmp1__GetQueuedTransfers *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetQueuedTransfers(struct soap*, const char*, int, const struct _cwmp1__GetQueuedTransfers *, const char*); +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfers * SOAP_FMAC4 soap_get__cwmp1__GetQueuedTransfers(struct soap*, struct _cwmp1__GetQueuedTransfers *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfers * SOAP_FMAC4 soap_in__cwmp1__GetQueuedTransfers(struct soap*, const char*, struct _cwmp1__GetQueuedTransfers *, const char*); + +#ifndef SOAP_TYPE__cwmp1__RebootResponse +#define SOAP_TYPE__cwmp1__RebootResponse (78) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__RebootResponse(struct soap*, struct _cwmp1__RebootResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__RebootResponse(struct soap*, const struct _cwmp1__RebootResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__RebootResponse(struct soap*, const struct _cwmp1__RebootResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__RebootResponse(struct soap*, const char*, int, const struct _cwmp1__RebootResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__RebootResponse * SOAP_FMAC4 soap_get__cwmp1__RebootResponse(struct soap*, struct _cwmp1__RebootResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__RebootResponse * SOAP_FMAC4 soap_in__cwmp1__RebootResponse(struct soap*, const char*, struct _cwmp1__RebootResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Reboot +#define SOAP_TYPE__cwmp1__Reboot (77) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Reboot(struct soap*, struct _cwmp1__Reboot *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Reboot(struct soap*, const struct _cwmp1__Reboot *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Reboot(struct soap*, const struct _cwmp1__Reboot *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Reboot(struct soap*, const char*, int, const struct _cwmp1__Reboot *, const char*); +SOAP_FMAC3 struct _cwmp1__Reboot * SOAP_FMAC4 soap_get__cwmp1__Reboot(struct soap*, struct _cwmp1__Reboot *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Reboot * SOAP_FMAC4 soap_in__cwmp1__Reboot(struct soap*, const char*, struct _cwmp1__Reboot *, const char*); + +#ifndef SOAP_TYPE__cwmp1__DownloadResponse +#define SOAP_TYPE__cwmp1__DownloadResponse (75) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DownloadResponse(struct soap*, struct _cwmp1__DownloadResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__DownloadResponse(struct soap*, const struct _cwmp1__DownloadResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DownloadResponse(struct soap*, const struct _cwmp1__DownloadResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DownloadResponse(struct soap*, const char*, int, const struct _cwmp1__DownloadResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__DownloadResponse * SOAP_FMAC4 soap_get__cwmp1__DownloadResponse(struct soap*, struct _cwmp1__DownloadResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__DownloadResponse * SOAP_FMAC4 soap_in__cwmp1__DownloadResponse(struct soap*, const char*, struct _cwmp1__DownloadResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Download +#define SOAP_TYPE__cwmp1__Download (74) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Download(struct soap*, struct _cwmp1__Download *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Download(struct soap*, const struct _cwmp1__Download *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Download(struct soap*, const struct _cwmp1__Download *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Download(struct soap*, const char*, int, const struct _cwmp1__Download *, const char*); +SOAP_FMAC3 struct _cwmp1__Download * SOAP_FMAC4 soap_get__cwmp1__Download(struct soap*, struct _cwmp1__Download *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Download * SOAP_FMAC4 soap_in__cwmp1__Download(struct soap*, const char*, struct _cwmp1__Download *, const char*); + +#ifndef SOAP_TYPE__cwmp1__DeleteObjectResponse +#define SOAP_TYPE__cwmp1__DeleteObjectResponse (72) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DeleteObjectResponse(struct soap*, struct _cwmp1__DeleteObjectResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__DeleteObjectResponse(struct soap*, const struct _cwmp1__DeleteObjectResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DeleteObjectResponse(struct soap*, const struct _cwmp1__DeleteObjectResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DeleteObjectResponse(struct soap*, const char*, int, const struct _cwmp1__DeleteObjectResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__DeleteObjectResponse * SOAP_FMAC4 soap_get__cwmp1__DeleteObjectResponse(struct soap*, struct _cwmp1__DeleteObjectResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__DeleteObjectResponse * SOAP_FMAC4 soap_in__cwmp1__DeleteObjectResponse(struct soap*, const char*, struct _cwmp1__DeleteObjectResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__DeleteObject +#define SOAP_TYPE__cwmp1__DeleteObject (71) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DeleteObject(struct soap*, struct _cwmp1__DeleteObject *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__DeleteObject(struct soap*, const struct _cwmp1__DeleteObject *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DeleteObject(struct soap*, const struct _cwmp1__DeleteObject *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DeleteObject(struct soap*, const char*, int, const struct _cwmp1__DeleteObject *, const char*); +SOAP_FMAC3 struct _cwmp1__DeleteObject * SOAP_FMAC4 soap_get__cwmp1__DeleteObject(struct soap*, struct _cwmp1__DeleteObject *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__DeleteObject * SOAP_FMAC4 soap_in__cwmp1__DeleteObject(struct soap*, const char*, struct _cwmp1__DeleteObject *, const char*); + +#ifndef SOAP_TYPE__cwmp1__AddObjectResponse +#define SOAP_TYPE__cwmp1__AddObjectResponse (69) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AddObjectResponse(struct soap*, struct _cwmp1__AddObjectResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AddObjectResponse(struct soap*, const struct _cwmp1__AddObjectResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AddObjectResponse(struct soap*, const struct _cwmp1__AddObjectResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AddObjectResponse(struct soap*, const char*, int, const struct _cwmp1__AddObjectResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__AddObjectResponse * SOAP_FMAC4 soap_get__cwmp1__AddObjectResponse(struct soap*, struct _cwmp1__AddObjectResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__AddObjectResponse * SOAP_FMAC4 soap_in__cwmp1__AddObjectResponse(struct soap*, const char*, struct _cwmp1__AddObjectResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__AddObject +#define SOAP_TYPE__cwmp1__AddObject (68) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AddObject(struct soap*, struct _cwmp1__AddObject *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AddObject(struct soap*, const struct _cwmp1__AddObject *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AddObject(struct soap*, const struct _cwmp1__AddObject *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AddObject(struct soap*, const char*, int, const struct _cwmp1__AddObject *, const char*); +SOAP_FMAC3 struct _cwmp1__AddObject * SOAP_FMAC4 soap_get__cwmp1__AddObject(struct soap*, struct _cwmp1__AddObject *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__AddObject * SOAP_FMAC4 soap_in__cwmp1__AddObject(struct soap*, const char*, struct _cwmp1__AddObject *, const char*); + +#ifndef SOAP_TYPE_cwmp1ParameterAttributeList +#define SOAP_TYPE_cwmp1ParameterAttributeList (66) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterAttributeList(struct soap*, struct cwmp1ParameterAttributeList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterAttributeList(struct soap*, struct cwmp1ParameterAttributeList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterAttributeList(struct soap*, const struct cwmp1ParameterAttributeList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterAttributeList(struct soap*, const char*, int, const struct cwmp1ParameterAttributeList *, const char*); +SOAP_FMAC3 struct cwmp1ParameterAttributeList * SOAP_FMAC4 soap_get_cwmp1ParameterAttributeList(struct soap*, struct cwmp1ParameterAttributeList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterAttributeList * SOAP_FMAC4 soap_in_cwmp1ParameterAttributeList(struct soap*, const char*, struct cwmp1ParameterAttributeList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetParameterAttributesResponse +#define SOAP_TYPE__cwmp1__GetParameterAttributesResponse (65) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterAttributesResponse(struct soap*, struct _cwmp1__GetParameterAttributesResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterAttributesResponse(struct soap*, const struct _cwmp1__GetParameterAttributesResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterAttributesResponse(struct soap*, const struct _cwmp1__GetParameterAttributesResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterAttributesResponse(struct soap*, const char*, int, const struct _cwmp1__GetParameterAttributesResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterAttributesResponse * SOAP_FMAC4 soap_get__cwmp1__GetParameterAttributesResponse(struct soap*, struct _cwmp1__GetParameterAttributesResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterAttributesResponse * SOAP_FMAC4 soap_in__cwmp1__GetParameterAttributesResponse(struct soap*, const char*, struct _cwmp1__GetParameterAttributesResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetParameterAttributes +#define SOAP_TYPE__cwmp1__GetParameterAttributes (64) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterAttributes(struct soap*, struct _cwmp1__GetParameterAttributes *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterAttributes(struct soap*, const struct _cwmp1__GetParameterAttributes *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterAttributes(struct soap*, const struct _cwmp1__GetParameterAttributes *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterAttributes(struct soap*, const char*, int, const struct _cwmp1__GetParameterAttributes *, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterAttributes * SOAP_FMAC4 soap_get__cwmp1__GetParameterAttributes(struct soap*, struct _cwmp1__GetParameterAttributes *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterAttributes * SOAP_FMAC4 soap_in__cwmp1__GetParameterAttributes(struct soap*, const char*, struct _cwmp1__GetParameterAttributes *, const char*); + +#ifndef SOAP_TYPE__cwmp1__SetParameterAttributesResponse +#define SOAP_TYPE__cwmp1__SetParameterAttributesResponse (63) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterAttributesResponse(struct soap*, struct _cwmp1__SetParameterAttributesResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterAttributesResponse(struct soap*, const struct _cwmp1__SetParameterAttributesResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterAttributesResponse(struct soap*, const struct _cwmp1__SetParameterAttributesResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterAttributesResponse(struct soap*, const char*, int, const struct _cwmp1__SetParameterAttributesResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterAttributesResponse * SOAP_FMAC4 soap_get__cwmp1__SetParameterAttributesResponse(struct soap*, struct _cwmp1__SetParameterAttributesResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterAttributesResponse * SOAP_FMAC4 soap_in__cwmp1__SetParameterAttributesResponse(struct soap*, const char*, struct _cwmp1__SetParameterAttributesResponse *, const char*); + +#ifndef SOAP_TYPE_cwmp1SetParameterAttributesList +#define SOAP_TYPE_cwmp1SetParameterAttributesList (61) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1SetParameterAttributesList(struct soap*, struct cwmp1SetParameterAttributesList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1SetParameterAttributesList(struct soap*, struct cwmp1SetParameterAttributesList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1SetParameterAttributesList(struct soap*, const struct cwmp1SetParameterAttributesList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1SetParameterAttributesList(struct soap*, const char*, int, const struct cwmp1SetParameterAttributesList *, const char*); +SOAP_FMAC3 struct cwmp1SetParameterAttributesList * SOAP_FMAC4 soap_get_cwmp1SetParameterAttributesList(struct soap*, struct cwmp1SetParameterAttributesList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1SetParameterAttributesList * SOAP_FMAC4 soap_in_cwmp1SetParameterAttributesList(struct soap*, const char*, struct cwmp1SetParameterAttributesList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__SetParameterAttributes +#define SOAP_TYPE__cwmp1__SetParameterAttributes (60) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterAttributes(struct soap*, struct _cwmp1__SetParameterAttributes *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterAttributes(struct soap*, const struct _cwmp1__SetParameterAttributes *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterAttributes(struct soap*, const struct _cwmp1__SetParameterAttributes *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterAttributes(struct soap*, const char*, int, const struct _cwmp1__SetParameterAttributes *, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterAttributes * SOAP_FMAC4 soap_get__cwmp1__SetParameterAttributes(struct soap*, struct _cwmp1__SetParameterAttributes *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterAttributes * SOAP_FMAC4 soap_in__cwmp1__SetParameterAttributes(struct soap*, const char*, struct _cwmp1__SetParameterAttributes *, const char*); + +#ifndef SOAP_TYPE_cwmp1ParameterInfoList +#define SOAP_TYPE_cwmp1ParameterInfoList (58) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterInfoList(struct soap*, struct cwmp1ParameterInfoList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterInfoList(struct soap*, struct cwmp1ParameterInfoList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterInfoList(struct soap*, const struct cwmp1ParameterInfoList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterInfoList(struct soap*, const char*, int, const struct cwmp1ParameterInfoList *, const char*); +SOAP_FMAC3 struct cwmp1ParameterInfoList * SOAP_FMAC4 soap_get_cwmp1ParameterInfoList(struct soap*, struct cwmp1ParameterInfoList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterInfoList * SOAP_FMAC4 soap_in_cwmp1ParameterInfoList(struct soap*, const char*, struct cwmp1ParameterInfoList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetParameterNamesResponse +#define SOAP_TYPE__cwmp1__GetParameterNamesResponse (57) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterNamesResponse(struct soap*, struct _cwmp1__GetParameterNamesResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterNamesResponse(struct soap*, const struct _cwmp1__GetParameterNamesResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterNamesResponse(struct soap*, const struct _cwmp1__GetParameterNamesResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterNamesResponse(struct soap*, const char*, int, const struct _cwmp1__GetParameterNamesResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterNamesResponse * SOAP_FMAC4 soap_get__cwmp1__GetParameterNamesResponse(struct soap*, struct _cwmp1__GetParameterNamesResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterNamesResponse * SOAP_FMAC4 soap_in__cwmp1__GetParameterNamesResponse(struct soap*, const char*, struct _cwmp1__GetParameterNamesResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetParameterNames +#define SOAP_TYPE__cwmp1__GetParameterNames (56) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterNames(struct soap*, struct _cwmp1__GetParameterNames *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterNames(struct soap*, const struct _cwmp1__GetParameterNames *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterNames(struct soap*, const struct _cwmp1__GetParameterNames *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterNames(struct soap*, const char*, int, const struct _cwmp1__GetParameterNames *, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterNames * SOAP_FMAC4 soap_get__cwmp1__GetParameterNames(struct soap*, struct _cwmp1__GetParameterNames *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterNames * SOAP_FMAC4 soap_in__cwmp1__GetParameterNames(struct soap*, const char*, struct _cwmp1__GetParameterNames *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetParameterValuesResponse +#define SOAP_TYPE__cwmp1__GetParameterValuesResponse (55) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterValuesResponse(struct soap*, struct _cwmp1__GetParameterValuesResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterValuesResponse(struct soap*, const struct _cwmp1__GetParameterValuesResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterValuesResponse(struct soap*, const struct _cwmp1__GetParameterValuesResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterValuesResponse(struct soap*, const char*, int, const struct _cwmp1__GetParameterValuesResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterValuesResponse * SOAP_FMAC4 soap_get__cwmp1__GetParameterValuesResponse(struct soap*, struct _cwmp1__GetParameterValuesResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterValuesResponse * SOAP_FMAC4 soap_in__cwmp1__GetParameterValuesResponse(struct soap*, const char*, struct _cwmp1__GetParameterValuesResponse *, const char*); + +#ifndef SOAP_TYPE_cwmp1ParameterNames +#define SOAP_TYPE_cwmp1ParameterNames (53) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterNames(struct soap*, struct cwmp1ParameterNames *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterNames(struct soap*, struct cwmp1ParameterNames const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterNames(struct soap*, const struct cwmp1ParameterNames *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterNames(struct soap*, const char*, int, const struct cwmp1ParameterNames *, const char*); +SOAP_FMAC3 struct cwmp1ParameterNames * SOAP_FMAC4 soap_get_cwmp1ParameterNames(struct soap*, struct cwmp1ParameterNames *, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterNames * SOAP_FMAC4 soap_in_cwmp1ParameterNames(struct soap*, const char*, struct cwmp1ParameterNames *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetParameterValues +#define SOAP_TYPE__cwmp1__GetParameterValues (52) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterValues(struct soap*, struct _cwmp1__GetParameterValues *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterValues(struct soap*, const struct _cwmp1__GetParameterValues *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterValues(struct soap*, const struct _cwmp1__GetParameterValues *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterValues(struct soap*, const char*, int, const struct _cwmp1__GetParameterValues *, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterValues * SOAP_FMAC4 soap_get__cwmp1__GetParameterValues(struct soap*, struct _cwmp1__GetParameterValues *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetParameterValues * SOAP_FMAC4 soap_in__cwmp1__GetParameterValues(struct soap*, const char*, struct _cwmp1__GetParameterValues *, const char*); + +#ifndef SOAP_TYPE__cwmp1__SetParameterValuesResponse +#define SOAP_TYPE__cwmp1__SetParameterValuesResponse (50) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterValuesResponse(struct soap*, struct _cwmp1__SetParameterValuesResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterValuesResponse(struct soap*, const struct _cwmp1__SetParameterValuesResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterValuesResponse(struct soap*, const struct _cwmp1__SetParameterValuesResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterValuesResponse(struct soap*, const char*, int, const struct _cwmp1__SetParameterValuesResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterValuesResponse * SOAP_FMAC4 soap_get__cwmp1__SetParameterValuesResponse(struct soap*, struct _cwmp1__SetParameterValuesResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterValuesResponse * SOAP_FMAC4 soap_in__cwmp1__SetParameterValuesResponse(struct soap*, const char*, struct _cwmp1__SetParameterValuesResponse *, const char*); + +#ifndef SOAP_TYPE_cwmp1ParameterValueList +#define SOAP_TYPE_cwmp1ParameterValueList (48) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterValueList(struct soap*, struct cwmp1ParameterValueList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterValueList(struct soap*, struct cwmp1ParameterValueList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterValueList(struct soap*, const struct cwmp1ParameterValueList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterValueList(struct soap*, const char*, int, const struct cwmp1ParameterValueList *, const char*); +SOAP_FMAC3 struct cwmp1ParameterValueList * SOAP_FMAC4 soap_get_cwmp1ParameterValueList(struct soap*, struct cwmp1ParameterValueList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterValueList * SOAP_FMAC4 soap_in_cwmp1ParameterValueList(struct soap*, const char*, struct cwmp1ParameterValueList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__SetParameterValues +#define SOAP_TYPE__cwmp1__SetParameterValues (47) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterValues(struct soap*, struct _cwmp1__SetParameterValues *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterValues(struct soap*, const struct _cwmp1__SetParameterValues *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterValues(struct soap*, const struct _cwmp1__SetParameterValues *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterValues(struct soap*, const char*, int, const struct _cwmp1__SetParameterValues *, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterValues * SOAP_FMAC4 soap_get__cwmp1__SetParameterValues(struct soap*, struct _cwmp1__SetParameterValues *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__SetParameterValues * SOAP_FMAC4 soap_in__cwmp1__SetParameterValues(struct soap*, const char*, struct _cwmp1__SetParameterValues *, const char*); + +#ifndef SOAP_TYPE_cwmp1MethodList +#define SOAP_TYPE_cwmp1MethodList (45) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1MethodList(struct soap*, struct cwmp1MethodList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1MethodList(struct soap*, struct cwmp1MethodList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1MethodList(struct soap*, const struct cwmp1MethodList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1MethodList(struct soap*, const char*, int, const struct cwmp1MethodList *, const char*); +SOAP_FMAC3 struct cwmp1MethodList * SOAP_FMAC4 soap_get_cwmp1MethodList(struct soap*, struct cwmp1MethodList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1MethodList * SOAP_FMAC4 soap_in_cwmp1MethodList(struct soap*, const char*, struct cwmp1MethodList *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetRPCMethodsResponse +#define SOAP_TYPE__cwmp1__GetRPCMethodsResponse (44) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetRPCMethodsResponse(struct soap*, struct _cwmp1__GetRPCMethodsResponse *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetRPCMethodsResponse(struct soap*, const struct _cwmp1__GetRPCMethodsResponse *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetRPCMethodsResponse(struct soap*, const struct _cwmp1__GetRPCMethodsResponse *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetRPCMethodsResponse(struct soap*, const char*, int, const struct _cwmp1__GetRPCMethodsResponse *, const char*); +SOAP_FMAC3 struct _cwmp1__GetRPCMethodsResponse * SOAP_FMAC4 soap_get__cwmp1__GetRPCMethodsResponse(struct soap*, struct _cwmp1__GetRPCMethodsResponse *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetRPCMethodsResponse * SOAP_FMAC4 soap_in__cwmp1__GetRPCMethodsResponse(struct soap*, const char*, struct _cwmp1__GetRPCMethodsResponse *, const char*); + +#ifndef SOAP_TYPE__cwmp1__GetRPCMethods +#define SOAP_TYPE__cwmp1__GetRPCMethods (43) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetRPCMethods(struct soap*, struct _cwmp1__GetRPCMethods *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetRPCMethods(struct soap*, const struct _cwmp1__GetRPCMethods *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetRPCMethods(struct soap*, const struct _cwmp1__GetRPCMethods *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetRPCMethods(struct soap*, const char*, int, const struct _cwmp1__GetRPCMethods *, const char*); +SOAP_FMAC3 struct _cwmp1__GetRPCMethods * SOAP_FMAC4 soap_get__cwmp1__GetRPCMethods(struct soap*, struct _cwmp1__GetRPCMethods *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__GetRPCMethods * SOAP_FMAC4 soap_in__cwmp1__GetRPCMethods(struct soap*, const char*, struct _cwmp1__GetRPCMethods *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault +#define SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault (41) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Fault_SetParameterValuesFault(struct soap*, struct _cwmp1__Fault_SetParameterValuesFault *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Fault_SetParameterValuesFault(struct soap*, const struct _cwmp1__Fault_SetParameterValuesFault *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Fault_SetParameterValuesFault(struct soap*, const struct _cwmp1__Fault_SetParameterValuesFault *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Fault_SetParameterValuesFault(struct soap*, const char*, int, const struct _cwmp1__Fault_SetParameterValuesFault *, const char*); +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault * SOAP_FMAC4 soap_get__cwmp1__Fault_SetParameterValuesFault(struct soap*, struct _cwmp1__Fault_SetParameterValuesFault *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault * SOAP_FMAC4 soap_in__cwmp1__Fault_SetParameterValuesFault(struct soap*, const char*, struct _cwmp1__Fault_SetParameterValuesFault *, const char*); + +#ifndef SOAP_TYPE__cwmp1__Fault +#define SOAP_TYPE__cwmp1__Fault (40) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Fault(struct soap*, struct _cwmp1__Fault *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Fault(struct soap*, const struct _cwmp1__Fault *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Fault(struct soap*, const struct _cwmp1__Fault *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Fault(struct soap*, const char*, int, const struct _cwmp1__Fault *, const char*); +SOAP_FMAC3 struct _cwmp1__Fault * SOAP_FMAC4 soap_get__cwmp1__Fault(struct soap*, struct _cwmp1__Fault *, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Fault * SOAP_FMAC4 soap_in__cwmp1__Fault(struct soap*, const char*, struct _cwmp1__Fault *, const char*); + +#ifndef SOAP_TYPE_cwmp1__OptionStruct +#define SOAP_TYPE_cwmp1__OptionStruct (34) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__OptionStruct(struct soap*, const struct cwmp1__OptionStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__OptionStruct(struct soap*, const struct cwmp1__OptionStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__OptionStruct(struct soap*, const char*, int, const struct cwmp1__OptionStruct *, const char*); +SOAP_FMAC3 struct cwmp1__OptionStruct * SOAP_FMAC4 soap_get_cwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__OptionStruct * SOAP_FMAC4 soap_in_cwmp1__OptionStruct(struct soap*, const char*, struct cwmp1__OptionStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__ArgStruct +#define SOAP_TYPE_cwmp1__ArgStruct (33) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ArgStruct(struct soap*, const struct cwmp1__ArgStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ArgStruct(struct soap*, const struct cwmp1__ArgStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ArgStruct(struct soap*, const char*, int, const struct cwmp1__ArgStruct *, const char*); +SOAP_FMAC3 struct cwmp1__ArgStruct * SOAP_FMAC4 soap_get_cwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ArgStruct * SOAP_FMAC4 soap_in_cwmp1__ArgStruct(struct soap*, const char*, struct cwmp1__ArgStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__AllQueuedTransferStruct +#define SOAP_TYPE_cwmp1__AllQueuedTransferStruct (31) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__AllQueuedTransferStruct(struct soap*, const struct cwmp1__AllQueuedTransferStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__AllQueuedTransferStruct(struct soap*, const struct cwmp1__AllQueuedTransferStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__AllQueuedTransferStruct(struct soap*, const char*, int, const struct cwmp1__AllQueuedTransferStruct *, const char*); +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct * SOAP_FMAC4 soap_get_cwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct * SOAP_FMAC4 soap_in_cwmp1__AllQueuedTransferStruct(struct soap*, const char*, struct cwmp1__AllQueuedTransferStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__QueuedTransferStruct +#define SOAP_TYPE_cwmp1__QueuedTransferStruct (29) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__QueuedTransferStruct(struct soap*, const struct cwmp1__QueuedTransferStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__QueuedTransferStruct(struct soap*, const struct cwmp1__QueuedTransferStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__QueuedTransferStruct(struct soap*, const char*, int, const struct cwmp1__QueuedTransferStruct *, const char*); +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct * SOAP_FMAC4 soap_get_cwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct * SOAP_FMAC4 soap_in_cwmp1__QueuedTransferStruct(struct soap*, const char*, struct cwmp1__QueuedTransferStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__ParameterAttributeStruct +#define SOAP_TYPE_cwmp1__ParameterAttributeStruct (27) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterAttributeStruct(struct soap*, const struct cwmp1__ParameterAttributeStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterAttributeStruct(struct soap*, const struct cwmp1__ParameterAttributeStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterAttributeStruct(struct soap*, const char*, int, const struct cwmp1__ParameterAttributeStruct *, const char*); +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct * SOAP_FMAC4 soap_get_cwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct * SOAP_FMAC4 soap_in_cwmp1__ParameterAttributeStruct(struct soap*, const char*, struct cwmp1__ParameterAttributeStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1AccessList +#define SOAP_TYPE_cwmp1AccessList (25) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1AccessList(struct soap*, struct cwmp1AccessList *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1AccessList(struct soap*, struct cwmp1AccessList const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1AccessList(struct soap*, const struct cwmp1AccessList *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1AccessList(struct soap*, const char*, int, const struct cwmp1AccessList *, const char*); +SOAP_FMAC3 struct cwmp1AccessList * SOAP_FMAC4 soap_get_cwmp1AccessList(struct soap*, struct cwmp1AccessList *, const char*, const char*); +SOAP_FMAC3 struct cwmp1AccessList * SOAP_FMAC4 soap_in_cwmp1AccessList(struct soap*, const char*, struct cwmp1AccessList *, const char*); + +#ifndef SOAP_TYPE_cwmp1__SetParameterAttributesStruct +#define SOAP_TYPE_cwmp1__SetParameterAttributesStruct (22) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__SetParameterAttributesStruct(struct soap*, const struct cwmp1__SetParameterAttributesStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__SetParameterAttributesStruct(struct soap*, const struct cwmp1__SetParameterAttributesStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__SetParameterAttributesStruct(struct soap*, const char*, int, const struct cwmp1__SetParameterAttributesStruct *, const char*); +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct * SOAP_FMAC4 soap_get_cwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct * SOAP_FMAC4 soap_in_cwmp1__SetParameterAttributesStruct(struct soap*, const char*, struct cwmp1__SetParameterAttributesStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__ParameterInfoStruct +#define SOAP_TYPE_cwmp1__ParameterInfoStruct (21) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterInfoStruct(struct soap*, const struct cwmp1__ParameterInfoStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterInfoStruct(struct soap*, const struct cwmp1__ParameterInfoStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterInfoStruct(struct soap*, const char*, int, const struct cwmp1__ParameterInfoStruct *, const char*); +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct * SOAP_FMAC4 soap_get_cwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct * SOAP_FMAC4 soap_in_cwmp1__ParameterInfoStruct(struct soap*, const char*, struct cwmp1__ParameterInfoStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__ParameterValueStruct +#define SOAP_TYPE_cwmp1__ParameterValueStruct (20) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterValueStruct(struct soap*, const struct cwmp1__ParameterValueStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterValueStruct(struct soap*, const struct cwmp1__ParameterValueStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterValueStruct(struct soap*, const char*, int, const struct cwmp1__ParameterValueStruct *, const char*); +SOAP_FMAC3 struct cwmp1__ParameterValueStruct * SOAP_FMAC4 soap_get_cwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterValueStruct * SOAP_FMAC4 soap_in_cwmp1__ParameterValueStruct(struct soap*, const char*, struct cwmp1__ParameterValueStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__EventStruct +#define SOAP_TYPE_cwmp1__EventStruct (19) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__EventStruct(struct soap*, const struct cwmp1__EventStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__EventStruct(struct soap*, const struct cwmp1__EventStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__EventStruct(struct soap*, const char*, int, const struct cwmp1__EventStruct *, const char*); +SOAP_FMAC3 struct cwmp1__EventStruct * SOAP_FMAC4 soap_get_cwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__EventStruct * SOAP_FMAC4 soap_in_cwmp1__EventStruct(struct soap*, const char*, struct cwmp1__EventStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__DeviceIdStruct +#define SOAP_TYPE_cwmp1__DeviceIdStruct (18) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__DeviceIdStruct(struct soap*, struct cwmp1__DeviceIdStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__DeviceIdStruct(struct soap*, const struct cwmp1__DeviceIdStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__DeviceIdStruct(struct soap*, const struct cwmp1__DeviceIdStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__DeviceIdStruct(struct soap*, const char*, int, const struct cwmp1__DeviceIdStruct *, const char*); +SOAP_FMAC3 struct cwmp1__DeviceIdStruct * SOAP_FMAC4 soap_get_cwmp1__DeviceIdStruct(struct soap*, struct cwmp1__DeviceIdStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__DeviceIdStruct * SOAP_FMAC4 soap_in_cwmp1__DeviceIdStruct(struct soap*, const char*, struct cwmp1__DeviceIdStruct *, const char*); + +#ifndef SOAP_TYPE_cwmp1__FaultStruct +#define SOAP_TYPE_cwmp1__FaultStruct (17) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__FaultStruct(struct soap*, struct cwmp1__FaultStruct *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__FaultStruct(struct soap*, const struct cwmp1__FaultStruct *); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__FaultStruct(struct soap*, const struct cwmp1__FaultStruct *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__FaultStruct(struct soap*, const char*, int, const struct cwmp1__FaultStruct *, const char*); +SOAP_FMAC3 struct cwmp1__FaultStruct * SOAP_FMAC4 soap_get_cwmp1__FaultStruct(struct soap*, struct cwmp1__FaultStruct *, const char*, const char*); +SOAP_FMAC3 struct cwmp1__FaultStruct * SOAP_FMAC4 soap_in_cwmp1__FaultStruct(struct soap*, const char*, struct cwmp1__FaultStruct *, const char*); + +#ifndef SOAP_TYPE_SOAP_ENC__base64 +#define SOAP_TYPE_SOAP_ENC__base64 (7) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 *); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENC__base64(struct soap*, const struct SOAP_ENC__base64 *, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENC__base64(struct soap*, const char*, int, const struct SOAP_ENC__base64 *, const char*); +SOAP_FMAC3 struct SOAP_ENC__base64 * SOAP_FMAC4 soap_get_SOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 *, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENC__base64 * SOAP_FMAC4 soap_in_SOAP_ENC__base64(struct soap*, const char*, struct SOAP_ENC__base64 *, const char*); + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason +#define SOAP_TYPE_PointerToSOAP_ENV__Reason (153) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap*, const char *, int, struct SOAP_ENV__Reason *const*, const char *); +SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason **, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); + +#endif + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail +#define SOAP_TYPE_PointerToSOAP_ENV__Detail (152) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap*, const char *, int, struct SOAP_ENV__Detail *const*, const char *); +SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail **, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); + +#endif + +#ifndef WITH_NOGLOBAL + +#ifndef SOAP_TYPE_PointerToSOAP_ENV__Code +#define SOAP_TYPE_PointerToSOAP_ENV__Code (146) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap*, const char *, int, struct SOAP_ENV__Code *const*, const char *); +SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code **, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); + +#endif + +#ifndef SOAP_TYPE_PointerTounsignedInt +#define SOAP_TYPE_PointerTounsignedInt (140) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTounsignedInt(struct soap*, unsigned int *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTounsignedInt(struct soap*, unsigned int *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTounsignedInt(struct soap*, const char *, int, unsigned int *const*, const char *); +SOAP_FMAC3 unsigned int ** SOAP_FMAC4 soap_get_PointerTounsignedInt(struct soap*, unsigned int **, const char*, const char*); +SOAP_FMAC3 unsigned int ** SOAP_FMAC4 soap_in_PointerTounsignedInt(struct soap*, const char*, unsigned int **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__ArgStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__ArgStruct (137) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ArgStruct(struct soap*, const char *, int, struct cwmp1__ArgStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__ArgStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ArgStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ArgStruct(struct soap*, const char*, struct cwmp1__ArgStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__ArgStruct +#define SOAP_TYPE_PointerTocwmp1__ArgStruct (136) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ArgStruct(struct soap*, const char *, int, struct cwmp1__ArgStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__ArgStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ArgStruct(struct soap*, struct cwmp1__ArgStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ArgStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ArgStruct(struct soap*, const char*, struct cwmp1__ArgStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__OptionStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__OptionStruct (135) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__OptionStruct(struct soap*, const char *, int, struct cwmp1__OptionStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__OptionStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__OptionStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__OptionStruct(struct soap*, const char*, struct cwmp1__OptionStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__OptionStruct +#define SOAP_TYPE_PointerTocwmp1__OptionStruct (134) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__OptionStruct(struct soap*, const char *, int, struct cwmp1__OptionStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__OptionStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__OptionStruct(struct soap*, struct cwmp1__OptionStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__OptionStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__OptionStruct(struct soap*, const char*, struct cwmp1__OptionStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerToSOAP_ENC__base64 +#define SOAP_TYPE_PointerToPointerToSOAP_ENC__base64 (133) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerToSOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerToSOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerToSOAP_ENC__base64(struct soap*, const char *, int, struct SOAP_ENC__base64 **const*, const char *); +SOAP_FMAC3 struct SOAP_ENC__base64 *** SOAP_FMAC4 soap_get_PointerToPointerToSOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 ***, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENC__base64 *** SOAP_FMAC4 soap_in_PointerToPointerToSOAP_ENC__base64(struct soap*, const char*, struct SOAP_ENC__base64 ***, const char*); + +#ifndef SOAP_TYPE_PointerToSOAP_ENC__base64 +#define SOAP_TYPE_PointerToSOAP_ENC__base64 (132) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENC__base64(struct soap*, const char *, int, struct SOAP_ENC__base64 *const*, const char *); +SOAP_FMAC3 struct SOAP_ENC__base64 ** SOAP_FMAC4 soap_get_PointerToSOAP_ENC__base64(struct soap*, struct SOAP_ENC__base64 **, const char*, const char*); +SOAP_FMAC3 struct SOAP_ENC__base64 ** SOAP_FMAC4 soap_in_PointerToSOAP_ENC__base64(struct soap*, const char*, struct SOAP_ENC__base64 **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__AllQueuedTransferStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__AllQueuedTransferStruct (131) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap*, const char *, int, struct cwmp1__AllQueuedTransferStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap*, const char*, struct cwmp1__AllQueuedTransferStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct +#define SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct (130) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__AllQueuedTransferStruct(struct soap*, const char *, int, struct cwmp1__AllQueuedTransferStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__AllQueuedTransferStruct(struct soap*, struct cwmp1__AllQueuedTransferStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__AllQueuedTransferStruct(struct soap*, const char*, struct cwmp1__AllQueuedTransferStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__QueuedTransferStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__QueuedTransferStruct (129) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap*, const char *, int, struct cwmp1__QueuedTransferStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap*, const char*, struct cwmp1__QueuedTransferStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct +#define SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct (128) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__QueuedTransferStruct(struct soap*, const char *, int, struct cwmp1__QueuedTransferStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__QueuedTransferStruct(struct soap*, struct cwmp1__QueuedTransferStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__QueuedTransferStruct(struct soap*, const char*, struct cwmp1__QueuedTransferStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__ParameterAttributeStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__ParameterAttributeStruct (127) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap*, const char *, int, struct cwmp1__ParameterAttributeStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap*, const char*, struct cwmp1__ParameterAttributeStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct +#define SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct (126) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ParameterAttributeStruct(struct soap*, const char *, int, struct cwmp1__ParameterAttributeStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ParameterAttributeStruct(struct soap*, struct cwmp1__ParameterAttributeStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ParameterAttributeStruct(struct soap*, const char*, struct cwmp1__ParameterAttributeStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__SetParameterAttributesStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__SetParameterAttributesStruct (125) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap*, const char *, int, struct cwmp1__SetParameterAttributesStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap*, const char*, struct cwmp1__SetParameterAttributesStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct +#define SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct (124) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__SetParameterAttributesStruct(struct soap*, const char *, int, struct cwmp1__SetParameterAttributesStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__SetParameterAttributesStruct(struct soap*, struct cwmp1__SetParameterAttributesStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__SetParameterAttributesStruct(struct soap*, const char*, struct cwmp1__SetParameterAttributesStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__ParameterInfoStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__ParameterInfoStruct (123) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap*, const char *, int, struct cwmp1__ParameterInfoStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap*, const char*, struct cwmp1__ParameterInfoStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct +#define SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct (122) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ParameterInfoStruct(struct soap*, const char *, int, struct cwmp1__ParameterInfoStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ParameterInfoStruct(struct soap*, struct cwmp1__ParameterInfoStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ParameterInfoStruct(struct soap*, const char*, struct cwmp1__ParameterInfoStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__ParameterValueStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__ParameterValueStruct (121) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ParameterValueStruct(struct soap*, const char *, int, struct cwmp1__ParameterValueStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__ParameterValueStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterValueStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ParameterValueStruct(struct soap*, const char*, struct cwmp1__ParameterValueStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__ParameterValueStruct +#define SOAP_TYPE_PointerTocwmp1__ParameterValueStruct (120) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ParameterValueStruct(struct soap*, const char *, int, struct cwmp1__ParameterValueStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__ParameterValueStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ParameterValueStruct(struct soap*, struct cwmp1__ParameterValueStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__ParameterValueStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ParameterValueStruct(struct soap*, const char*, struct cwmp1__ParameterValueStruct **, const char*); + +#ifndef SOAP_TYPE_PointerToPointerTocwmp1__EventStruct +#define SOAP_TYPE_PointerToPointerTocwmp1__EventStruct (119) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__EventStruct(struct soap*, const char *, int, struct cwmp1__EventStruct **const*, const char *); +SOAP_FMAC3 struct cwmp1__EventStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct ***, const char*, const char*); +SOAP_FMAC3 struct cwmp1__EventStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__EventStruct(struct soap*, const char*, struct cwmp1__EventStruct ***, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__EventStruct +#define SOAP_TYPE_PointerTocwmp1__EventStruct (118) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__EventStruct(struct soap*, const char *, int, struct cwmp1__EventStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__EventStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__EventStruct(struct soap*, struct cwmp1__EventStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__EventStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__EventStruct(struct soap*, const char*, struct cwmp1__EventStruct **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1FileTypeArg +#define SOAP_TYPE_PointerTocwmp1FileTypeArg (116) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1FileTypeArg(struct soap*, struct cwmp1FileTypeArg *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1FileTypeArg(struct soap*, struct cwmp1FileTypeArg *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1FileTypeArg(struct soap*, const char *, int, struct cwmp1FileTypeArg *const*, const char *); +SOAP_FMAC3 struct cwmp1FileTypeArg ** SOAP_FMAC4 soap_get_PointerTocwmp1FileTypeArg(struct soap*, struct cwmp1FileTypeArg **, const char*, const char*); +SOAP_FMAC3 struct cwmp1FileTypeArg ** SOAP_FMAC4 soap_in_PointerTocwmp1FileTypeArg(struct soap*, const char*, struct cwmp1FileTypeArg **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__FaultStruct +#define SOAP_TYPE_PointerTocwmp1__FaultStruct (108) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__FaultStruct(struct soap*, struct cwmp1__FaultStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__FaultStruct(struct soap*, struct cwmp1__FaultStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__FaultStruct(struct soap*, const char *, int, struct cwmp1__FaultStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__FaultStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__FaultStruct(struct soap*, struct cwmp1__FaultStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__FaultStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__FaultStruct(struct soap*, const char*, struct cwmp1__FaultStruct **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1EventList +#define SOAP_TYPE_PointerTocwmp1EventList (105) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1EventList(struct soap*, struct cwmp1EventList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1EventList(struct soap*, struct cwmp1EventList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1EventList(struct soap*, const char *, int, struct cwmp1EventList *const*, const char *); +SOAP_FMAC3 struct cwmp1EventList ** SOAP_FMAC4 soap_get_PointerTocwmp1EventList(struct soap*, struct cwmp1EventList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1EventList ** SOAP_FMAC4 soap_in_PointerTocwmp1EventList(struct soap*, const char*, struct cwmp1EventList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1__DeviceIdStruct +#define SOAP_TYPE_PointerTocwmp1__DeviceIdStruct (103) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__DeviceIdStruct(struct soap*, struct cwmp1__DeviceIdStruct *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__DeviceIdStruct(struct soap*, struct cwmp1__DeviceIdStruct *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__DeviceIdStruct(struct soap*, const char *, int, struct cwmp1__DeviceIdStruct *const*, const char *); +SOAP_FMAC3 struct cwmp1__DeviceIdStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__DeviceIdStruct(struct soap*, struct cwmp1__DeviceIdStruct **, const char*, const char*); +SOAP_FMAC3 struct cwmp1__DeviceIdStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__DeviceIdStruct(struct soap*, const char*, struct cwmp1__DeviceIdStruct **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1AllTransferList +#define SOAP_TYPE_PointerTocwmp1AllTransferList (101) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1AllTransferList(struct soap*, struct cwmp1AllTransferList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1AllTransferList(struct soap*, struct cwmp1AllTransferList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1AllTransferList(struct soap*, const char *, int, struct cwmp1AllTransferList *const*, const char *); +SOAP_FMAC3 struct cwmp1AllTransferList ** SOAP_FMAC4 soap_get_PointerTocwmp1AllTransferList(struct soap*, struct cwmp1AllTransferList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1AllTransferList ** SOAP_FMAC4 soap_in_PointerTocwmp1AllTransferList(struct soap*, const char*, struct cwmp1AllTransferList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1OptionList +#define SOAP_TYPE_PointerTocwmp1OptionList (92) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1OptionList(struct soap*, struct cwmp1OptionList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1OptionList(struct soap*, struct cwmp1OptionList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1OptionList(struct soap*, const char *, int, struct cwmp1OptionList *const*, const char *); +SOAP_FMAC3 struct cwmp1OptionList ** SOAP_FMAC4 soap_get_PointerTocwmp1OptionList(struct soap*, struct cwmp1OptionList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1OptionList ** SOAP_FMAC4 soap_in_PointerTocwmp1OptionList(struct soap*, const char*, struct cwmp1OptionList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1VoucherList +#define SOAP_TYPE_PointerTocwmp1VoucherList (87) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1VoucherList(struct soap*, struct cwmp1VoucherList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1VoucherList(struct soap*, struct cwmp1VoucherList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1VoucherList(struct soap*, const char *, int, struct cwmp1VoucherList *const*, const char *); +SOAP_FMAC3 struct cwmp1VoucherList ** SOAP_FMAC4 soap_get_PointerTocwmp1VoucherList(struct soap*, struct cwmp1VoucherList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1VoucherList ** SOAP_FMAC4 soap_in_PointerTocwmp1VoucherList(struct soap*, const char*, struct cwmp1VoucherList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1TransferList +#define SOAP_TYPE_PointerTocwmp1TransferList (82) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1TransferList(struct soap*, struct cwmp1TransferList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1TransferList(struct soap*, struct cwmp1TransferList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1TransferList(struct soap*, const char *, int, struct cwmp1TransferList *const*, const char *); +SOAP_FMAC3 struct cwmp1TransferList ** SOAP_FMAC4 soap_get_PointerTocwmp1TransferList(struct soap*, struct cwmp1TransferList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1TransferList ** SOAP_FMAC4 soap_in_PointerTocwmp1TransferList(struct soap*, const char*, struct cwmp1TransferList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1ParameterAttributeList +#define SOAP_TYPE_PointerTocwmp1ParameterAttributeList (67) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterAttributeList(struct soap*, struct cwmp1ParameterAttributeList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterAttributeList(struct soap*, struct cwmp1ParameterAttributeList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterAttributeList(struct soap*, const char *, int, struct cwmp1ParameterAttributeList *const*, const char *); +SOAP_FMAC3 struct cwmp1ParameterAttributeList ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterAttributeList(struct soap*, struct cwmp1ParameterAttributeList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterAttributeList ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterAttributeList(struct soap*, const char*, struct cwmp1ParameterAttributeList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1SetParameterAttributesList +#define SOAP_TYPE_PointerTocwmp1SetParameterAttributesList (62) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1SetParameterAttributesList(struct soap*, struct cwmp1SetParameterAttributesList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1SetParameterAttributesList(struct soap*, struct cwmp1SetParameterAttributesList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1SetParameterAttributesList(struct soap*, const char *, int, struct cwmp1SetParameterAttributesList *const*, const char *); +SOAP_FMAC3 struct cwmp1SetParameterAttributesList ** SOAP_FMAC4 soap_get_PointerTocwmp1SetParameterAttributesList(struct soap*, struct cwmp1SetParameterAttributesList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1SetParameterAttributesList ** SOAP_FMAC4 soap_in_PointerTocwmp1SetParameterAttributesList(struct soap*, const char*, struct cwmp1SetParameterAttributesList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1ParameterInfoList +#define SOAP_TYPE_PointerTocwmp1ParameterInfoList (59) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterInfoList(struct soap*, struct cwmp1ParameterInfoList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterInfoList(struct soap*, struct cwmp1ParameterInfoList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterInfoList(struct soap*, const char *, int, struct cwmp1ParameterInfoList *const*, const char *); +SOAP_FMAC3 struct cwmp1ParameterInfoList ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterInfoList(struct soap*, struct cwmp1ParameterInfoList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterInfoList ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterInfoList(struct soap*, const char*, struct cwmp1ParameterInfoList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1ParameterNames +#define SOAP_TYPE_PointerTocwmp1ParameterNames (54) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterNames(struct soap*, struct cwmp1ParameterNames *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterNames(struct soap*, struct cwmp1ParameterNames *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterNames(struct soap*, const char *, int, struct cwmp1ParameterNames *const*, const char *); +SOAP_FMAC3 struct cwmp1ParameterNames ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterNames(struct soap*, struct cwmp1ParameterNames **, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterNames ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterNames(struct soap*, const char*, struct cwmp1ParameterNames **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1ParameterValueList +#define SOAP_TYPE_PointerTocwmp1ParameterValueList (49) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterValueList(struct soap*, struct cwmp1ParameterValueList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterValueList(struct soap*, struct cwmp1ParameterValueList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterValueList(struct soap*, const char *, int, struct cwmp1ParameterValueList *const*, const char *); +SOAP_FMAC3 struct cwmp1ParameterValueList ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterValueList(struct soap*, struct cwmp1ParameterValueList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1ParameterValueList ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterValueList(struct soap*, const char*, struct cwmp1ParameterValueList **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1MethodList +#define SOAP_TYPE_PointerTocwmp1MethodList (46) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1MethodList(struct soap*, struct cwmp1MethodList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1MethodList(struct soap*, struct cwmp1MethodList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1MethodList(struct soap*, const char *, int, struct cwmp1MethodList *const*, const char *); +SOAP_FMAC3 struct cwmp1MethodList ** SOAP_FMAC4 soap_get_PointerTocwmp1MethodList(struct soap*, struct cwmp1MethodList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1MethodList ** SOAP_FMAC4 soap_in_PointerTocwmp1MethodList(struct soap*, const char*, struct cwmp1MethodList **, const char*); + +#ifndef SOAP_TYPE_PointerTo_cwmp1__Fault_SetParameterValuesFault +#define SOAP_TYPE_PointerTo_cwmp1__Fault_SetParameterValuesFault (42) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap*, struct _cwmp1__Fault_SetParameterValuesFault *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap*, struct _cwmp1__Fault_SetParameterValuesFault *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap*, const char *, int, struct _cwmp1__Fault_SetParameterValuesFault *const*, const char *); +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault ** SOAP_FMAC4 soap_get_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap*, struct _cwmp1__Fault_SetParameterValuesFault **, const char*, const char*); +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault ** SOAP_FMAC4 soap_in_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap*, const char*, struct _cwmp1__Fault_SetParameterValuesFault **, const char*); + +#ifndef SOAP_TYPE_PointerTotime +#define SOAP_TYPE_PointerTotime (38) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTotime(struct soap*, time_t *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTotime(struct soap*, time_t *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTotime(struct soap*, const char *, int, time_t *const*, const char *); +SOAP_FMAC3 time_t ** SOAP_FMAC4 soap_get_PointerTotime(struct soap*, time_t **, const char*, const char*); +SOAP_FMAC3 time_t ** SOAP_FMAC4 soap_in_PointerTotime(struct soap*, const char*, time_t **, const char*); + +#ifndef SOAP_TYPE_PointerTocwmp1AccessList +#define SOAP_TYPE_PointerTocwmp1AccessList (26) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1AccessList(struct soap*, struct cwmp1AccessList *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1AccessList(struct soap*, struct cwmp1AccessList *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1AccessList(struct soap*, const char *, int, struct cwmp1AccessList *const*, const char *); +SOAP_FMAC3 struct cwmp1AccessList ** SOAP_FMAC4 soap_get_PointerTocwmp1AccessList(struct soap*, struct cwmp1AccessList **, const char*, const char*); +SOAP_FMAC3 struct cwmp1AccessList ** SOAP_FMAC4 soap_in_PointerTocwmp1AccessList(struct soap*, const char*, struct cwmp1AccessList **, const char*); + +#ifndef SOAP_TYPE_PointerTostring +#define SOAP_TYPE_PointerTostring (23) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTostring(struct soap*, char **const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTostring(struct soap*, char **const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTostring(struct soap*, const char *, int, char **const*, const char *); +SOAP_FMAC3 char *** SOAP_FMAC4 soap_get_PointerTostring(struct soap*, char ***, const char*, const char*); +SOAP_FMAC3 char *** SOAP_FMAC4 soap_in_PointerTostring(struct soap*, const char*, char ***, const char*); + +#ifndef SOAP_TYPE_cwmp1__ObjectNameType +#define SOAP_TYPE_cwmp1__ObjectNameType (16) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ObjectNameType(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ObjectNameType(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ObjectNameType(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ObjectNameType(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__ObjectNameType(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__ObjectNameType(struct soap*, const char*, char **, const char*); + +#ifndef SOAP_TYPE_cwmp1__CommandKeyType +#define SOAP_TYPE_cwmp1__CommandKeyType (15) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__CommandKeyType(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__CommandKeyType(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__CommandKeyType(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__CommandKeyType(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__CommandKeyType(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__CommandKeyType(struct soap*, const char*, char **, const char*); + +#ifndef SOAP_TYPE_cwmp1__ParameterKeyType +#define SOAP_TYPE_cwmp1__ParameterKeyType (14) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterKeyType(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterKeyType(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterKeyType(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterKeyType(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__ParameterKeyType(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__ParameterKeyType(struct soap*, const char*, char **, const char*); + +#ifndef SOAP_TYPE_cwmp1__FaultCodeType +#define SOAP_TYPE_cwmp1__FaultCodeType (13) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__FaultCodeType(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__FaultCodeType(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__FaultCodeType(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__FaultCodeType(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__FaultCodeType(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__FaultCodeType(struct soap*, const char*, char **, const char*); + +#ifndef SOAP_TYPE_xsd__anySimpleType +#define SOAP_TYPE_xsd__anySimpleType (11) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__anySimpleType(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anySimpleType(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anySimpleType(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__anySimpleType(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_xsd__anySimpleType(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_xsd__anySimpleType(struct soap*, const char*, char **, const char*); + +#ifndef SOAP_TYPE_PointerTounsignedByte +#define SOAP_TYPE_PointerTounsignedByte (10) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTounsignedByte(struct soap*, unsigned char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTounsignedByte(struct soap*, unsigned char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTounsignedByte(struct soap*, const char *, int, unsigned char *const*, const char *); +SOAP_FMAC3 unsigned char ** SOAP_FMAC4 soap_get_PointerTounsignedByte(struct soap*, unsigned char **, const char*, const char*); +SOAP_FMAC3 unsigned char ** SOAP_FMAC4 soap_in_PointerTounsignedByte(struct soap*, const char*, unsigned char **, const char*); + +#ifndef SOAP_TYPE__QName +#define SOAP_TYPE__QName (5) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default__QName(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); + +#ifndef SOAP_TYPE_string +#define SOAP_TYPE_string (4) +#endif +SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap*, char **); +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap*, char *const*); +SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); +SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); + +#ifdef __cplusplus +} +#endif + +#endif + +/* End of soapH.h */ diff --git a/src/inc/soapStub.h b/src/inc/soapStub.h new file mode 100644 index 0000000..34fdf10 --- /dev/null +++ b/src/inc/soapStub.h @@ -0,0 +1,1060 @@ +/* soapStub.h + Generated by gSOAP 2.7.12 from cwmp-1-1.h + Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. + This part of the software is released under one of the following licenses: + GPL, the gSOAP public license, or Genivia's license for commercial use. +*/ + +#ifndef soapStub_H +#define soapStub_H +#include "stdsoap2.h" +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************\ + * * + * Enumerations * + * * +\******************************************************************************/ + + +#ifndef SOAP_TYPE_xsd__boolean +#define SOAP_TYPE_xsd__boolean (12) +/* xsd:boolean */ +enum xsd__boolean {xsd__boolean__false_ = 0, xsd__boolean__true_ = 1}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification +#define SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification (24) +/* cwmp1:SetParameterAttributesStruct-Notification */ +enum _cwmp1__SetParameterAttributesStruct_Notification {_cwmp1__SetParameterAttributesStruct_Notification__0 = 0, _cwmp1__SetParameterAttributesStruct_Notification__1 = 1, _cwmp1__SetParameterAttributesStruct_Notification__2 = 2}; +#endif + +#ifndef SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification +#define SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification (28) +/* cwmp1:ParameterAttributeStruct-Notification */ +enum _cwmp1__ParameterAttributeStruct_Notification {_cwmp1__ParameterAttributeStruct_Notification__0 = 0, _cwmp1__ParameterAttributeStruct_Notification__1 = 1, _cwmp1__ParameterAttributeStruct_Notification__2 = 2}; +#endif + +#ifndef SOAP_TYPE__cwmp1__QueuedTransferStruct_State +#define SOAP_TYPE__cwmp1__QueuedTransferStruct_State (30) +/* cwmp1:QueuedTransferStruct-State */ +enum _cwmp1__QueuedTransferStruct_State {_cwmp1__QueuedTransferStruct_State__1 = 1, _cwmp1__QueuedTransferStruct_State__2 = 2, _cwmp1__QueuedTransferStruct_State__3 = 3}; +#endif + +#ifndef SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State +#define SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State (32) +/* cwmp1:AllQueuedTransferStruct-State */ +enum _cwmp1__AllQueuedTransferStruct_State {_cwmp1__AllQueuedTransferStruct_State__1 = 1, _cwmp1__AllQueuedTransferStruct_State__2 = 2, _cwmp1__AllQueuedTransferStruct_State__3 = 3}; +#endif + +#ifndef SOAP_TYPE__cwmp1__OptionStruct_State +#define SOAP_TYPE__cwmp1__OptionStruct_State (35) +/* cwmp1:OptionStruct-State */ +enum _cwmp1__OptionStruct_State {_cwmp1__OptionStruct_State__0 = 0, _cwmp1__OptionStruct_State__1 = 1, _cwmp1__OptionStruct_State__2 = 2, _cwmp1__OptionStruct_State__3 = 3}; +#endif + +#ifndef SOAP_TYPE__cwmp1__OptionStruct_Mode +#define SOAP_TYPE__cwmp1__OptionStruct_Mode (36) +/* cwmp1:OptionStruct-Mode */ +enum _cwmp1__OptionStruct_Mode {_cwmp1__OptionStruct_Mode__0 = 0, _cwmp1__OptionStruct_Mode__1 = 1, _cwmp1__OptionStruct_Mode__2 = 2}; +#endif + +#ifndef SOAP_TYPE__cwmp1__OptionStruct_IsTransferable +#define SOAP_TYPE__cwmp1__OptionStruct_IsTransferable (39) +/* cwmp1:OptionStruct-IsTransferable */ +enum _cwmp1__OptionStruct_IsTransferable {_cwmp1__OptionStruct_IsTransferable__0 = 0, _cwmp1__OptionStruct_IsTransferable__1 = 1}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status +#define SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status (51) +/* cwmp1:SetParameterValuesResponse-Status */ +enum _cwmp1__SetParameterValuesResponse_Status {_cwmp1__SetParameterValuesResponse_Status__0 = 0, _cwmp1__SetParameterValuesResponse_Status__1 = 1}; +#endif + +#ifndef SOAP_TYPE__cwmp1__AddObjectResponse_Status +#define SOAP_TYPE__cwmp1__AddObjectResponse_Status (70) +/* cwmp1:AddObjectResponse-Status */ +enum _cwmp1__AddObjectResponse_Status {_cwmp1__AddObjectResponse_Status__0 = 0, _cwmp1__AddObjectResponse_Status__1 = 1}; +#endif + +#ifndef SOAP_TYPE__cwmp1__DeleteObjectResponse_Status +#define SOAP_TYPE__cwmp1__DeleteObjectResponse_Status (73) +/* cwmp1:DeleteObjectResponse-Status */ +enum _cwmp1__DeleteObjectResponse_Status {_cwmp1__DeleteObjectResponse_Status__0 = 0, _cwmp1__DeleteObjectResponse_Status__1 = 1}; +#endif + +#ifndef SOAP_TYPE__cwmp1__DownloadResponse_Status +#define SOAP_TYPE__cwmp1__DownloadResponse_Status (76) +/* cwmp1:DownloadResponse-Status */ +enum _cwmp1__DownloadResponse_Status {_cwmp1__DownloadResponse_Status__0 = 0, _cwmp1__DownloadResponse_Status__1 = 1}; +#endif + +#ifndef SOAP_TYPE__cwmp1__UploadResponse_Status +#define SOAP_TYPE__cwmp1__UploadResponse_Status (95) +/* cwmp1:UploadResponse-Status */ +enum _cwmp1__UploadResponse_Status {_cwmp1__UploadResponse_Status__0 = 0, _cwmp1__UploadResponse_Status__1 = 1}; +#endif + +/******************************************************************************\ + * * + * Classes and Structs * + * * +\******************************************************************************/ + + +#if 0 /* volatile type: do not redeclare here */ + +#endif + +#ifndef SOAP_TYPE_SOAP_ENC__base64 +#define SOAP_TYPE_SOAP_ENC__base64 (7) +/* Base64 schema type: */ +struct SOAP_ENC__base64 +{ + unsigned char *__ptr; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__FaultStruct +#define SOAP_TYPE_cwmp1__FaultStruct (17) +/* cwmp1:FaultStruct */ +struct cwmp1__FaultStruct +{ + char *FaultCode; /* required element of type xsd:string */ + char *FaultString; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__DeviceIdStruct +#define SOAP_TYPE_cwmp1__DeviceIdStruct (18) +/* cwmp1:DeviceIdStruct */ +struct cwmp1__DeviceIdStruct +{ + char *Manufacturer; /* required element of type xsd:string */ + char *OUI; /* required element of type xsd:string */ + char *ProductClass; /* required element of type xsd:string */ + char *SerialNumber; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__EventStruct +#define SOAP_TYPE_cwmp1__EventStruct (19) +/* cwmp1:EventStruct */ +struct cwmp1__EventStruct +{ + char *EventCode; /* required element of type xsd:string */ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__ParameterValueStruct +#define SOAP_TYPE_cwmp1__ParameterValueStruct (20) +/* cwmp1:ParameterValueStruct */ +struct cwmp1__ParameterValueStruct +{ + char *Name; /* required element of type xsd:string */ + char *Value; /* required element of type xsd:anySimpleType */ + char *Type; /*FIXME AZR: Added for type of value */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__ParameterInfoStruct +#define SOAP_TYPE_cwmp1__ParameterInfoStruct (21) +/* cwmp1:ParameterInfoStruct */ +struct cwmp1__ParameterInfoStruct +{ + char *Name; /* required element of type xsd:string */ + enum xsd__boolean Writable; /* required element of type xsd:boolean */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__SetParameterAttributesStruct +#define SOAP_TYPE_cwmp1__SetParameterAttributesStruct (22) +/* cwmp1:SetParameterAttributesStruct */ +struct cwmp1__SetParameterAttributesStruct +{ + char **Name; /* optional element of type xsd:string */ + enum xsd__boolean NotificationChange; /* required element of type xsd:boolean */ + enum _cwmp1__SetParameterAttributesStruct_Notification Notification; /* required element of type cwmp1:SetParameterAttributesStruct-Notification */ + enum xsd__boolean AccessListChange; /* required element of type xsd:boolean */ + struct cwmp1AccessList *AccessList; /* required element of type ArrayOfstring */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__ParameterAttributeStruct +#define SOAP_TYPE_cwmp1__ParameterAttributeStruct (27) +/* cwmp1:ParameterAttributeStruct */ +struct cwmp1__ParameterAttributeStruct +{ + char *Name; /* required element of type xsd:string */ + enum _cwmp1__ParameterAttributeStruct_Notification Notification; /* required element of type cwmp1:ParameterAttributeStruct-Notification */ + struct cwmp1AccessList *AccessList; /* required element of type ArrayOfstring */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__QueuedTransferStruct +#define SOAP_TYPE_cwmp1__QueuedTransferStruct (29) +/* cwmp1:QueuedTransferStruct */ +struct cwmp1__QueuedTransferStruct +{ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ + enum _cwmp1__QueuedTransferStruct_State State; /* required element of type cwmp1:QueuedTransferStruct-State */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__AllQueuedTransferStruct +#define SOAP_TYPE_cwmp1__AllQueuedTransferStruct (31) +/* cwmp1:AllQueuedTransferStruct */ +struct cwmp1__AllQueuedTransferStruct +{ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ + enum _cwmp1__AllQueuedTransferStruct_State State; /* required element of type cwmp1:AllQueuedTransferStruct-State */ + enum xsd__boolean IsDownload; /* required element of type xsd:boolean */ + char *FileType; /* required element of type xsd:string */ + unsigned int FileSize; /* required element of type xsd:unsignedInt */ + char *TargetFileName; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__ArgStruct +#define SOAP_TYPE_cwmp1__ArgStruct (33) +/* cwmp1:ArgStruct */ +struct cwmp1__ArgStruct +{ + char *Name; /* required element of type xsd:string */ + char *Value; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__OptionStruct +#define SOAP_TYPE_cwmp1__OptionStruct (34) +/* cwmp1:OptionStruct */ +struct cwmp1__OptionStruct +{ + char *OptionName; /* required element of type xsd:string */ + unsigned int VoucherSN; /* required element of type xsd:unsignedInt */ + enum _cwmp1__OptionStruct_State State; /* required element of type cwmp1:OptionStruct-State */ + enum _cwmp1__OptionStruct_Mode Mode; /* required element of type cwmp1:OptionStruct-Mode */ + time_t StartDate; /* required element of type xsd:dateTime */ + time_t *ExpirationDate; /* optional element of type xsd:dateTime */ + enum _cwmp1__OptionStruct_IsTransferable IsTransferable; /* required element of type cwmp1:OptionStruct-IsTransferable */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault +#define SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault (41) +/* cwmp1:Fault-SetParameterValuesFault */ +struct _cwmp1__Fault_SetParameterValuesFault +{ + char *ParameterName; /* required element of type xsd:string */ + char *FaultCode; /* required element of type cwmp1:FaultCodeType */ + char *FaultString; /* optional element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Fault +#define SOAP_TYPE__cwmp1__Fault (40) +/* cwmp1:Fault */ +struct _cwmp1__Fault +{ + char *FaultCode; /* required element of type cwmp1:FaultCodeType */ + char *FaultString; /* optional element of type xsd:string */ + int __sizeSetParameterValuesFault; /* sequence of elements */ + struct _cwmp1__Fault_SetParameterValuesFault *SetParameterValuesFault; /* optional element of type cwmp1:Fault-SetParameterValuesFault */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetRPCMethods +#define SOAP_TYPE__cwmp1__GetRPCMethods (43) +/* cwmp1:GetRPCMethods */ +struct _cwmp1__GetRPCMethods +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetRPCMethodsResponse +#define SOAP_TYPE__cwmp1__GetRPCMethodsResponse (44) +/* cwmp1:GetRPCMethodsResponse */ +struct _cwmp1__GetRPCMethodsResponse +{ + struct cwmp1MethodList *MethodList; /* required element of type ArrayOfstring */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetParameterValues +#define SOAP_TYPE__cwmp1__SetParameterValues (47) +/* cwmp1:SetParameterValues */ +struct _cwmp1__SetParameterValues +{ + struct cwmp1ParameterValueList *ParameterList; /* required element of type ArrayOfParameterValueStruct */ + char *ParameterKey; /* required element of type cwmp1:ParameterKeyType */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetParameterValuesResponse +#define SOAP_TYPE__cwmp1__SetParameterValuesResponse (50) +/* cwmp1:SetParameterValuesResponse */ +struct _cwmp1__SetParameterValuesResponse +{ + enum _cwmp1__SetParameterValuesResponse_Status Status; /* required element of type cwmp1:SetParameterValuesResponse-Status */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetParameterValues +#define SOAP_TYPE__cwmp1__GetParameterValues (52) +/* cwmp1:GetParameterValues */ +struct _cwmp1__GetParameterValues +{ + struct cwmp1ParameterNames *ParameterNames; /* required element of type ArrayOfstring */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetParameterValuesResponse +#define SOAP_TYPE__cwmp1__GetParameterValuesResponse (55) +/* cwmp1:GetParameterValuesResponse */ +struct _cwmp1__GetParameterValuesResponse +{ + struct cwmp1ParameterValueList *ParameterList; /* required element of type ArrayOfParameterValueStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetParameterNames +#define SOAP_TYPE__cwmp1__GetParameterNames (56) +/* cwmp1:GetParameterNames */ +struct _cwmp1__GetParameterNames +{ + char **ParameterPath; /* optional element of type xsd:string */ + enum xsd__boolean NextLevel; /* required element of type xsd:boolean */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetParameterNamesResponse +#define SOAP_TYPE__cwmp1__GetParameterNamesResponse (57) +/* cwmp1:GetParameterNamesResponse */ +struct _cwmp1__GetParameterNamesResponse +{ + struct cwmp1ParameterInfoList *ParameterList; /* required element of type ArrayOfParameterInfoStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetParameterAttributes +#define SOAP_TYPE__cwmp1__SetParameterAttributes (60) +/* cwmp1:SetParameterAttributes */ +struct _cwmp1__SetParameterAttributes +{ + struct cwmp1SetParameterAttributesList *ParameterList; /* required element of type ArrayOfSetParameterAttributesStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetParameterAttributesResponse +#define SOAP_TYPE__cwmp1__SetParameterAttributesResponse (63) +/* cwmp1:SetParameterAttributesResponse */ +struct _cwmp1__SetParameterAttributesResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetParameterAttributes +#define SOAP_TYPE__cwmp1__GetParameterAttributes (64) +/* cwmp1:GetParameterAttributes */ +struct _cwmp1__GetParameterAttributes +{ + struct cwmp1ParameterNames *ParameterNames; /* required element of type ArrayOfstring */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetParameterAttributesResponse +#define SOAP_TYPE__cwmp1__GetParameterAttributesResponse (65) +/* cwmp1:GetParameterAttributesResponse */ +struct _cwmp1__GetParameterAttributesResponse +{ + struct cwmp1ParameterAttributeList *ParameterList; /* required element of type ArrayOfParameterAttributeStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__AddObject +#define SOAP_TYPE__cwmp1__AddObject (68) +/* cwmp1:AddObject */ +struct _cwmp1__AddObject +{ + char *ObjectName; /* required element of type cwmp1:ObjectNameType */ + char *ParameterKey; /* required element of type cwmp1:ParameterKeyType */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__AddObjectResponse +#define SOAP_TYPE__cwmp1__AddObjectResponse (69) +/* cwmp1:AddObjectResponse */ +struct _cwmp1__AddObjectResponse +{ + unsigned int InstanceNumber; /* required element of type xsd:unsignedInt */ + enum _cwmp1__AddObjectResponse_Status Status; /* required element of type cwmp1:AddObjectResponse-Status */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__DeleteObject +#define SOAP_TYPE__cwmp1__DeleteObject (71) +/* cwmp1:DeleteObject */ +struct _cwmp1__DeleteObject +{ + char *ObjectName; /* required element of type cwmp1:ObjectNameType */ + char *ParameterKey; /* required element of type cwmp1:ParameterKeyType */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__DeleteObjectResponse +#define SOAP_TYPE__cwmp1__DeleteObjectResponse (72) +/* cwmp1:DeleteObjectResponse */ +struct _cwmp1__DeleteObjectResponse +{ + enum _cwmp1__DeleteObjectResponse_Status Status; /* required element of type cwmp1:DeleteObjectResponse-Status */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Download +#define SOAP_TYPE__cwmp1__Download (74) +/* cwmp1:Download */ +struct _cwmp1__Download +{ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ + char *FileType; /* required element of type xsd:string */ + char *URL; /* required element of type xsd:string */ + char *Username; /* required element of type xsd:string */ + char *Password; /* required element of type xsd:string */ + unsigned int FileSize; /* required element of type xsd:unsignedInt */ + char *TargetFileName; /* required element of type xsd:string */ + unsigned int DelaySeconds; /* required element of type xsd:unsignedInt */ + char *SuccessURL; /* required element of type xsd:string */ + char *FailureURL; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__DownloadResponse +#define SOAP_TYPE__cwmp1__DownloadResponse (75) +/* cwmp1:DownloadResponse */ +struct _cwmp1__DownloadResponse +{ + enum _cwmp1__DownloadResponse_Status Status; /* required element of type cwmp1:DownloadResponse-Status */ + time_t StartTime; /* required element of type xsd:dateTime */ + time_t CompleteTime; /* required element of type xsd:dateTime */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Reboot +#define SOAP_TYPE__cwmp1__Reboot (77) +/* cwmp1:Reboot */ +struct _cwmp1__Reboot +{ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__RebootResponse +#define SOAP_TYPE__cwmp1__RebootResponse (78) +/* cwmp1:RebootResponse */ +struct _cwmp1__RebootResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetQueuedTransfers +#define SOAP_TYPE__cwmp1__GetQueuedTransfers (79) +/* cwmp1:GetQueuedTransfers */ +struct _cwmp1__GetQueuedTransfers +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetQueuedTransfersResponse +#define SOAP_TYPE__cwmp1__GetQueuedTransfersResponse (80) +/* cwmp1:GetQueuedTransfersResponse */ +struct _cwmp1__GetQueuedTransfersResponse +{ + struct cwmp1TransferList *TransferList; /* required element of type ArrayOfQueuedTransferStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__ScheduleInform +#define SOAP_TYPE__cwmp1__ScheduleInform (83) +/* cwmp1:ScheduleInform */ +struct _cwmp1__ScheduleInform +{ + unsigned int DelaySeconds; /* required element of type xsd:unsignedInt */ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__ScheduleInformResponse +#define SOAP_TYPE__cwmp1__ScheduleInformResponse (84) +/* cwmp1:ScheduleInformResponse */ +struct _cwmp1__ScheduleInformResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetVouchers +#define SOAP_TYPE__cwmp1__SetVouchers (85) +/* cwmp1:SetVouchers */ +struct _cwmp1__SetVouchers +{ + struct cwmp1VoucherList *VoucherList; /* required element of type ArrayOfbase64 */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__SetVouchersResponse +#define SOAP_TYPE__cwmp1__SetVouchersResponse (88) +/* cwmp1:SetVouchersResponse */ +struct _cwmp1__SetVouchersResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetOptions +#define SOAP_TYPE__cwmp1__GetOptions (89) +/* cwmp1:GetOptions */ +struct _cwmp1__GetOptions +{ + char *OptionName; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetOptionsResponse +#define SOAP_TYPE__cwmp1__GetOptionsResponse (90) +/* cwmp1:GetOptionsResponse */ +struct _cwmp1__GetOptionsResponse +{ + struct cwmp1OptionList *OptionList; /* required element of type ArrayOfOptionStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Upload +#define SOAP_TYPE__cwmp1__Upload (93) +/* cwmp1:Upload */ +struct _cwmp1__Upload +{ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ + char *FileType; /* required element of type xsd:string */ + char *URL; /* required element of type xsd:string */ + char *Username; /* required element of type xsd:string */ + char *Password; /* required element of type xsd:string */ + unsigned int DelaySeconds; /* required element of type xsd:unsignedInt */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__UploadResponse +#define SOAP_TYPE__cwmp1__UploadResponse (94) +/* cwmp1:UploadResponse */ +struct _cwmp1__UploadResponse +{ + enum _cwmp1__UploadResponse_Status Status; /* required element of type cwmp1:UploadResponse-Status */ + time_t StartTime; /* required element of type xsd:dateTime */ + time_t CompleteTime; /* required element of type xsd:dateTime */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__FactoryReset +#define SOAP_TYPE__cwmp1__FactoryReset (96) +/* cwmp1:FactoryReset */ +struct _cwmp1__FactoryReset +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__FactoryResetResponse +#define SOAP_TYPE__cwmp1__FactoryResetResponse (97) +/* cwmp1:FactoryResetResponse */ +struct _cwmp1__FactoryResetResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetAllQueuedTransfers +#define SOAP_TYPE__cwmp1__GetAllQueuedTransfers (98) +/* cwmp1:GetAllQueuedTransfers */ +struct _cwmp1__GetAllQueuedTransfers +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse +#define SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse (99) +/* cwmp1:GetAllQueuedTransfersResponse */ +struct _cwmp1__GetAllQueuedTransfersResponse +{ + struct cwmp1AllTransferList *TransferList; /* required element of type ArrayOfAllQueuedTransferStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Inform +#define SOAP_TYPE__cwmp1__Inform (102) +/* cwmp1:Inform */ +struct _cwmp1__Inform +{ + struct cwmp1__DeviceIdStruct *DeviceId; /* required element of type cwmp1:DeviceIdStruct */ + struct cwmp1EventList *Event; /* required element of type ArrayOfEventStruct */ + unsigned int MaxEnvelopes; /* required element of type xsd:unsignedInt */ + time_t CurrentTime; /* required element of type xsd:dateTime */ + unsigned int RetryCount; /* required element of type xsd:unsignedInt */ + struct cwmp1ParameterValueList *ParameterList; /* required element of type ArrayOfParameterValueStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__InformResponse +#define SOAP_TYPE__cwmp1__InformResponse (106) +/* cwmp1:InformResponse */ +struct _cwmp1__InformResponse +{ + unsigned int MaxEnvelopes; /* required element of type xsd:unsignedInt */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__TransferComplete +#define SOAP_TYPE__cwmp1__TransferComplete (107) +/* cwmp1:TransferComplete */ +struct _cwmp1__TransferComplete +{ + char *CommandKey; /* required element of type cwmp1:CommandKeyType */ + struct cwmp1__FaultStruct *FaultStruct; /* required element of type cwmp1:FaultStruct */ + time_t StartTime; /* required element of type xsd:dateTime */ + time_t CompleteTime; /* required element of type xsd:dateTime */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__TransferCompleteResponse +#define SOAP_TYPE__cwmp1__TransferCompleteResponse (109) +/* cwmp1:TransferCompleteResponse */ +struct _cwmp1__TransferCompleteResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__AutonomousTransferComplete +#define SOAP_TYPE__cwmp1__AutonomousTransferComplete (110) +/* cwmp1:AutonomousTransferComplete */ +struct _cwmp1__AutonomousTransferComplete +{ + char *AnnounceURL; /* required element of type xsd:string */ + char *TransferURL; /* required element of type xsd:string */ + enum xsd__boolean IsDownload; /* required element of type xsd:boolean */ + char *FileType; /* required element of type xsd:string */ + unsigned int FileSize; /* required element of type xsd:unsignedInt */ + char *TargetFileName; /* required element of type xsd:string */ + struct cwmp1__FaultStruct *FaultStruct; /* required element of type cwmp1:FaultStruct */ + time_t StartTime; /* required element of type xsd:dateTime */ + time_t CompleteTime; /* required element of type xsd:dateTime */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse +#define SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse (111) +/* cwmp1:AutonomousTransferCompleteResponse */ +struct _cwmp1__AutonomousTransferCompleteResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__Kicked +#define SOAP_TYPE__cwmp1__Kicked (112) +/* cwmp1:Kicked */ +struct _cwmp1__Kicked +{ + char *Command; /* required element of type xsd:string */ + char *Referer; /* required element of type xsd:string */ + char *Arg; /* required element of type xsd:string */ + char *Next; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__KickedResponse +#define SOAP_TYPE__cwmp1__KickedResponse (113) +/* cwmp1:KickedResponse */ +struct _cwmp1__KickedResponse +{ + char *NextURL; /* required element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__RequestDownload +#define SOAP_TYPE__cwmp1__RequestDownload (114) +/* cwmp1:RequestDownload */ +struct _cwmp1__RequestDownload +{ + char *FileType; /* required element of type xsd:string */ + struct cwmp1FileTypeArg *FileTypeArg; /* required element of type ArrayOfArgStruct */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__RequestDownloadResponse +#define SOAP_TYPE__cwmp1__RequestDownloadResponse (117) +/* cwmp1:RequestDownloadResponse */ +struct _cwmp1__RequestDownloadResponse +{ +#ifdef WITH_NOEMPTYSTRUCT + char dummy; /* dummy member to enable compilation */ +#endif +}; +#endif + +#ifndef SOAP_TYPE_cwmp1MethodList +#define SOAP_TYPE_cwmp1MethodList (45) +/* SOAP encoded array of xsd:string schema type: */ +struct cwmp1MethodList +{ + char **__ptrstring; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1EventList +#define SOAP_TYPE_cwmp1EventList (104) +/* SOAP encoded array of cwmp1:EventStruct schema type: */ +struct cwmp1EventList +{ + struct cwmp1__EventStruct **__ptrEventStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1ParameterValueList +#define SOAP_TYPE_cwmp1ParameterValueList (48) +/* SOAP encoded array of cwmp1:ParameterValueStruct schema type: */ +struct cwmp1ParameterValueList +{ + struct cwmp1__ParameterValueStruct **__ptrParameterValueStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1ParameterInfoList +#define SOAP_TYPE_cwmp1ParameterInfoList (58) +/* SOAP encoded array of cwmp1:ParameterInfoStruct schema type: */ +struct cwmp1ParameterInfoList +{ + struct cwmp1__ParameterInfoStruct **__ptrParameterInfoStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1ParameterNames +#define SOAP_TYPE_cwmp1ParameterNames (53) +/* SOAP encoded array of xsd:string schema type: */ +struct cwmp1ParameterNames +{ + char **__ptrstring; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1AccessList +#define SOAP_TYPE_cwmp1AccessList (25) +/* SOAP encoded array of xsd:string schema type: */ +struct cwmp1AccessList +{ + char **__ptrstring; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1SetParameterAttributesList +#define SOAP_TYPE_cwmp1SetParameterAttributesList (61) +/* SOAP encoded array of cwmp1:SetParameterAttributesStruct schema type: */ +struct cwmp1SetParameterAttributesList +{ + struct cwmp1__SetParameterAttributesStruct **__ptrSetParameterAttributesStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1ParameterAttributeList +#define SOAP_TYPE_cwmp1ParameterAttributeList (66) +/* SOAP encoded array of cwmp1:ParameterAttributeStruct schema type: */ +struct cwmp1ParameterAttributeList +{ + struct cwmp1__ParameterAttributeStruct **__ptrParameterAttributeStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1TransferList +#define SOAP_TYPE_cwmp1TransferList (81) +/* SOAP encoded array of cwmp1:QueuedTransferStruct schema type: */ +struct cwmp1TransferList +{ + struct cwmp1__QueuedTransferStruct **__ptrQueuedTransferStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1AllTransferList +#define SOAP_TYPE_cwmp1AllTransferList (100) +/* SOAP encoded array of cwmp1:AllQueuedTransferStruct schema type: */ +struct cwmp1AllTransferList +{ + struct cwmp1__AllQueuedTransferStruct **__ptrAllQueuedTransferStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1VoucherList +#define SOAP_TYPE_cwmp1VoucherList (86) +/* SOAP encoded array of SOAP-ENC:base64 schema type: */ +struct cwmp1VoucherList +{ + struct SOAP_ENC__base64 **__ptrbase64; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1OptionList +#define SOAP_TYPE_cwmp1OptionList (91) +/* SOAP encoded array of cwmp1:OptionStruct schema type: */ +struct cwmp1OptionList +{ + struct cwmp1__OptionStruct **__ptrOptionStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE_cwmp1FileTypeArg +#define SOAP_TYPE_cwmp1FileTypeArg (115) +/* SOAP encoded array of cwmp1:ArgStruct schema type: */ +struct cwmp1FileTypeArg +{ + struct cwmp1__ArgStruct **__ptrArgStruct; + int __size; +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__ID +#define SOAP_TYPE__cwmp1__ID (138) +/* Primitive cwmp1:ID schema type: */ +struct _cwmp1__ID +{ + char *__item; + char *SOAP_ENV__mustUnderstand; /* required attribute of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE__cwmp1__HoldRequests +#define SOAP_TYPE__cwmp1__HoldRequests (139) +/* Primitive cwmp1:HoldRequests schema type: */ +struct _cwmp1__HoldRequests +{ + enum xsd__boolean __item; + char *SOAP_ENV__mustUnderstand; /* required attribute of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__InformResponse +#define SOAP_TYPE_cwmp1__InformResponse (142) +/* cwmp1:InformResponse */ +struct cwmp1__InformResponse +{ + unsigned int *MaxEnvelopesO; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:unsignedInt */ +}; +#endif + +#ifndef SOAP_TYPE_cwmp1__Inform +#define SOAP_TYPE_cwmp1__Inform (143) +/* cwmp1:Inform */ +struct cwmp1__Inform +{ + struct cwmp1__DeviceIdStruct *DeviceId; /* optional element of type cwmp1:DeviceIdStruct */ + struct cwmp1EventList *Event; /* optional element of type ArrayOfEventStruct */ + unsigned int MaxEnvelopesI; /* required element of type xsd:unsignedInt */ + time_t CurrentTime; /* required element of type xsd:dateTime */ + unsigned int RetryCount; /* required element of type xsd:unsignedInt */ + struct cwmp1ParameterValueList *ParameterList; /* optional element of type ArrayOfParameterValueStruct */ +}; +#endif + +#ifndef SOAP_TYPE_SOAP_ENV__Header +#define SOAP_TYPE_SOAP_ENV__Header (144) +/* SOAP Header: */ +struct SOAP_ENV__Header +{ + /* KMD */ + struct _cwmp1__ID ID; + struct _cwmp1__HoldRequests HoldRequests; +}; +#endif + +#ifndef SOAP_TYPE_SOAP_ENV__Code +#define SOAP_TYPE_SOAP_ENV__Code (145) +/* SOAP Fault Code: */ +struct SOAP_ENV__Code +{ + char *SOAP_ENV__Value; /* optional element of type xsd:QName */ + struct SOAP_ENV__Code *SOAP_ENV__Subcode; /* optional element of type SOAP-ENV:Code */ +}; +#endif + +#ifndef SOAP_TYPE_SOAP_ENV__Detail +#define SOAP_TYPE_SOAP_ENV__Detail (147) +/* SOAP-ENV:Detail */ +struct SOAP_ENV__Detail +{ + int __type; /* any type of element (defined below) */ + void *fault; /* transient */ + char *__any; +}; +#endif + +#ifndef SOAP_TYPE_SOAP_ENV__Reason +#define SOAP_TYPE_SOAP_ENV__Reason (150) +/* SOAP-ENV:Reason */ +struct SOAP_ENV__Reason +{ + char *SOAP_ENV__Text; /* optional element of type xsd:string */ +}; +#endif + +#ifndef SOAP_TYPE_SOAP_ENV__Fault +#define SOAP_TYPE_SOAP_ENV__Fault (151) +/* SOAP Fault: */ +struct SOAP_ENV__Fault +{ + char *faultcode; /* optional element of type xsd:QName */ + char *faultstring; /* optional element of type xsd:string */ + char *faultactor; /* optional element of type xsd:string */ + struct SOAP_ENV__Detail *detail; /* optional element of type SOAP-ENV:Detail */ + struct SOAP_ENV__Code *SOAP_ENV__Code; /* optional element of type SOAP-ENV:Code */ + struct SOAP_ENV__Reason *SOAP_ENV__Reason; /* optional element of type SOAP-ENV:Reason */ + char *SOAP_ENV__Node; /* optional element of type xsd:string */ + char *SOAP_ENV__Role; /* optional element of type xsd:string */ + struct SOAP_ENV__Detail *SOAP_ENV__Detail; /* optional element of type SOAP-ENV:Detail */ +}; +#endif + +/******************************************************************************\ + * * + * Types with Custom Serializers * + * * +\******************************************************************************/ + + +/******************************************************************************\ + * * + * Typedefs * + * * +\******************************************************************************/ + +#ifndef SOAP_TYPE__QName +#define SOAP_TYPE__QName (5) +typedef char *_QName; +#endif + +#ifndef SOAP_TYPE__XML +#define SOAP_TYPE__XML (6) +typedef char *_XML; +#endif + +#ifndef SOAP_TYPE_xsd__anySimpleType +#define SOAP_TYPE_xsd__anySimpleType (11) +typedef char *xsd__anySimpleType; +#endif + +#ifndef SOAP_TYPE_cwmp1__FaultCodeType +#define SOAP_TYPE_cwmp1__FaultCodeType (13) +typedef char *cwmp1__FaultCodeType; +#endif + +#ifndef SOAP_TYPE_cwmp1__ParameterKeyType +#define SOAP_TYPE_cwmp1__ParameterKeyType (14) +typedef char *cwmp1__ParameterKeyType; +#endif + +#ifndef SOAP_TYPE_cwmp1__CommandKeyType +#define SOAP_TYPE_cwmp1__CommandKeyType (15) +typedef char *cwmp1__CommandKeyType; +#endif + +#ifndef SOAP_TYPE_cwmp1__ObjectNameType +#define SOAP_TYPE_cwmp1__ObjectNameType (16) +typedef char *cwmp1__ObjectNameType; +#endif + + +/******************************************************************************\ + * * + * Typedef Synonyms * + * * +\******************************************************************************/ + + +/******************************************************************************\ + * * + * Externals * + * * +\******************************************************************************/ + + +/******************************************************************************\ + * * + * Service Operations * + * * +\******************************************************************************/ + + +SOAP_FMAC5 int SOAP_FMAC6 cwmp1__Inform(struct soap*, struct cwmp1__DeviceIdStruct *DeviceId, struct cwmp1EventList *Event, unsigned int MaxEnvelopesI, time_t CurrentTime, unsigned int RetryCount, struct cwmp1ParameterValueList *ParameterList, unsigned int *MaxEnvelopesO); + +/******************************************************************************\ + * * + * Stubs * + * * +\******************************************************************************/ + + +SOAP_FMAC5 int SOAP_FMAC6 soap_call_cwmp1__Inform(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct cwmp1__DeviceIdStruct *DeviceId, struct cwmp1EventList *Event, unsigned int MaxEnvelopesI, time_t CurrentTime, unsigned int RetryCount, struct cwmp1ParameterValueList *ParameterList, unsigned int *MaxEnvelopesO); + +/******************************************************************************\ + * * + * Skeletons * + * * +\******************************************************************************/ + +SOAP_FMAC5 int SOAP_FMAC6 soap_serve_cwmp1__Inform(struct soap*); + +#ifdef __cplusplus +} +#endif + +#endif + +/* End of soapStub.h */ diff --git a/src/inc/stdsoap2.h b/src/inc/stdsoap2.h new file mode 100644 index 0000000..54d9375 --- /dev/null +++ b/src/inc/stdsoap2.h @@ -0,0 +1,2317 @@ +/* + stdsoap2.h 2.7.12 + + gSOAP runtime engine + +gSOAP XML Web services tools +Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under ONE of the following licenses: +GPL, or the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +Contributors: + +Wind River Systems, Inc., for the following additions + - vxWorks compatible +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#ifdef WITH_SOAPDEFS_H +# include "soapdefs.h" /* include user-defined stuff */ +#endif + +#ifndef _THREAD_SAFE +# define _THREAD_SAFE +#endif + +#ifndef OPENSERVER +# ifndef _REENTRANT +# define _REENTRANT +# endif +#endif + +#ifndef SOAP_FMAC1 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC1 +#endif + +#ifndef SOAP_FMAC2 /* stdsoap2.h declaration macro */ +# define SOAP_FMAC2 +#endif + +#ifndef SOAP_FMAC3 /* (de)serializer declaration macro */ +# define SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC3S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC3S SOAP_FMAC3 +#endif + +#ifndef SOAP_FMAC4 /* (de)serializer declaration macro */ +# define SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC4S /* string converter for (de)serializer declaration macro */ +# define SOAP_FMAC4S SOAP_FMAC4 +#endif + +#ifndef SOAP_FMAC5 /* stub/skeleton declaration macro */ +# define SOAP_FMAC5 +#endif + +#ifndef SOAP_FMAC6 /* stub/skeleton declaration macro */ +# define SOAP_FMAC6 +#endif + +#ifndef SOAP_CMAC /* class declaration macro */ +# define SOAP_CMAC +#endif + +#ifndef SOAP_NMAC /* namespace table declaration macro */ +# define SOAP_NMAC +#endif + +#ifndef SOAP_SOURCE_STAMP +# define SOAP_SOURCE_STAMP(str) +#endif + +/* gSOAP 2.7.4 and higher: fast look-aside buffering is stable */ +#ifndef WITH_FAST +# define WITH_FAST +#endif + +#ifdef WITH_LEANER +# ifndef WITH_LEAN +# define WITH_LEAN +# endif +#endif + +#ifdef WITH_LEAN +# ifdef WITH_COOKIES +# error "Cannot build WITH_LEAN code WITH_COOKIES enabled" +# endif +#endif + +#ifndef STDSOAP_H +#define STDSOAP_H + +#if defined(__vxworks) || defined(__VXWORKS__) +# define VXWORKS +#endif + +#ifdef _WIN32 +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef _WIN32_WCE +# ifndef UNDER_CE +# define UNDER_CE _WIN32_WCE +# endif +#endif + +#ifdef UNDER_CE +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#ifdef __BORLANDC__ +# ifdef __WIN32__ +# ifndef WIN32 +# define WIN32 +# endif +# endif +#endif + +#ifdef __CYGWIN__ +# ifndef CYGWIN +# define CYGWIN +# endif +#endif + +#ifdef __SYMBIAN32__ +# define SYMBIAN +# undef WIN32 +#endif + +#if defined(__palmos__) || defined(PALM_GCC) || defined(__PALMOS_TRAPS__) +# ifndef PALM +# define PALM +# endif +#endif + +#if defined(__hpux) +# ifndef HP_UX +# define HP_UX +# endif +#endif + +#if defined(__digital__) && defined(__unix__) +# ifndef TRU64 +# define TRU64 +# endif +#endif + +#ifdef __MVS__ +# ifndef OS390 +# define OS390 +# endif +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +# if defined(WITH_OPENSSL) +# ifndef HAVE_OPENSSL_SSL_H +# undef WITH_OPENSSL +# endif +# endif +# if defined(WITH_ZLIB) || defined(WITH_GZIP) +# ifndef HAVE_ZLIB_H +# undef WITH_ZLIB +# undef WITH_GZIP +# endif +# endif +#else +# if defined(UNDER_CE) +# define WITH_LEAN +# define HAVE_SSCANF +# elif defined(WIN32) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%I64d" +# define SOAP_ULONG_FORMAT "%I64u" +# elif defined(CYGWIN) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__APPLE__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOD_L +# define HAVE_SSCANF_L +# define HAVE_SPRINTF_L +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(_AIX43) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(_AIX41) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(HP_UX) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(FREEBSD) || defined(__FreeBSD__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOD_L +# define HAVE_SSCANF_L +# define HAVE_SPRINTF_L +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_GETTIMEOFDAY +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%qd" +# define SOAP_ULONG_FORMAT "%qu" +# elif defined(__VMS) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__GLIBC__) || defined(__GNU__) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOD_L +# define HAVE_SSCANF_L +# define HAVE_SPRINTF_L +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_STRTOLL +# define HAVE_STRTOULL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_TIMEGM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define HAVE_ISNAN +# elif defined(TRU64) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_GETTIMEOFDAY +# define HAVE_SYS_TIMEB_H +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define __USE_STD_IOSTREAM +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define SOAP_LONG_FORMAT "%ld" +# define SOAP_ULONG_FORMAT "%lu" +# elif defined(MAC_CARBON) +# define WITH_NOIO +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOD_L +# define HAVE_SSCANF_L +# define HAVE_SPRINTF_L +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(PALM) +# define WITH_LEAN +# define HAVE_STRTOD /* strtod() is defined in palmFunctions.h */ +# include /* Needs to be included before unix headers */ +# include +# define IGNORE_STDIO_STUBS +# include +# define O_NONBLOCK FNONBIO +# include +# include "palmFunctions.h" +# elif defined(SYMBIAN) +# define WITH_LEAN +# define WITH_NONAMESPACES +# define HAVE_STRTOD /* use STRTOD since sscanf doesn't seem to work */ +# include +# include +# elif defined(VXWORKS) +# ifdef _WRS_KERNEL +# define _POSIX_THREADS 1 +# endif +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_GMTIME +# define HAVE_LOCALTIME +# define HAVE_MKTIME +# elif defined(OS390) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(AS400) +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# elif defined(__QNX__) || defined(QNX) +/* QNX does not have a working version of strtof */ +# undef HAVE_STRTOF +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# define LONG64 long +# define ULONG64 unsigned LONG64 +# define SOAP_LONG_FORMAT "%ld" +# define SOAP_ULONG_FORMAT "%lu" +# else +/* Default asumptions on supported functions */ +# define HAVE_STRRCHR +# define HAVE_STRTOD +# define HAVE_SSCANF +# define HAVE_STRTOL +# define HAVE_STRTOUL +# define HAVE_SYS_TIMEB_H +# define HAVE_FTIME +# define HAVE_RAND_R +# define HAVE_GETHOSTBYNAME_R +# define HAVE_GMTIME_R +# define HAVE_LOCALTIME_R +# define HAVE_WCTOMB +# define HAVE_MBTOWC +# endif +#endif + +/* native Win and HP-UX compilers don't like empty structs */ +#if defined(WIN32) || defined(HP_UX) +# define WITH_NOEMPTYSTRUCT +#endif + +#ifdef HP_UX +# undef HAVE_STRTOLL +# undef HAVE_STRTOULL +#endif + +#ifdef WITH_C_LOCALE +# include +#else +# undef HAVE_STRTOF_L +# undef HAVE_STRTOD_L +# undef HAVE_SSCANF_L +# undef HAVE_SPRINTF_L +#endif + +#ifndef WITH_NOSTDLIB +# include +# ifndef PALM +# include +# include +# endif +# include +# include +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) +# include +# include +#endif + +#ifdef WITH_NOHTTP +# ifndef WITH_NOIO +# define WITH_NOIO +# undef WITH_COOKIES +# endif +#endif + +/* Suggestion when SOAP_FD_EXCEEDED error occurs: + Some systems allow increasing FD_SETSIZE before including sys/types.h: +#define FD_SETSIZE (2048) +*/ + +#ifndef UNDER_CE +# ifndef PALM +# ifndef WITH_NOIO +# include +# include +# endif +# ifndef WITH_LEAN +# ifdef HAVE_SYS_TIMEB_H +# include /* for ftime() */ +# endif +# include +# endif +# endif +#endif + +#ifdef OPENSERVER +# include +# include +# include + extern int h_errno; +#endif + +#ifndef WITH_NOIO +# ifndef WIN32 +# ifndef PALM +# include +# ifdef VXWORKS +# include +# include +# ifndef _WRS_KERNEL +# include +# endif +# else +# ifndef SYMBIAN +# include +# endif +# endif +# ifdef SUN_OS +# include /* SUN */ +# include /* SUN < 2.8 (?) */ +# endif +# ifdef VXWORKS +# ifdef _WRS_KERNEL +# include +# endif +# else +# include +# endif +# include +# ifdef OS390 +# include +# else +# include /* TCP_NODELAY */ +# endif +# include +# endif +# endif +#endif + +#ifdef WIN32 +# define SOAP_WINSOCKINT int +#else +# define SOAP_WINSOCKINT size_t +#endif + +#ifdef WIN32 +# ifndef UNDER_CE +# include +# include +# endif +# ifdef WITH_IPV6 +# include /* Visual Studio 2005 users: you must install the Platform SDK (R2) */ +# include +# include +# define SOAP_GAI_STRERROR gai_strerrorA +# else +# include /* Visual Studio 2005 users: you must install the Platform SDK (R2) */ +/* # include */ /* Alternative: use winsock2 (not available with eVC) */ +# endif +#else +# ifdef VXWORKS +# include +# include +# include +# endif +# ifndef WITH_NOIO +# ifndef PALM +# include +# include +# include +# include +# ifdef _AIX41 +# include +# endif +# endif +# endif +#endif + +#ifdef WITH_FASTCGI +# include +#endif + +#ifdef WITH_OPENSSL +# define OPENSSL_NO_KRB5 +# include +# include +# include +# include +# include +# ifndef ALLOW_OLD_VERSIONS +# if (OPENSSL_VERSION_NUMBER < 0x00905100L) +# error "Must use OpenSSL 0.9.6 or later" +# endif +# endif +#endif + +#ifdef WITH_GZIP +# ifndef WITH_ZLIB +# define WITH_ZLIB +# endif +#endif + +#ifdef WITH_CASEINSENSITIVETAGS +# define SOAP_STRCMP soap_tag_cmp /* case insensitve XML element/attribute names */ +#else +# define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ +#endif + +#ifdef WITH_ZLIB +# include +#endif + +#ifndef WITH_NOSTDLIB +# ifndef PALM +# include /* for isnan() */ +# endif +#endif + +/* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and messages (in file TEST.log) */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Portability: define SOAP_SOCKLEN_T */ +#if defined(_AIX) +# if defined(_AIX43) +# define SOAP_SOCKLEN_T socklen_t +# else +# define SOAP_SOCKLEN_T int +# endif +#elif defined(SOCKLEN_T) +# define SOAP_SOCKLEN_T SOCKLEN_T +#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) || defined(OS390) +# define SOAP_SOCKLEN_T socklen_t +#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) +# define SOAP_SOCKLEN_T int +#else +# define SOAP_SOCKLEN_T size_t +#endif + +#ifndef SOAP_SOCKET +# ifdef WIN32 +# define SOAP_SOCKET SOCKET +# define soap_closesocket(n) closesocket(n) +# else +# define SOAP_SOCKET int +# define soap_closesocket(n) close(n) +# endif +#endif + +#define SOAP_INVALID_SOCKET ((SOAP_SOCKET)-1) +#define soap_valid_socket(n) ((n) != SOAP_INVALID_SOCKET) + +#ifndef SOAP_GAI_STRERROR +# define SOAP_GAI_STRERROR gai_strerror +#endif + +#ifndef FD_SETSIZE +# define FD_SETSIZE (1024) +#endif + +#if defined(SYMBIAN) +# define LONG64 long +# define ULONG64 unsigned LONG64 +#elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) +# ifndef LONG64 +# if defined(HAVE_STDINT_H) +# include +# define LONG64 int64_t +# define ULONG64 uint64_t +# elif defined(__GLIBC__) +# include +# if (__WORDSIZE == 64) +# define LONG64 int64_t +# define ULONG64 uint64_t +# ifndef SOAP_LONG_FORMAT +# define SOAP_LONG_FORMAT "%ld" +# endif +# ifndef SOAP_ULONG_FORMAT +# define SOAP_ULONG_FORMAT "%lu" +# endif +# else +# define LONG64 long long +# define ULONG64 unsigned LONG64 +# endif +# else +# define LONG64 long long +# define ULONG64 unsigned LONG64 +# endif +# endif +#elif defined(UNDER_CE) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#elif defined(__BORLANDC__) +# define LONG64 __int64 +# define ULONG64 unsigned LONG64 +#endif + +#ifndef SOAP_LONG_FORMAT +# define SOAP_LONG_FORMAT "%lld" /* printf format for 64 bit ints */ +#endif + +#ifndef SOAP_ULONG_FORMAT +# define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit ints */ +#endif + +#if defined(WIN32) && !defined(CYGWIN) +# define soap_int32 __int32 +#elif defined(SYMBIAN) +# define soap_int32 long +#elif defined(PALM) +# define soap_int32 Int32 +#elif defined(_AIX) +# if defined(_AIX43) +# define soap_int32 int32_t +# else +# define soap_int32 signed int +# endif +#else +# define soap_int32 int32_t +#endif + +#ifdef WIN32 +# define SOAP_ERANGE ERANGE +# define SOAP_EINTR WSAEINTR +# define SOAP_EAGAIN WSAEWOULDBLOCK +# define SOAP_EWOULDBLOCK WSAEWOULDBLOCK +# define SOAP_EINPROGRESS WSAEINPROGRESS +# define SOAP_EADDRINUSE WSAEADDRINUSE +#else +# define SOAP_ERANGE ERANGE +# define SOAP_EINTR EINTR +# define SOAP_EAGAIN EAGAIN +# define SOAP_EADDRINUSE EADDRINUSE +# ifdef SYMBIAN +# define SOAP_EWOULDBLOCK 9898 +# define SOAP_EINPROGRESS 9899 +# else +# define SOAP_EWOULDBLOCK EWOULDBLOCK +# define SOAP_EINPROGRESS EINPROGRESS +# endif +#endif + +#ifdef WIN32 +# ifdef UNDER_CE +# define soap_errno GetLastError() +# define soap_socket_errno(s) GetLastError() +# define soap_reset_errno SetLastError(0) +# else +# define soap_errno GetLastError() +# define soap_socket_errno(s) WSAGetLastError() +# define soap_reset_errno SetLastError(0) +# endif +#else +# ifndef WITH_NOIO +# define soap_errno errno +# define soap_socket_errno(s) errno +# define soap_reset_errno (errno = 0) +# else +# define soap_errno 0 +# define soap_socket_errno(s) 0 +# define soap_reset_errno +# endif +#endif + +#ifndef SOAP_BUFLEN +# ifndef WITH_LEAN +# define SOAP_BUFLEN (65536) /* buffer length for socket packets, also used by gethostbyname_r and UDP messages, so don't make this too small */ +# else +# define SOAP_BUFLEN (2048) +# endif +#endif +#ifndef SOAP_LABLEN +# define SOAP_LABLEN (256) /* initial look-aside buffer length */ +#endif +#ifndef SOAP_PTRBLK +# define SOAP_PTRBLK (32) /* block allocation for pointer hash table chains */ +#endif +#ifndef SOAP_PTRHASH +# ifndef WITH_LEAN +# define SOAP_PTRHASH (1024) /* size of pointer analysis hash table (must be power of 2) */ +# else +# define SOAP_PTRHASH (32) +# endif +#endif +#ifndef SOAP_IDHASH +# ifndef WITH_LEAN +# define SOAP_IDHASH (1999) /* prime size of hash table for parsed id/ref */ +# else +# define SOAP_IDHASH (19) /* 19, 199 */ +# endif +#endif +#ifndef SOAP_BLKLEN +# ifndef WITH_LEAN +# define SOAP_BLKLEN (256) /* size of blocks to collect long strings and XML attributes */ +# else +# define SOAP_BLKLEN (32) +# endif +#endif +#ifndef SOAP_TAGLEN +# ifndef WITH_LEAN +# define SOAP_TAGLEN (1024) /* maximum length of XML element tag/attribute name or host/path name + 1 */ +# else +# define SOAP_TAGLEN (64) +# endif +#endif +#ifndef SOAP_HDRLEN +# ifndef WITH_LEAN +# define SOAP_HDRLEN (8192) /* maximum length of HTTP header line (must be >4096 to read cookies) */ +# else +# define SOAP_HDRLEN (1024) +# endif +#endif +#ifndef SOAP_MAXDIMS +# ifndef WITH_LEAN +# define SOAP_MAXDIMS (16) /* maximum array dimensions (array nestings) must be less than 64 to protect soap->tmpbuf */ +# else +# define SOAP_MAXDIMS (4) +# endif +#endif + +#ifndef SOAP_MAXLOGS +# define SOAP_MAXLOGS (3) /* max number of debug logs per struct soap environment */ +# define SOAP_INDEX_RECV (0) +# define SOAP_INDEX_SENT (1) +# define SOAP_INDEX_TEST (2) +#endif + +/* Max iterations in soap_serve() to keep server connection alive */ +#ifndef SOAP_MAXKEEPALIVE +# define SOAP_MAXKEEPALIVE (100) +#endif + +/* Trusted max size of inbound SOAP array for compound array allocation. + Increase if necessary to allow larger arrays. +*/ +#ifndef SOAP_MAXARRAYSIZE +# define SOAP_MAXARRAYSIZE (1000000) +#endif + +#ifdef VXWORKS +# ifdef __INCmathh +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) isNan(num) +# endif +#endif + +#ifdef WIN32 +# include +# ifndef HAVE_ISNAN +# define HAVE_ISNAN +# endif +# define soap_isnan(num) _isnan(num) +#endif + +#ifdef SUN_OS +# define HAVE_ISNAN +#endif + +#ifdef __APPLE__ +# ifdef __cplusplus +# ifndef isnan +extern "C" int isnan(double); +# endif +# endif +# define HAVE_ISNAN +#endif + +#if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) +# define HAVE_ISNAN +#endif + +extern const struct soap_double_nan { unsigned int n1, n2; } soap_double_nan; + +#ifdef VXWORKS +# ifndef FLT_MAX +# define FLT_MAX _ARCH_FLT_MAX +# endif +# ifndef DBL_MAX +# define DBL_MAX _ARCH_DBL_MAX +# endif +#endif + +#ifndef FLT_NAN +# define FLT_NAN (*(float*)(void*)&soap_double_nan) +#endif + +#ifndef FLT_PINFTY +# if defined(FLT_MAX) +# define FLT_PINFTY FLT_MAX +# elif defined(HUGE_VALF) +# define FLT_PINFTY (float)HUGE_VALF +# elif defined(HUGE_VAL) +# define FLT_PINFTY (float)HUGE_VAL +# elif defined(FLOAT_MAX) +# define FLT_PINFTY FLOAT_MAX +# else +# define FLT_PINFTY (3.40282347e+38F) +# endif +#endif + +#ifndef FLT_NINFTY +# define FLT_NINFTY (-FLT_PINFTY) +#endif + +#ifndef DBL_NAN +# define DBL_NAN (*(double*)(void*)&soap_double_nan) +#endif + +#ifndef DBL_PINFTY +# if defined(DBL_MAX) +# define DBL_PINFTY DBL_MAX +# elif defined(HUGE_VALF) +# define DBL_PINFTY (double)HUGE_VALF +# elif defined(HUGE_VAL) +# define DBL_PINFTY (double)HUGE_VAL +# elif defined(DOUBLE_MAX) +# define DBL_PINFTY DOUBLE_MAX +# else +# define DBL_PINFTY (1.7976931348623157e+308) +# endif +#endif + +#ifndef DBL_NINFTY +# define DBL_NINFTY (-DBL_PINFTY) +#endif + +#ifndef soap_isnan +# ifdef HAVE_ISNAN +# define soap_isnan(n) isnan(n) +# else +# define soap_isnan(n) (0) +# endif +#endif + +#define soap_ispinfd(n) ((n) >= DBL_PINFTY) +#define soap_ispinff(n) ((n) >= FLT_PINFTY) +#define soap_isninfd(n) ((n) <= DBL_NINFTY) +#define soap_isninff(n) ((n) <= FLT_NINFTY) + +/* gSOAP error codes */ + +#define SOAP_EOF EOF +#define SOAP_ERR EOF +#define SOAP_OK 0 +#define SOAP_CLI_FAULT 1 +#define SOAP_SVR_FAULT 2 +#define SOAP_TAG_MISMATCH 3 +#define SOAP_TYPE 4 +#define SOAP_SYNTAX_ERROR 5 +#define SOAP_NO_TAG 6 +#define SOAP_IOB 7 +#define SOAP_MUSTUNDERSTAND 8 +#define SOAP_NAMESPACE 9 +#define SOAP_USER_ERROR 10 +#define SOAP_FATAL_ERROR 11 +#define SOAP_FAULT 12 +#define SOAP_NO_METHOD 13 +#define SOAP_NO_DATA 14 +#define SOAP_GET_METHOD 15 +#define SOAP_PUT_METHOD 16 +#define SOAP_DEL_METHOD 17 +#define SOAP_HEAD_METHOD 18 +#define SOAP_HTTP_METHOD 19 +#define SOAP_EOM 20 +#define SOAP_MOE 21 +#define SOAP_HDR 22 +#define SOAP_NULL 23 +#define SOAP_DUPLICATE_ID 24 +#define SOAP_MISSING_ID 25 +#define SOAP_HREF 26 +#define SOAP_UDP_ERROR 27 +#define SOAP_TCP_ERROR 28 +#define SOAP_HTTP_ERROR 29 +#define SOAP_SSL_ERROR 30 +#define SOAP_ZLIB_ERROR 31 +#define SOAP_DIME_ERROR 32 +#define SOAP_DIME_HREF 33 +#define SOAP_DIME_MISMATCH 34 +#define SOAP_DIME_END 35 +#define SOAP_MIME_ERROR 36 +#define SOAP_MIME_HREF 37 +#define SOAP_MIME_END 38 +#define SOAP_VERSIONMISMATCH 39 +#define SOAP_PLUGIN_ERROR 40 +#define SOAP_DATAENCODINGUNKNOWN 41 +#define SOAP_REQUIRED 42 +#define SOAP_PROHIBITED 43 +#define SOAP_OCCURS 44 +#define SOAP_LENGTH 45 +#define SOAP_FD_EXCEEDED 46 + +#define soap_xml_error_check(e) ((e) == SOAP_TAG_MISMATCH || (e) == SOAP_NO_TAG || (e) == SOAP_SYNTAX_ERROR || (e) == SOAP_NAMESPACE || (e) == SOAP_DUPLICATE_ID || (e) == SOAP_MISSING_ID || (e) == SOAP_REQUIRED || (e) == SOAP_PROHIBITED || (e) == SOAP_OCCURS || (e) == SOAP_LENGTH || (e) == SOAP_NULL || (e) == SOAP_HREF) +#define soap_soap_error_check(e) ((e) == SOAP_CLI_FAULT || (e) == SOAP_SVR_FAULT || (e) == SOAP_VERSIONMISMATCH || (e) == SOAP_MUSTUNDERSTAND || (e) == SOAP_FAULT || (e) == SOAP_NO_METHOD) +#define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) +#define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) +#define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) +#define soap_http_error_check(e) ((e) == SOAP_HTTP_ERROR || ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD)|| (e) == SOAP_NO_DATA || ((e) >= 100 && (e) < 600)) + +/* gSOAP HTTP response status codes 100 to 599 are reserved */ + +/* Codes 600 to 999 are user definable */ + +/* Exceptional gSOAP HTTP response status codes >= 1000 */ + +#define SOAP_STOP 1000 /* No HTTP response */ +#define SOAP_FORM 1001 /* Form request/response */ +#define SOAP_HTML 1002 /* Custom HTML response */ +#define SOAP_FILE 1003 /* Custom file-based response */ + +/* gSOAP HTTP method codes */ + +#define SOAP_POST 2000 +#define SOAP_GET 2001 + +/* gSOAP DIME */ + +#define SOAP_DIME_CF 0x01 +#define SOAP_DIME_ME 0x02 +#define SOAP_DIME_MB 0x04 +#define SOAP_DIME_VERSION 0x08 /* DIME version 1 */ +#define SOAP_DIME_MEDIA 0x10 +#define SOAP_DIME_ABSURI 0x20 + +/* gSOAP ZLIB */ + +#define SOAP_ZLIB_NONE 0x00 +#define SOAP_ZLIB_DEFLATE 0x01 +#define SOAP_ZLIB_INFLATE 0x02 +#define SOAP_ZLIB_GZIP 0x02 + +/* gSOAP transport, connection, and content encoding modes */ + +typedef soap_int32 soap_mode; + +#define SOAP_IO 0x00000003 /* IO mask */ +#define SOAP_IO_FLUSH 0x00000000 /* flush output immediately, no buffering */ +#define SOAP_IO_BUFFER 0x00000001 /* buffer output in packets of size SOAP_BUFLEN */ +#define SOAP_IO_STORE 0x00000002 /* store entire output to determine length for transport */ +#define SOAP_IO_CHUNK 0x00000003 /* use HTTP chunked transfer AND buffer packets */ + +#define SOAP_IO_UDP 0x00000004 /* TCP or UDP */ + +#define SOAP_IO_LENGTH 0x00000008 /* calc message length (internal) */ +#define SOAP_IO_KEEPALIVE 0x00000010 /* keep connection alive */ + +#define SOAP_ENC_LATIN 0x00000020 /* accept iso-8859-1 encoding */ +#define SOAP_ENC_XML 0x00000040 /* plain XML encoding, no HTTP header */ +#define SOAP_ENC_DIME 0x00000080 +#define SOAP_ENC_MIME 0x00000100 +#define SOAP_ENC_MTOM 0x00000200 +#define SOAP_ENC_ZLIB 0x00000400 +#define SOAP_ENC_SSL 0x00000800 + +#define SOAP_ENC 0x00000FFF /* IO and ENC mask */ + +#define SOAP_XML_STRICT 0x00001000 /* apply strict validation */ +#define SOAP_XML_INDENT 0x00002000 /* emit indented XML */ +#define SOAP_XML_CANONICAL 0x00004000 /* EXC C14N canonical XML */ +#define SOAP_XML_TREE 0x00008000 /* emit XML tree (no id/ref) */ +#define SOAP_XML_GRAPH 0x00010000 +#define SOAP_XML_NIL 0x00020000 +#define SOAP_XML_DOM 0x00040000 +#define SOAP_XML_SEC 0x00080000 /* reserved for WS security */ + +#define SOAP_C_NOIOB 0x00100000 /* don't fault on array index out of bounds (just ignore) */ +#define SOAP_C_UTFSTRING 0x00200000 /* (de)serialize strings with UTF8 content */ +#define SOAP_C_MBSTRING 0x00400000 /* (de)serialize strings with multi-byte content */ +#define SOAP_C_NILSTRING 0x00800000 /* serialize empty strings as nil (omitted) */ + +#define SOAP_DOM_TREE 0x01000000 +#define SOAP_DOM_NODE 0x02000000 +#define SOAP_DOM_ASIS 0x04000000 + +#define SOAP_MIME_POSTCHECK 0x10000000 /* MIME flag (internal) */ + +#define SOAP_IO_DEFAULT SOAP_IO_FLUSH + +/* SSL client/server authentication settings */ + +#define SOAP_SSL_NO_AUTHENTICATION 0x00 /* for testing purposes */ +#define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION 0x01 /* client requires server to authenticate */ +#define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 0x02 /* server requires client to authenticate */ +#define SOAP_SSL_SKIP_HOST_CHECK 0x04 /* client does not check the common name of the host in certificate */ +#define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE 0x08 /* client does not check the expiration date of the host certificate */ +#define SOAP_SSL_NO_DEFAULT_CA_PATH 0x10 /* don't use default_verify_paths */ +#define SOAP_SSL_RSA 0x20 /* use RSA */ +#define SOAP_SSLv3 0x40 /* SSL v3 only */ +#define SOAP_TLSv1 0x80 /* TLS v1 only */ +#define SOAP_SSLv3_TLSv1 0x00 /* SSL v3 and TLS v1 support by default */ + +#define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_SSLv3_TLSv1) + +/* state */ + +#define SOAP_NONE 0 +#define SOAP_INIT 1 +#define SOAP_COPY 2 + +#define soap_check_state(soap) (!(soap) || ((soap)->state != SOAP_INIT && (soap)->state != SOAP_COPY)) + +/* part */ + +#define SOAP_BEGIN 0 +#define SOAP_IN_ENVELOPE 2 +#define SOAP_IN_HEADER 3 +#define SOAP_END_HEADER 4 +#define SOAP_NO_BODY 5 +#define SOAP_IN_BODY 6 +#define SOAP_END_BODY 7 +#define SOAP_END_ENVELOPE 8 +#define SOAP_END 9 +#define SOAP_BEGIN_SECURITY 10 +#define SOAP_IN_SECURITY 11 +#define SOAP_END_SECURITY 12 + +/* DEBUG macros */ + +#ifndef WITH_LEAN +# ifdef DEBUG +# ifndef SOAP_DEBUG +# define SOAP_DEBUG +# endif +# ifndef SOAP_MEM_DEBUG +# define SOAP_MEM_DEBUG +# endif +# endif +#endif + +#ifdef SOAP_MEM_DEBUG +# ifndef SOAP_MALLOC +# define SOAP_MALLOC(soap, size) soap_track_malloc(soap, __FILE__, __LINE__, size) +# endif +# ifndef SOAP_FREE +# define SOAP_FREE(soap, ptr) soap_track_free(soap, __FILE__, __LINE__, ptr) +# endif +#endif + +#ifndef SOAP_MALLOC /* use libc malloc */ +# define SOAP_MALLOC(soap, size) malloc(size) +#endif + +#ifndef SOAP_FREE /* use libc free */ +# define SOAP_FREE(soap, ptr) free(ptr) +#endif + +#ifdef SOAP_DEBUG +# ifndef SOAP_MESSAGE +# define SOAP_MESSAGE fprintf +# endif +# ifndef DBGLOG +# define DBGLOG(DBGFILE, CMD) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { FILE *fdebug = soap->fdebug[SOAP_INDEX_##DBGFILE];\ + CMD;\ + fflush(fdebug);\ + }\ + }\ +} +# endif +# ifndef DBGMSG +# define DBGMSG(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile((struct soap*)soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { fwrite((MSG), 1, (LEN), soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +# ifndef DBGFUN +# define DBGFUN(FNAME) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s()\n", __FILE__, __LINE__, FNAME)) +# define DBGFUN1(FNAME, FMT, ARG) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT")\n", __FILE__, __LINE__, FNAME, (ARG))) +# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2))) +# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s("FMT1", "FMT2", "FMT3")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3))) +# endif +# ifndef DBGHEX +# define DBGHEX(DBGFILE, MSG, LEN) \ +{ if (soap)\ + { if (!soap->fdebug[SOAP_INDEX_##DBGFILE])\ + soap_open_logfile(soap, SOAP_INDEX_##DBGFILE);\ + if (soap->fdebug[SOAP_INDEX_##DBGFILE])\ + { int i; char *s;\ + for (s = (char*)(MSG), i = (LEN); i; i--)\ + fprintf(soap->fdebug[SOAP_INDEX_##DBGFILE], "%2.2X ", (int)*s++&0xFF);\ + fflush(soap->fdebug[SOAP_INDEX_##DBGFILE]);\ + }\ + }\ +} +# endif +#else +# define DBGLOG(DBGFILE, CMD) +# define DBGMSG(DBGFILE, MSG, LEN) +# define DBGFUN(FNAME) +# define DBGFUN1(FNAME, FMT, ARG) +# define DBGFUN2(FNAME, FMT1, ARG1, FMT2, ARG2) +# define DBGFUN3(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3) +# define DBGHEX(DBGFILE, MSG, LEN) +#endif + +/* UCS-4 requires 32 bits (0-7FFFFFFF, the sign bit is used by gSOAP to distinguish XML entities) */ +typedef soap_int32 soap_wchar; + +/* namespace table row */ +struct Namespace +{ const char *id; + const char *ns; + const char *in; + char *out; +}; + +/* namespace stack */ +struct soap_nlist +{ struct soap_nlist *next; + unsigned int level; /* nesting depth level */ + short index; /* corresponding entry in ns mapping table */ + char *ns; /* only set when parsed ns URI is not in the ns mapping table */ + char id[1]; /* the actual string value flows into the allocated region below this struct */ +}; + +/* block stack for nested block allocations */ +struct soap_blist +{ struct soap_blist *next; + char *ptr; + size_t size; +}; + +/* array layout */ +struct soap_array +{ void *__ptr; + int __size; +}; + +/* pointer serialization management */ +struct soap_plist +{ struct soap_plist *next; + const void *ptr; + const struct soap_array *array; + int type; + int id; + char mark1; + char mark2; +}; + +/* block allocation for pointer serialization management */ +struct soap_pblk +{ struct soap_pblk *next; + struct soap_plist plist[SOAP_PTRBLK]; +}; + +#ifdef SOAP_MEM_DEBUG +/* malloc/free tracking for debugging */ +struct soap_mlist +{ struct soap_mlist *next; + const void *ptr; + const char *file; + int line; + short live; +}; +#endif + +/* class allocation list */ +struct soap_clist +{ struct soap_clist *next; + void *ptr; + int type; + int size; + int (*fdelete)(struct soap_clist*); +}; + +/* attributes */ +struct soap_attribute +{ struct soap_attribute *next; + char *value; + size_t size; + char *ns; + short visible; + char name[1]; /* the actual name string flows into the allocated region below this struct */ +}; + +#ifndef WITH_LEAN +struct soap_cookie +{ struct soap_cookie *next; + char *name; + char *value; + char *domain; + char *path; + time_t expire; /* client-side: local time to expire */ + long maxage; /* server-side: seconds to expire */ + unsigned int version; + short secure; + short session; /* server-side */ + short env; /* server-side: got cookie from client and should not be (re)send */ + short modified; /* server-side: client cookie was modified and should be send */ +}; +#endif + +#ifdef __cplusplus +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); + +class soap_multipart_iterator +{ public: + struct soap_multipart *content; + bool operator==(const soap_multipart_iterator& iter) const + { return (bool)(content == iter.content); } + bool operator!=(const soap_multipart_iterator& iter) const + { return (bool)(content != iter.content); } + struct soap_multipart &operator*() const + { return *content; } + soap_multipart_iterator &operator++() + { content = soap_next_multipart(content); return *this; } + soap_multipart_iterator() : content(NULL) + { } + soap_multipart_iterator(struct soap_multipart *p) : content(p) + { } +}; +#endif + +#ifndef WITH_LEANER +struct soap_dime +{ size_t count; + size_t size; + size_t chunksize; + size_t buflen; + char flags; + char *ptr; + const char *id; + const char *type; + const char *options; + struct soap_multipart *list; /* list of DIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +struct soap_mime +{ char *boundary; /* MIME boundary */ + const char *start; /* MIME start ID */ + struct soap_multipart *list; /* list of MIME attachments received */ + struct soap_multipart *first, *last; /* temporary in/out queue */ +#ifdef __cplusplus + soap_multipart_iterator begin() + { soap_multipart_iterator iter(list); return iter; }; + soap_multipart_iterator end() + { soap_multipart_iterator iter(NULL); return iter; }; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* RFC2045 MIME content transfer encodings */ +enum soap_mime_encoding +{ SOAP_MIME_NONE, + SOAP_MIME_7BIT, + SOAP_MIME_8BIT, + SOAP_MIME_BINARY, + SOAP_MIME_QUOTED_PRINTABLE, + SOAP_MIME_BASE64, + SOAP_MIME_IETF_TOKEN, + SOAP_MIME_X_TOKEN +}; +#endif + +#ifndef WITH_LEANER +/* DIME/MIME multipart list */ +struct soap_multipart +{ struct soap_multipart *next; + char *ptr; /* points to raw data content */ + size_t size; /* size of data content */ + const char *id; /* DIME/MIME content ID or form data name */ + const char *type; /* DIME/MIME type (MIME type format) */ + const char *options; /* DIME options */ + enum soap_mime_encoding encoding; /* MIME Content-Transfer-Encoding */ + const char *location; /* MIME Content-Location (optional) */ + const char *description; /* MIME Content-Description (optional) */ +#ifdef __cplusplus + typedef soap_multipart_iterator iterator; +#endif +}; +#endif + +#ifndef WITH_LEANER +/* attachment DIME and MTOM XOP forwarding */ +struct soap_xlist +{ struct soap_xlist *next; + unsigned char **ptr; + int *size; + char *id; + char **type; + char **options; +}; +#endif + +/******************************************************************************/ + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_attribute_iterator +{ public: + struct soap_dom_attribute *att; + const char *nstr; + const char *name; + bool operator==(const soap_dom_attribute_iterator&) const; + bool operator!=(const soap_dom_attribute_iterator&) const; + struct soap_dom_attribute &operator*() const; + soap_dom_attribute_iterator &operator++(); + soap_dom_attribute_iterator(); + soap_dom_attribute_iterator(struct soap_dom_attribute*); + ~soap_dom_attribute_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_attribute +{ struct soap_dom_attribute *next; + const char *nstr; + char *name; + char *data; + wchar_t *wide; + struct soap *soap; +#ifdef __cplusplus + typedef soap_dom_attribute_iterator iterator; + struct soap_dom_attribute &set(const char *nstr, const char *name); /* set namespace and name */ + struct soap_dom_attribute &set(const char *data); /* set data */ + soap_dom_attribute_iterator begin(); + soap_dom_attribute_iterator end(); + soap_dom_attribute_iterator find(const char *nstr, const char *name); + void unlink(); + soap_dom_attribute(); + soap_dom_attribute(struct soap *soap); + soap_dom_attribute(struct soap *soap, const char *nstr, const char *name, const char *data); + ~soap_dom_attribute(); +#endif +}; +#endif + +#ifndef WITH_LEANER +#ifdef __cplusplus +class soap_dom_element_iterator +{ public: + struct soap_dom_element *elt; + const char *nstr; + const char *name; + int type; + bool operator==(const soap_dom_element_iterator&) const; + bool operator!=(const soap_dom_element_iterator&) const; + struct soap_dom_element &operator*() const; + soap_dom_element_iterator &operator++(); + soap_dom_element_iterator(); + soap_dom_element_iterator(struct soap_dom_element*); + ~soap_dom_element_iterator(); +}; +#endif +#endif + +#ifndef WITH_LEANER +struct soap_dom_element +{ struct soap_dom_element *next; /* next sibling */ + struct soap_dom_element *prnt; /* parent */ + struct soap_dom_element *elts; /* list of child elements */ + struct soap_dom_attribute *atts; /* list of attributes */ + const char *nstr; /* namespace string */ + char *name; /* element tag name */ + char *data; /* element content data (with SOAP_C_UTFSTRING flag set) */ + wchar_t *wide; /* element content data */ + int type; /* optional: serialized C/C++ data type */ + void *node; /* optional: pointer to serialized C/C++ data */ + char *head; /* leading whitespace to start tag */ + char *tail; /* leading whitespace to end tag */ + struct soap *soap; /* soap context that manages this node */ +#ifdef __cplusplus + typedef soap_dom_element_iterator iterator; + struct soap_dom_element &set(const char *nstr, const char *name); + struct soap_dom_element &set(const char *data); + struct soap_dom_element &set(void *node, int type); + struct soap_dom_element &add(struct soap_dom_element*); + struct soap_dom_element &add(struct soap_dom_element&); + struct soap_dom_element &add(struct soap_dom_attribute*); + struct soap_dom_element &add(struct soap_dom_attribute&); + soap_dom_element_iterator begin(); + soap_dom_element_iterator end(); + soap_dom_element_iterator find(const char *nstr, const char *name); + soap_dom_element_iterator find(int type); + void unlink(); + soap_dom_element(); + soap_dom_element(struct soap *soap); + soap_dom_element(struct soap *soap, const char *nstr, const char *name); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, const char *data); + soap_dom_element(struct soap *soap, const char *nstr, const char *name, void *node, int type); + ~soap_dom_element(); +#endif +}; +SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(struct soap_dom_element *elt); +SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(struct soap_dom_attribute *att); +#endif + +#if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) +} +extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); +extern std::istream &operator>>(std::istream&, struct soap_dom_element&); +extern "C" { +#endif + +/******************************************************************************/ + +#ifdef WIN32 +# ifdef SOAP_STD_EXPORTS +# define SOAP_STD_API __declspec(dllexport) +# else +# define SOAP_STD_API +# endif +#else +# define SOAP_STD_API +#endif + +struct SOAP_STD_API soap +{ short state; /* 0 = uninitialized, 1 = initialized, 2 = copy of another soap struct */ + short version; /* 1 = SOAP1.1 and 2 = SOAP1.2 (set automatically from namespace URI in nsmap table) */ + soap_mode mode; + soap_mode imode; + soap_mode omode; + const char *float_format; /* user-definable format string for floats (<1024 chars) */ + const char *double_format; /* user-definable format string for doubles (<1024 chars) */ + const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, gives socket recv timeout in seconds, < 0 in usec */ + int send_timeout; /* when > 0, gives socket send timeout in seconds, < 0 in usec */ + int connect_timeout; /* when > 0, gives socket connect() timeout in seconds, < 0 in usec */ + int accept_timeout; /* when > 0, gives socket accept() timeout in seconds, < 0 in usec */ + int socket_flags; /* socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ + int connect_flags; /* connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ + int bind_flags; /* bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ + int accept_flags; /* accept() SOL_SOCKET sockopt flags */ + unsigned short linger_time; /* linger time for SO_LINGER option */ + const struct Namespace *namespaces; /* Pointer to global namespace mapping table */ + struct Namespace *local_namespaces; /* Local namespace mapping table */ + struct soap_nlist *nlist; /* namespace stack */ + struct soap_blist *blist; /* block allocation stack */ + struct soap_clist *clist; /* class instance allocation list */ + void *alist; /* memory allocation (malloc) list */ + struct soap_ilist *iht[SOAP_IDHASH]; + struct soap_plist *pht[SOAP_PTRHASH]; + struct soap_pblk *pblk; /* plist block allocation */ + short pidx; /* plist block allocation */ + struct SOAP_ENV__Header *header; + struct SOAP_ENV__Fault *fault; + int idnum; + void *user; /* to pass user-defined data */ + struct soap_plugin *plugins; /* linked list of plug-in data */ + char *userid; /* HTTP Basic authorization userid */ + char *passwd; /* HTTP Basic authorization passwd */ + int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, size_t); + int (*fget)(struct soap*); + int (*fput)(struct soap*); + int (*fdel)(struct soap*); + int (*fhead)(struct soap*); + int (*fform)(struct soap*); + int (*fposthdr)(struct soap*, const char*, const char*); + int (*fresponse)(struct soap*, int, size_t); + int (*fparse)(struct soap*); + int (*fparsehdr)(struct soap*, const char*, const char*); + int (*fheader)(struct soap*); + int (*fresolve)(struct soap*, const char*, struct in_addr* inaddr); + int (*fconnect)(struct soap*, const char*, const char*, int); + int (*fdisconnect)(struct soap*); + int (*fclosesocket)(struct soap*, SOAP_SOCKET); + int (*fshutdownsocket)(struct soap*, SOAP_SOCKET, int); + SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); + SOAP_SOCKET (*faccept)(struct soap*, SOAP_SOCKET, struct sockaddr*, int *n); + int (*fclose)(struct soap*); + int (*fsend)(struct soap*, const char*, size_t); + size_t (*frecv)(struct soap*, char*, size_t); + int (*fpoll)(struct soap*); + void (*fseterror)(struct soap*, const char **c, const char **s); + int (*fignore)(struct soap*, const char*); + int (*fserveloop)(struct soap*); + void *(*fplugin)(struct soap*, const char*); + void *(*fmalloc)(struct soap*, size_t); +#ifndef WITH_LEANER + int (*fprepareinit)(struct soap*); + int (*fpreparesend)(struct soap*, const char*, size_t); + int (*fpreparerecv)(struct soap*, const char*, size_t); + int (*fpreparefinal)(struct soap*); + void *(*fdimereadopen)(struct soap*, void*, const char*, const char*, const char*); + void *(*fdimewriteopen)(struct soap*, const char*, const char*, const char*); + void (*fdimereadclose)(struct soap*, void*); + void (*fdimewriteclose)(struct soap*, void*); + size_t (*fdimeread)(struct soap*, void*, char*, size_t); + int (*fdimewrite)(struct soap*, void*, const char*, size_t); + void *(*fmimereadopen)(struct soap*, void*, const char*, const char*, const char*); + void *(*fmimewriteopen)(struct soap*, void*, const char*, const char*, const char*, enum soap_mime_encoding); + void (*fmimereadclose)(struct soap*, void*); + void (*fmimewriteclose)(struct soap*, void*); + size_t (*fmimeread)(struct soap*, void*, char*, size_t); + int (*fmimewrite)(struct soap*, void*, const char*, size_t); +#endif + SOAP_SOCKET master; + SOAP_SOCKET socket; +#if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) + std::ostream *os; + std::istream *is; +#else + void *os; /* preserve struct size */ + void *is; /* preserve struct size */ +#endif +#ifndef UNDER_CE + int sendfd; + int recvfd; +#else + FILE *sendfd; + FILE *recvfd; +#endif + size_t bufidx; /* index in soap.buf[] */ + size_t buflen; /* length of soap.buf[] content */ + soap_wchar ahead; /* parser lookahead */ + short cdata; /* CDATA parser state */ + short body; /* parsed XML element has a body or not */ + unsigned int level; /* XML nesting level */ + size_t count; /* message length counter */ + size_t length; /* message length as set by HTTP header */ + char *labbuf; /* look-aside buffer */ + size_t lablen; /* look-aside buffer allocated length */ + size_t labidx; /* look-aside buffer index to available part */ + char buf[SOAP_BUFLEN];/* send and receive buffer */ + char msgbuf[1024]; /* in/out buffer for HTTP/MIME headers >=1024 bytes */ + char tmpbuf[1024]; /* in/out buffer for HTTP/MIME headers, simpleType values, element and attribute tag names, and DIME must be >=1024 bytes */ + char tag[SOAP_TAGLEN]; + char id[SOAP_TAGLEN]; + char href[SOAP_TAGLEN]; + char type[SOAP_TAGLEN]; + char arrayType[SOAP_TAGLEN]; + char arraySize[SOAP_TAGLEN]; + char arrayOffset[SOAP_TAGLEN]; + short other; + short position; + int positions[SOAP_MAXDIMS]; + short root; + struct soap_attribute *attributes; /* attribute list */ + short encoding; /* when set, output encodingStyle */ + short mustUnderstand; /* a mustUnderstand element was parsed or is output */ + short null; /* parsed XML is xsi:nil */ + short ns; /* when not set, output full xmlns bindings */ + short part; /* parsing state */ + short alloced; + short peeked; + size_t chunksize; + size_t chunkbuflen; + char endpoint[SOAP_TAGLEN]; + char path[SOAP_TAGLEN]; + char host[SOAP_TAGLEN]; + char *action; + char *authrealm; /* HTTP authentication realm */ + char *prolog; /* XML declaration prolog */ + unsigned long ip; /* IP number */ + int port; /* port number */ + short keep_alive; /* connection should be kept open */ + short tcp_keep_alive; /* enable SO_KEEPALIVE */ + unsigned int tcp_keep_idle; /* set TCP_KEEPIDLE */ + unsigned int tcp_keep_intvl; /* set TCP_KEEPINTVL */ + unsigned int tcp_keep_cnt; /* set TCP_KEEPCNT */ + unsigned int max_keep_alive; /* maximum keep-alive session (default=100) */ + const char *proxy_http_version;/* HTTP version of proxy "1.0" or "1.1" */ + const char *proxy_host; /* Proxy Server host name */ + int proxy_port; /* Proxy Server port (default = 8080) */ + const char *proxy_userid; /* Proxy Authorization user name */ + const char *proxy_passwd; /* Proxy Authorization password */ + const char *proxy_from; /* X-Forwarding-For header returned by proxy */ + int status; /* -1 when request, else error code to be returned by server */ + int error; + int errmode; + int errnum; +#ifndef WITH_LEANER + struct soap_dom_element *dom; + struct soap_dime dime; + struct soap_mime mime; + struct soap_xlist *xlist; +#endif +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) + const char *logfile[SOAP_MAXLOGS]; + FILE *fdebug[SOAP_MAXLOGS]; + struct soap_mlist *mht[SOAP_PTRHASH]; +#endif +#ifndef WITH_LEAN + const char *c14ninclude; + const char *c14nexclude; + struct soap_cookie *cookies; + const char *cookie_domain; + const char *cookie_path; + int cookie_max; +#endif +#ifndef WITH_NOIO + int ipv6_multicast_if; /* always include this to keep the soap struct size the same in v4 and v6 */ + char* ipv4_multicast_if; /* always include this to keep the soap struct size the same in v4 and v6 */ + int ipv4_multicast_ttl; /* multicast scope */ +#ifdef WITH_IPV6 + struct sockaddr_storage peer; /* IPv6: set by soap_accept and by UDP recv */ +#else + struct sockaddr_in peer; /* IPv4: set by soap_connect/soap_accept and by UDP recv */ +#endif +#endif + size_t peerlen; +#ifdef WITH_OPENSSL + int (*fsslauth)(struct soap*); + int (*fsslverify)(int, X509_STORE_CTX*); + BIO *bio; + SSL *ssl; + SSL_CTX *ctx; + SSL_SESSION *session; +#else + void *fsslauth; /* dummy members, to preserve struct size */ + void *fsslverify; + void *bio; + void *ssl; + void *ctx; + void *session; +#endif + unsigned short ssl_flags; + const char *keyfile; + const char *password; + const char *dhfile; + const char *cafile; + const char *capath; + const char *crlfile; + const char *randfile; + char session_host[SOAP_TAGLEN]; + int session_port; +#ifdef WITH_C_LOCALE + locale_t c_locale; /* set to C locale by default */ +#else + void *c_locale; +#endif +#ifdef WITH_ZLIB + z_stream *d_stream; /* decompression stream */ + uLong z_crc; /* internal gzip crc */ +#else + void *d_stream; /* dummy members, to preserve struct size */ + soap_int32 z_crc; +#endif + short zlib_state; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_INFLATE */ + short zlib_in; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + short zlib_out; /* SOAP_ZLIB_NONE, SOAP_ZLIB_DEFLATE, or SOAP_ZLIB_GZIP */ + char *z_buf; /* buffer */ + size_t z_buflen; + unsigned short z_level; /* compression level to be used (0=none, 1=fast to 9=best) */ + float z_ratio_in; /* detected compression ratio compressed_length/length of inbound message */ + float z_ratio_out; /* detected compression ratio compressed_length/length of outbound message */ +#ifdef WMW_RPM_IO + void *rpmreqid; +#endif +#ifdef __cplusplus + soap(); + soap(soap_mode); + soap(soap_mode, soap_mode); + soap(struct soap&); + virtual ~soap(); +#else + void (*dummy)(); +#endif +}; + +struct soap_code_map +{ long code; + const char *string; +}; + +/* forwarding list */ +struct soap_flist +{ struct soap_flist *next; + int type; + void *ptr; + unsigned int level; + size_t len; + void (*fcopy)(struct soap*, int, int, void*, size_t, const void*, size_t); +}; + +/* id-ref forwarding list */ +struct soap_ilist +{ struct soap_ilist *next; + int type; + size_t size; + void *link; + void *copy; + struct soap_flist *flist; + void *ptr; + unsigned int level; + char id[1]; /* the actual id string value flows into the allocated region below this struct */ +}; + +struct soap_plugin +{ struct soap_plugin *next; + const char *id; + void *data; + int (*fcopy)(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); + void (*fdelete)(struct soap *soap, struct soap_plugin *p); /* should delete fields of plugin only and not free(p) */ +}; + +#ifndef WITH_NONAMESPACES +extern SOAP_NMAC struct Namespace namespaces[]; +#endif + +#ifndef WITH_LEAN +# define soap_get0(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx]) +# define soap_get1(soap) (((soap)->bufidx>=(soap)->buflen && soap_recv(soap)) ? EOF : (unsigned char)(soap)->buf[(soap)->bufidx++]) +#else +soap_wchar soap_get0(struct soap*); +soap_wchar soap_get1(struct soap*); +#endif + +#define soap_revget1(soap) ((soap)->bufidx--) +#define soap_unget(soap, c) ((soap)->ahead = c) +#define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) +#define soap_imode(soap, n) ((soap)->mode = (soap)->imode = (n)) +#define soap_set_imode(soap, n) ((soap)->imode |= (n)) +#define soap_clr_imode(soap, n) ((soap)->imode &= ~(n)) +#define soap_omode(soap, n) ((soap)->mode = (soap)->omode = (n)) +#define soap_set_omode(soap, n) ((soap)->omode |= (n)) +#define soap_clr_omode(soap, n) ((soap)->omode &= ~(n)) +#define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n)) +#define soap_clr_mode(soap, n) ((soap)->imode &= ~(n), (soap)->omode &= ~(n)) +#define soap_destroy(soap) soap_delete((soap), NULL) + +#ifdef HAVE_STRRCHR +# define soap_strrchr(s, t) strrchr(s, t) +#else + SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t); +#endif + +#ifdef HAVE_STRTOL +# define soap_strtol(s, t, b) strtol(s, t, b) +#else + SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b); +#endif + +#ifdef HAVE_STRTOUL +# define soap_strtoul(s, t, b) strtoul(s, t, b) +#else + SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b); +#endif + +#if defined(WITH_OPENSSL) +# define soap_random soap_rand() +SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); +#elif defined(HAVE_RANDOM) +# define soap_random (int)random() +#else +# define soap_random rand() +#endif + +#ifdef WITH_NOIDREF +# define soap_embedded(s, p, t) (0) +# define soap_id_lookup(s, i, p, t, n, k) (p) +# define soap_id_forward(s, h, p, len, st, tt, n, k, fc) (p) +# define soap_reference(s, a, t) (1) +# define soap_array_reference(s, p, a, n, t) (1) +# define soap_embed(s, p, a, n, t, pp) (0) +# define soap_embedded_id(s, i, p, t) (i) +# define soap_is_embedded(s, p) (0) +# define soap_is_single(s, p) (1) +# define soap_lookup_type(s, i) (0) +# define soap_getindependent(s) (0) +# define soap_putindependent(s) (0) +# define soap_getelement(s, n) (n) +# define soap_putelement(s, p, t, i, n) (0) +# define soap_markelement(s, p, n) (0) +#endif + +SOAP_FMAC1 void SOAP_FMAC2 soap_header(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_fault(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultsubcode(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultstring(struct soap*); +SOAP_FMAC1 const char** SOAP_FMAC2 soap_faultdetail(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializeheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putheader(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getheader(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_serializefault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putfault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getfault(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(); +SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap*, int, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_connect(struct soap*, const char*, const char*); +SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap*, const char*, int, int); +SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap*); +SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap*, unsigned short, const char*, const char*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, size_t count); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_header_attribute(struct soap*, const char*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char*, size_t, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_val(char*, size_t, const char*); + +SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap*); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_sender_fault_subcode(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_receiver_fault_subcode(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_sender_error(struct soap*, const char*, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_receiver_error(struct soap*, const char*, const char*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send2(struct soap*, const char*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_send3(struct soap*, const char*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); +SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap*, int*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap*, const unsigned char*, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap*, int*); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_xop_forward(struct soap*, unsigned char**, int*, char**, char**, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_dime_forward(struct soap*, unsigned char**, int*, char**, char**, char**); +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup_id(struct soap*, void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap*, const void *p, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const struct soap_array *a, int n, int t, struct soap_plist**); +SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_lookup(struct soap*, const char*); +SOAP_FMAC1 struct soap_ilist* SOAP_FMAC2 soap_enter(struct soap*, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_embedded(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap*, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap*, const void *p, const struct soap_array *a, int n, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap*, int id, const void *p, int t); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_embedded(struct soap*, struct soap_plist*); +SOAP_FMAC1 int SOAP_FMAC2 soap_is_single(struct soap*, struct soap_plist*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_embedded(struct soap*, struct soap_plist*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap*); + +SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); +SOAP_FMAC1 long SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); +SOAP_FMAC1 long SOAP_FMAC2 soap_code_bits(const struct soap_code_map*, const char*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap*, const struct soap_code_map*, long); + +SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap*, void*); +SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap*, void*, int, int, int (*fdelete)(struct soap_clist*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_unlink(struct soap*, const void*); +SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap*); + +SOAP_FMAC1 void* SOAP_FMAC2 soap_track_malloc(struct soap*, const char*, int, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_track_free(struct soap*, const char*, int, void*); + +#ifndef WITH_NOIDREF +SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap*, const char *id); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k); +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, 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)); +#endif +SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct 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*)); +SOAP_FMAC1 void SOAP_FMAC2 soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t, const void *q, size_t n); + +SOAP_FMAC1 int SOAP_FMAC2 soap_size(const int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsize(const char *, const char *, int *); +SOAP_FMAC1 int SOAP_FMAC2 soap_getsizes(const char *, int *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *, int *); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsize(struct soap*, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizesoffsets(struct soap*, const char *, const int *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putsizes(struct soap*, const char *, const int *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffset(struct soap*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_putoffsets(struct soap*, const int *, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); + +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new(void); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new1(soap_mode); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_new2(soap_mode, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap*); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy(const struct soap*); +SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_copy_context(struct soap*, const struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap*, struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_init1(struct soap*, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_init2(struct soap*, soap_mode, soap_mode); +SOAP_FMAC1 void SOAP_FMAC2 soap_done(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_cleanup(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_end(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap*, void*); + +#ifdef SOAP_DEBUG +SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap*, const char*); +SOAP_FMAC1 void SOAP_FMAC2 soap_close_logfiles(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_open_logfile(struct soap*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_value(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap*, const char*, const char *); +SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap*, const char*, int, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_out(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_array_begin_out(struct soap*, const char *tag, int id, const char *type, const char *offset); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap*, const char *tag, int id, int href); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_href(struct soap*, const char *tag, int id, const char *ref, const char *val); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap*, const char *tag, int id, const char *type); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const struct soap_array *a, int d, const char *type, int n); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_result(struct soap*, const char *tag); +SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap*, const char *tag); +SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_attribute(struct soap*, const char*, const char*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_begin_in(struct soap*, const char *tag, int nillable, const char *type); + +SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap*, const char *tag); + +SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_revert(struct soap*); + +SOAP_FMAC1 char* SOAP_FMAC2 soap_strdup(struct soap*, const char*); +SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrdup(struct soap*, const wchar_t*); +SOAP_FMAC1 const char * SOAP_FMAC2 soap_strsearch(const char *big, const char *little); + +SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap*, const char *s, int flag); +SOAP_FMAC1 char* SOAP_FMAC2 soap_string_in(struct soap*, int, long, long); + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap*, const wchar_t *s, int flag); +SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstring_in(struct soap*, int, long, long); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); + +SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap*, const struct Namespace*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap*); + +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace(struct soap *soap, const char *tag); + +SOAP_FMAC1 struct soap_nlist* SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n); + +SOAP_FMAC1 int SOAP_FMAC2 soap_store_lab(struct soap*, const char*, size_t); +SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap*, const char*, size_t); + +SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_new_block(struct soap*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); +SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap*, struct soap_blist*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_size_block(struct soap*, struct soap_blist*, size_t); +SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap*, struct soap_blist*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap*, struct soap_blist*); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap*, struct soap_blist*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap*, struct soap_blist*, char*, int); +SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap*, struct soap_blist*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); +SOAP_FMAC1 int soap_envelope_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap*, int); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap*, int status); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap*); + +SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap*); + +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault(struct soap*, FILE*); +SOAP_FMAC1 void SOAP_FMAC2 soap_print_fault_location(struct soap*, FILE*); +# ifndef WITH_LEAN +# ifdef __cplusplus +SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); +# endif +SOAP_FMAC1 char* SOAP_FMAC2 soap_sprint_fault(struct soap*, char*, size_t); +# endif +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap*, const char*, char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap*, const char*, short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap*, const char*, int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap*, const char*, long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap*, const char*, LONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap*, const char*, float*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap*, const char*, double*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap*, const char*, unsigned char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap*, const char*, unsigned short*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap*, const char*, unsigned int*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap*, const char*, unsigned long*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap*, const char*, ULONG64*); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2string(struct soap*, const char*, char**); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**); +SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap*, const unsigned char*, char*, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap*, const unsigned char*, char*, int); +#endif + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap*, char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap*, short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap*, int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap*, long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap*, LONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap*, float); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap*, double); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap*, unsigned char); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap*, unsigned short); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap*, unsigned int); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap*, unsigned long); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap*, ULONG64); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap*, const char*); + +#ifndef WITH_LEAN +SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_dateTime2s(struct soap*, time_t); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap*, const char*, char*, size_t, int*); +SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap*, const char*, char*, size_t, int*); +#endif + + +SOAP_FMAC1 int* SOAP_FMAC2 soap_inint(struct soap*, const char *tag, int *p, const char *, int); +SOAP_FMAC1 char* SOAP_FMAC2 soap_inbyte(struct soap*, const char *tag, char *p, const char *, int); +SOAP_FMAC1 long* SOAP_FMAC2 soap_inlong(struct soap*, const char *tag, long *p, const char *, int); +SOAP_FMAC1 LONG64* SOAP_FMAC2 soap_inLONG64(struct soap*, const char *tag, LONG64 *p, const char *, int); +SOAP_FMAC1 short* SOAP_FMAC2 soap_inshort(struct soap*, const char *tag, short *p, const char *, int); +SOAP_FMAC1 float* SOAP_FMAC2 soap_infloat(struct soap*, const char *tag, float *p, const char *, int); +SOAP_FMAC1 double* SOAP_FMAC2 soap_indouble(struct soap*, const char *tag, double *p, const char *, int); +SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_inunsignedByte(struct soap*, const char *tag, unsigned char *p, const char *, int); +SOAP_FMAC1 unsigned short* SOAP_FMAC2 soap_inunsignedShort(struct soap*, const char *tag, unsigned short *p, const char *, int); +SOAP_FMAC1 unsigned int* SOAP_FMAC2 soap_inunsignedInt(struct soap*, const char *tag, unsigned int *p, const char *, int); +SOAP_FMAC1 unsigned long* SOAP_FMAC2 soap_inunsignedLong(struct soap*, const char *tag, unsigned long *p, const char *, int); +SOAP_FMAC1 ULONG64* SOAP_FMAC2 soap_inULONG64(struct soap*, const char *tag, ULONG64 *p, const char *, int); +SOAP_FMAC1 char** SOAP_FMAC2 soap_instring(struct soap*, const char *tag, char **p, const char *, int, int, long, long); +SOAP_FMAC1 char** SOAP_FMAC2 soap_inliteral(struct soap*, const char *tag, char **p); + +#ifndef WITH_LEAN +SOAP_FMAC1 time_t* SOAP_FMAC2 soap_indateTime(struct soap*, const char *tag, time_t *p, const char *, int); +SOAP_FMAC1 time_t SOAP_FMAC2 soap_timegm(struct tm*); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwstring(struct soap*, const char *tag, wchar_t **p, const char *, int, long, long); +SOAP_FMAC1 wchar_t** SOAP_FMAC2 soap_inwliteral(struct soap*, const char *tag, wchar_t **p); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_outbyte(struct soap*, const char *tag, int id, const char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outshort(struct soap*, const char *tag, int id, const short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outint(struct soap*, const char *tag, int id, const int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outlong(struct soap*, const char *tag, int id, const long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outLONG64(struct soap*, const char *tag, int id, const LONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outfloat(struct soap*, const char *tag, int id, const float *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outdouble(struct soap*, const char *tag, int id, const double *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedByte(struct soap*, const char *tag, int id, const unsigned char *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedShort(struct soap*, const char *tag, int id, const unsigned short *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedInt(struct soap*, const char *tag, int id, const unsigned int *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outunsignedLong(struct soap*, const char *tag, int id, const unsigned long *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outULONG64(struct soap*, const char *tag, int id, const ULONG64 *p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outstring(struct soap*, const char *tag, int id, char *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap*, const char *tag, char *const*p, const char *type); + +#ifndef WITH_LEAN +SOAP_FMAC1 int SOAP_FMAC2 soap_outdateTime(struct soap*, const char *tag, int id, const time_t *p, const char *, int); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_outwstring(struct soap*, const char *tag, int id, wchar_t *const*p, const char *, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap*, const char *tag, wchar_t *const*p, const char *type); +#endif + +#ifndef WITH_LEANER +SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *, const char*, int, const void*, const struct soap_array*, const char*, const char*, const char*, int, const char*, int); +SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, long); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_tell(struct soap*); +SOAP_FMAC1 char* SOAP_FMAC2 soap_dime_option(struct soap*, unsigned short, const char*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putdime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmimehdr(struct soap*, struct soap_multipart*); +SOAP_FMAC1 int SOAP_FMAC2 soap_putmime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_set_mime(struct soap*, const char *boundary, const char *start); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_dime(struct soap*); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_mime(struct soap*); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap*, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap*, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description); +SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap); +SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap); +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_get_mime_attachment(struct soap *soap, void *handle); +SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); +SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); +#endif + +SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap*, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void*); +SOAP_FMAC1 void* SOAP_FMAC2 soap_lookup_plugin(struct soap*, const char*); + +SOAP_FMAC1 const char* SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag); +SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value); +SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); + +#ifdef WITH_COOKIES +SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); +SOAP_FMAC1 size_t SOAP_FMAC2 soap_encode_cookie(const char*, char*, size_t); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); +SOAP_FMAC1 extern int SOAP_FMAC2 soap_getenv_cookies(struct soap*); +SOAP_FMAC1 extern struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); +SOAP_FMAC1 extern void SOAP_FMAC2 soap_free_cookies(struct soap*); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/src/inc/threads.h b/src/inc/threads.h new file mode 100644 index 0000000..75cf067 --- /dev/null +++ b/src/inc/threads.h @@ -0,0 +1,123 @@ +/* + +threads.h + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#ifndef THREADS_H +#define THREADS_H + +#ifndef WIN32 +# include /* defines _POSIX_THREADS if pthreads are available */ +#else +# define ssize_t int +# include +# include +# include +# include +#endif + +#if defined(_POSIX_THREADS) || defined(_SC_THREADS) +# include +#endif + +/******************************************************************************\ + * + * Threads + * +\******************************************************************************/ + +#if defined(WIN32) +# define THREAD_TYPE HANDLE +# define THREAD_ID GetCurrentThreadId() +# define THREAD_CREATE(x,y,z) *(x) = (HANDLE)_beginthread((y), 8*4096, (z)) +# define THREAD_DETACH(x) +# define THREAD_JOIN(x) WaitForSingleObject((x), INFINITE) +# define THREAD_EXIT _endthread() +# define MUTEX_TYPE HANDLE +# define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL) +# define MUTEX_CLEANUP(x) CloseHandle(x) +# define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE) +# define MUTEX_UNLOCK(x) ReleaseMutex(x) +# define COND_SETUP(x) emulate_pthread_cond_init(&(x)) +# define COND_CLEANUP(x) emulate_pthread_cond_destroy(&(x)) +# define COND_SIGNAL(x) emulate_pthread_cond_signal(&(x)) +# define COND_WAIT(x,y) emulate_pthread_cond_wait(&(x), &(y)) +typedef struct +{ u_int waiters_count_; + CRITICAL_SECTION waiters_count_lock_; + HANDLE signal_event_; +} COND_TYPE; +#ifdef __cplusplus +extern "C" { +#endif +int emulate_pthread_cond_init(COND_TYPE*); +int emulate_pthread_cond_destroy(COND_TYPE*); +int emulate_pthread_cond_signal(COND_TYPE*); +int emulate_pthread_cond_wait(COND_TYPE*, MUTEX_TYPE*); +#ifdef __cplusplus +} +#endif +#elif defined(_POSIX_THREADS) || defined(_SC_THREADS) +# define THREAD_TYPE pthread_t +# define THREAD_ID pthread_self() +# define THREAD_CREATE(x,y,z) pthread_create((x), NULL, (y), (z)) +# define THREAD_DETACH(x) pthread_detach((x)) +# define THREAD_JOIN(x) pthread_join((x), NULL) +# define THREAD_EXIT pthread_exit(NULL) +# define MUTEX_TYPE pthread_mutex_t +# define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) +# define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) +# define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) +# define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) +# define COND_TYPE pthread_cond_t +# define COND_SETUP(x) pthread_cond_init(&(x), NULL) +# define COND_CLEANUP(x) pthread_cond_destroy(&(x)) +# define COND_SIGNAL(x) pthread_cond_signal(&(x)) +# define COND_WAIT(x,y) pthread_cond_wait(&(x), &(y)) +#else +# error "No POSIX threads detected: we need thread and mutex operations. See for example OpenSSL /threads/th-lock.c on how to implement mutex on your platform" +#endif + +#endif diff --git a/src/init/cwmpd.init b/src/init/cwmpd.init new file mode 100644 index 0000000..022cd4d --- /dev/null +++ b/src/init/cwmpd.init @@ -0,0 +1,123 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2012 Inteno + +START=99 +STOP=40 + +EXTRA_HELP=" start [GetRPCMethods] Start cwmpd service and send GetRPCMethods" + +wait_connection_acs() { + default_acs="http://192.168.1.1:8080/openacs/acs" + acs_dhcp_discovery=`uci -q get cwmp.acs.dhcp_discovery` + url=`uci -q get cwmp.acs.url` + if [ \( "_$acs_dhcp_discovery" = "_enable" \) -o \( "_$url" = "_" \) ];then + url=`uci -P /var/state -q get provisioning.iup.tr069url` + elif [ "_$url" != "_" ];then + url=`uci -q get cwmp.acs.url` + else + url=$default_acs + fi + + dest=`echo $url|sed 's/http:\/\///g'|cut -f1 -d \/|cut -f1 -d:` + port=`echo $url|sed 's/http:\/\///g'|cut -f1 -d \/|cut -f2 -d:` + + if [ "_$port" = "_" ];then + port=80 + fi + + i=0 + result=1 + until [ \( $result -eq 0 \) -o \( $i -eq 20 \) ];do + echo -e -n "" | nc $dest $port + result=$? + if [ $result -eq 1 ];then + i=`expr $i + 1` + sleep 5 + fi + done +} + +check_dhcp() { + i=0 + dhcp_discovery=`uci -q get cwmp.acs.dhcp_discovery` + url=`uci -q get cwmp.acs.url` + if [ \( "_$acs_dhcp_discovery" = "_enable" \) -o \( "_$url" = "_" \) ] + then + while [ $i -le 10 ] + do + acs_url=`uci -P /var/state -q get provisioning.iup.tr069url` + if [ "$acs_url" != "" ] + then + echo "The acs url discovery from dhcp server is successfully done." + break + else + echo "Waiting for discovery of acs url from dhcp server ..." + sleep 10 + fi + i=`expr $i + 1` + done + fi +} + +start_msg="Starting cwmpd ..." +stop_msg="Stopping cwmpd ..." + +check_iccu() { + echo $start_msg + check_dhcp + wait_connection_acs + iccu_url=`uci get -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_url` + iccu_change_state=`uci get -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_change_state` + if [ "_$1" = "_boot" ];then + opt=$opt"-b " + fi + if [ "_$1" = "_GetRPCMethods" ];then + opt=$opt"-g " + fi + if [ "$iccu_change_state" = "yes" ];then + opt=$opt"-c " + fi + [ -f /etc/config/cwmp ] && /usr/bin/cwmpd $opt & + rm -rf /etc/cwmpd/.iccu + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_url=$iccu_url + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_change_state=no +} + +boot() { + /etc/cwmpd/scripts/iccu_enable && rm /etc/cwmpd/scripts/iccu_enable + run=$(ps aux|grep /usr/bin/cwmpd|grep -v grep|grep -v rc.common) + if [ "$run" = "" ];then + check_iccu "boot" + else + echo "cwmpd is currently running ..." + fi +} + +start() { + run=$(ps aux|grep /usr/bin/cwmpd|grep -v grep|grep -v rc.common) + if [ "$run" = "" ] + then + if [ "$1" = "GetRPCMethods" ];then + check_iccu "GetRPCMethods" + else + check_iccu + fi + else + echo "cwmpd is currently running ..." + fi +} + +stop() { + echo $stop_msg + for pid in `ps aux|grep /usr/bin/cwmpd|sed 's/^ \+//g'|sed 's/ \+/:/g'|grep -v grep|cut -f1 -d:` + do + if [ "_$pid" != "_" ];then + /bin/kill -9 $pid 2> /dev/null + fi + done +} + +restart() { + stop + start +} diff --git a/src/init/iccu.init b/src/init/iccu.init new file mode 100644 index 0000000..7647726 --- /dev/null +++ b/src/init/iccu.init @@ -0,0 +1,124 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2012 Inteno + +START=98 +STOP=40 + +wait_connection_acs() { + i=0 + result=1 + until [ \( $result -eq 0 \) -o \( $i -eq 20 \) ];do + echo -e -n "" | nc $1 $2 + result=$? + if [ $result -eq 1 ];then + i=`expr $i + 1` + sleep 5 + fi + done +} + +check_connection_request_url() { + cpe_port=`uci get cwmp.cpe.port` + if [ "_$cpe_port" = "_" ];then + cpe_port=7547 + fi + default_acs="http://192.168.1.1:8080/openacs/acs" + acs_dhcp_discovery=`uci -q get cwmp.acs.dhcp_discovery` + url=`uci -q get cwmp.acs.url` + if [ \( "_$acs_dhcp_discovery" = "_enable" \) -o \( "_$url" = "_" \) ];then + url=`uci -P /var/state -q get provisioning.iup.tr069url` + elif [ "_$url" != "_" ];then + url=`uci -q get cwmp.acs.url` + else + url=$default_acs + fi + + dest=`echo $url|sed 's/http:\/\///g'|cut -f1 -d \/|cut -f1 -d:` + port=`echo $url|sed 's/http:\/\///g'|cut -f1 -d \/|cut -f2 -d:` + + if [ "_$port" = "_" ];then + port=80 + fi + + isIP=`echo "$dest"|grep -v -e [a-zA-Z]` + if [ "_$isIP" != "_" ];then + list=`netstat -t -n|grep $dest:$port|sed 's/\ \+/-/g'|sed 's/-$//g'` + wait_connection_acs "$dest" "$port" + list2=`netstat -t -n|grep $dest:$port|sed 's/\ \+/-/g'|sed 's/-$//g'` + else + i=0 + result=1 + until [ \( $result -eq 0 \) -o \( $i -eq 20 \) ];do + nslookup $dest > /dev/null + result=$? + if [ $result -eq 1 ];then + i=`expr $i + 1` + sleep 5 + fi + done + if [ $result -eq 1 ];then + exit 1 + fi + number_entries=`nslookup $dest|wc -l` + n=`expr $number_entries - 4` + if [ $n -lt 0 ];then + exit 1 + fi + for addr in `nslookup $dest|tail -$n|grep Address|cut -f2 -d:|sed 's/^ //g'|cut -f1 -d " "`;do + list=$list`netstat -t -n|grep $addr:$port|sed 's/\ \+/-/g'|sed 's/-$//g'` + done + for addr in `nslookup $dest|tail -$n|grep Address|cut -f2 -d:|sed 's/^ //g'|cut -f1 -d " "`;do + wait_connection_acs "$addr" "$port" + list2=$list2`netstat -t -n|grep $addr:$port|sed 's/\ \+/-/g'|sed 's/-$//g'` + done + fi + for line2 in $list2;do + found=0 + for line in $list;do + if [ "_$line" = "_$line2" ];then + found=1 + break + fi + done + if [ $found -eq 1 ];then + continue + fi + ip=`echo $line2|cut -f4 -d -|cut -f1 -d:|uniq` + break + done + if [ "_$ip" = "_" ];then + exit 1 + fi + old_cr_url=`uci get -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_url` + if [ $? -eq 0 ];then + cr_url="http://$ip:$cpe_port" + if [ "_$cr_url" != "_$old_cr_url" ];then + rm -rf /etc/cwmpd/.iccu + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_url=$cr_url + cwmp_value_change "InternetGatewayDevice.ManagementServer.ConnectionRequestURL" + if [ $? -eq 1 ];then + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_change_state=yes + else + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_change_state=no + fi + uci commit + fi + else + rm -rf /etc/cwmpd/.iccu + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_url=http://$ip:$cpe_port + uci set -q -P /etc/cwmpd/.iccu cwmp.cpe.iccu_change_state=no + uci commit + fi +} + +boot() { + check_connection_request_url +} + +start() { + check_connection_request_url +} + +restart() { + start +} \ No newline at end of file diff --git a/src/init/iccu_enable b/src/init/iccu_enable new file mode 100644 index 0000000..f0623e9 --- /dev/null +++ b/src/init/iccu_enable @@ -0,0 +1,22 @@ +#!/bin/sh + +check_network=`uci get -q ucitrack.@network[0].affects|grep iccu` +if [ "_$check_network" = "_" ];then + uci add_list ucitrack.@network[0].affects=iccu +fi +check_cwmp=`uci get -q ucitrack.@cwmp[0]` +if [ "_$check_cwmp" = "_" ];then + uci add ucitrack cwmp + uci set ucitrack.@cwmp[0].init=cwmpd + uci add_list ucitrack.@cwmp[0].affects=iccu + uci add ucitrack iccu + uci set ucitrack.@iccu[0].init=iccu +fi +uci commit + +/etc/init.d/iccu enable +/etc/init.d/iccu boot + +cat /etc/init.d/cwmpd|grep -v "/etc/cwmpd/scripts/iccu_enable && rm /etc/cwmpd/scripts/iccu_enable" > /etc/init.d/cwmpd.new +mv /etc/init.d/cwmpd.new /etc/init.d/cwmpd +chmod +x /etc/init.d/cwmpd \ No newline at end of file diff --git a/src/kcwmp.c b/src/kcwmp.c new file mode 100644 index 0000000..9ee9869 --- /dev/null +++ b/src/kcwmp.c @@ -0,0 +1,197 @@ +/* + kcwmp.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "inc/cwmp_kernel.h" + +typedef struct kernel_cwmp_input { + char **argv; + int argc; + int handler; + struct mutex mutex; + wait_queue_head_t thresholdq; +} KERNEL_CWMP_INPUT; + +static struct sock *nl_sk = NULL; +static struct kernel_cwmp_input kernel_cwmp_input; + +MODULE_LICENSE("INTENO"); + +static void kernel_api_cwmp_value_change_listener(struct sk_buff *skb) +{ + + struct nlmsghdr *nlh; + int pid; + struct sk_buff *skb_out; + int msg_size; + char *msg; + char *recv; + int i,res; + + nlh = (struct nlmsghdr*)skb->data; + recv = (char*)nlmsg_data(nlh); + + if (strcmp(recv,NETLINK_CWMP_ID)!=0) + { + return; + } + pid = nlh->nlmsg_pid; /*pid of sending process */ + + + while (kernel_cwmp_input.argc==0) + { + if ( wait_event_interruptible( kernel_cwmp_input.thresholdq, kernel_cwmp_input.handler)) { + return ; + } + } + kernel_cwmp_input.handler = 0; + + mutex_lock (&(kernel_cwmp_input.mutex)); + + for (i=0;i<=kernel_cwmp_input.argc;i++) + { + if (i0) + { + kernel_cwmp_input.handler = 1; + wake_up_interruptible(&(kernel_cwmp_input.thresholdq)); + return 1; + } + + mutex_lock (&(kernel_cwmp_input.mutex)); + kernel_cwmp_input.argv = kmalloc(count*sizeof(char *),GFP_KERNEL); + + if (kernel_cwmp_input.argv==NULL) + { + goto kernel_api_cwmp_error; + } + + va_start(args, count); + for (i=0;i +#include +#include +#include +#include +#include +#include "cwmp.h" + +#define DEFAULT_LOG_SEVERITY 6 +static char *SEVERITY_NAMES[8] = {"[EMERG] ","[ALERT] ","[CRITIC] ","[ERROR] ","[WARNING]","[NOTICE] ","[INFO] ","[DEBUG] "}; +static int log_severity = DEFAULT_LOG_SEVERITY; +static long int log_max_size = DEFAULT_LOG_FILE_SIZE; +static char log_file_name[256]; +static bool enable_log_file = TRUE; +static bool enable_log_stdout = FALSE; +static pthread_mutex_t mutex_log; + +int log_set_severity_idx (char *value) +{ + int i; + for (i=0;i<8;i++) + { + if (strstr(SEVERITY_NAMES[i],value)!=NULL) + { + log_severity = i; + return 0; + } + } + return 1; +} + +int log_set_log_file_name (char *value) +{ + if(value != NULL) + { + strcpy(log_file_name,value); + } + else + { + strcpy(log_file_name,DEFAULT_LOG_FILE_NAME); + } +} +int log_set_file_max_size(char *value) +{ + if(value != NULL) + { + log_max_size = atol(value); + } +} +int log_set_on_console(char *value) +{ + if(strcmp(value,"enable") == 0) + { + enable_log_stdout = TRUE; + } + if(strcmp(value,"disable") == 0) + { + enable_log_stdout = FALSE; + } +} +int log_set_on_file(char *value) +{ + if(strcmp(value,"enable") == 0) + { + enable_log_file = TRUE; + } + if(strcmp(value,"disable") == 0) + { + enable_log_file = FALSE; + } +} + +void puts_log(int severity, const char *fmt, ...) +{ + va_list args; + int i; + char buf[1024]; + char buf_file[1024]; + time_t t; + struct tm *Tm; + struct timeval tv; + FILE *pLog; + struct stat st; + long int size = 0; + char log_file_name_bak[256]; + + if (severity>log_severity) + { + return; + } + + gettimeofday(&tv, 0); + t = time((time_t*)NULL); + Tm= localtime(&tv.tv_sec); + i = sprintf(buf,"%02d-%02d-%4d, %02d:%02d:%02d.%03d %s ", + Tm->tm_mday, + Tm->tm_mon+1, + Tm->tm_year+1900, + Tm->tm_hour, + Tm->tm_min, + Tm->tm_sec, + (int)tv.tv_usec%1000, + SEVERITY_NAMES[severity]); + + if(strlen(log_file_name) == 0) + { + strcpy(log_file_name,DEFAULT_LOG_FILE_NAME); + } + + if (stat(log_file_name, &st) == 0) + { + size = st.st_size; + } + + if(enable_log_file) + { + pthread_mutex_lock (&mutex_log); + if(size >= log_max_size) + { + sprintf(log_file_name_bak,"%s.1",log_file_name); + rename(log_file_name,log_file_name_bak); + pLog = fopen(log_file_name,"w"); + } + else + { + pLog = fopen(log_file_name,"a+"); + } + } + + va_start(args, fmt); + i += vsprintf(buf+i, fmt, args); + if(enable_log_file) + { + sprintf(buf_file,"%s\n",buf); + fputs (buf_file, pLog); + } + va_end(args); + if(enable_log_file) + { + fclose(pLog); + pthread_mutex_unlock (&mutex_log); + } + if(enable_log_stdout) + { + puts(buf); + } +} diff --git a/src/md5evp.c b/src/md5evp.c new file mode 100644 index 0000000..ad9a885 --- /dev/null +++ b/src/md5evp.c @@ -0,0 +1,102 @@ +/* + +md5evp.c + +gSOAP HTTP Content-MD5 digest EVP handler for httpmd5 plugin + +gSOAP XML Web services tools +Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under one of the following licenses: +GPL, the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- +*/ + +#include "md5evp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int md5_handler(struct soap *soap, void **context, enum md5_action action, char *buf, size_t len) +{ + EVP_MD_CTX *ctx; + unsigned char hash[EVP_MAX_MD_SIZE]; + unsigned int size; + switch (action) + { case MD5_INIT: +#ifdef WITH_OPENSSL + OpenSSL_add_all_digests(); +#endif + if (!*context) + { *context = (void*)SOAP_MALLOC(soap, sizeof(EVP_MD_CTX)); + EVP_MD_CTX_init((EVP_MD_CTX*)*context); + } + ctx = (EVP_MD_CTX*)*context; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Init %p\n", ctx)); + EVP_DigestInit(ctx, EVP_md5()); + break; + case MD5_UPDATE: + ctx = (EVP_MD_CTX*)*context; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Update %p --\n", ctx)); + DBGMSG(TEST, buf, len); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); + EVP_DigestUpdate(ctx, (void*)buf, (unsigned int)len); + break; + case MD5_FINAL: + ctx = (EVP_MD_CTX*)*context; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Final %p --\n", ctx)); + EVP_DigestFinal(ctx, (unsigned char*)hash, &size); + memcpy(buf, hash, 16); + break; + case MD5_DELETE: + ctx = (EVP_MD_CTX*)*context; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Delete %p --\n", ctx)); + if (ctx) + { EVP_MD_CTX_cleanup(ctx); + SOAP_FREE(soap, ctx); + } + *context = NULL; + } + return SOAP_OK; +} + +#ifdef __cplusplus +} +#endif + diff --git a/src/soapC.c b/src/soapC.c new file mode 100644 index 0000000..ab54924 --- /dev/null +++ b/src/soapC.c @@ -0,0 +1,12549 @@ +/* soapC.c + Generated by gSOAP 2.7.12 from cwmp-1-1.h + Copyright(C) 2000-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. + This part of the software is released under one of the following licenses: + GPL, the gSOAP public license, or Genivia's license for commercial use. +*/ + +#include "soapH.h" + +#ifdef __cplusplus +extern "C" { +#endif + +SOAP_SOURCE_STAMP("@(#) soapC.c ver 2.7.12 2011-10-17 13:06:56 GMT") + + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) +{ + if (soap->header) + soap_serialize_SOAP_ENV__Header(soap, soap->header); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) +{ + if (soap->header) + { soap->part = SOAP_IN_HEADER; + if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, NULL)) + return soap->error; + soap->part = SOAP_END_HEADER; + } + return SOAP_OK; +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap) +{ + soap->part = SOAP_IN_HEADER; + soap->header = soap_in_SOAP_ENV__Header(soap, "SOAP-ENV:Header", NULL, NULL); + soap->part = SOAP_END_HEADER; + return soap->header == NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) +{ + if (!soap->header) + { soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)); + soap_default_SOAP_ENV__Header(soap, soap->header); + } +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) +{ + if (!soap->fault) + { soap->fault = (struct SOAP_ENV__Fault*)soap_malloc(soap, sizeof(struct SOAP_ENV__Fault)); + if (!soap->fault) + return; + soap_default_SOAP_ENV__Fault(soap, soap->fault); + } + if (soap->version == 2 && !soap->fault->SOAP_ENV__Code) + { soap->fault->SOAP_ENV__Code = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); + soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code); + } + if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason) + { soap->fault->SOAP_ENV__Reason = (struct SOAP_ENV__Reason*)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason)); + soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason); + } +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap) +{ + if (soap->fault) + soap_serialize_SOAP_ENV__Fault(soap, soap->fault); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) +{ + if (soap->fault) + return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); + return SOAP_OK; +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap) +{ + return (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, "SOAP-ENV:Fault", NULL)) == NULL; +} + +SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap) +{ + soap_fault(soap); + if (soap->version == 2) + return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; + return (const char**)&soap->fault->faultcode; +} + +SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) +{ + soap_fault(soap); + if (soap->version == 2) + { if (!soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode) + { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = (struct SOAP_ENV__Code*)soap_malloc(soap, sizeof(struct SOAP_ENV__Code)); + soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode); + } + return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; + } + return (const char**)&soap->fault->faultcode; +} + +SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) +{ + soap_fault(soap); + if (soap->version == 2) + return (const char**)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; + return (const char**)&soap->fault->faultstring; +} + +SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) +{ + soap_fault(soap); + if (soap->version == 1) + { if (!soap->fault->detail) + { soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); + soap_default_SOAP_ENV__Detail(soap, soap->fault->detail); + } + return (const char**)&soap->fault->detail->__any; + } + if (!soap->fault->SOAP_ENV__Detail) + { soap->fault->SOAP_ENV__Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); + soap_default_SOAP_ENV__Detail(soap, soap->fault->SOAP_ENV__Detail); + } + return (const char**)&soap->fault->SOAP_ENV__Detail->__any; +} + +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) +{ + int t; + for (;;) + if (!soap_getelement(soap, &t)) + if (soap->error || soap_ignore_element(soap)) + break; + if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) + soap->error = SOAP_OK; + return soap->error; +} +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, int *type) +{ + if (soap_peek_element(soap)) + return NULL; + if (!*soap->id || !(*type = soap_lookup_type(soap, soap->id))) + *type = soap_lookup_type(soap, soap->href); + switch (*type) + { + case SOAP_TYPE_byte: + return soap_in_byte(soap, NULL, NULL, "xsd:byte"); + case SOAP_TYPE_int: + return soap_in_int(soap, NULL, NULL, "xsd:int"); + case SOAP_TYPE_unsignedByte: + return soap_in_unsignedByte(soap, NULL, NULL, "xsd:unsignedByte"); + case SOAP_TYPE_unsignedInt: + return soap_in_unsignedInt(soap, NULL, NULL, "xsd:unsignedInt"); + case SOAP_TYPE_time: + return soap_in_time(soap, NULL, NULL, "xsd:dateTime"); + case SOAP_TYPE__cwmp1__UploadResponse_Status: + return soap_in__cwmp1__UploadResponse_Status(soap, NULL, NULL, "cwmp:UploadResponse-Status"); + case SOAP_TYPE__cwmp1__DownloadResponse_Status: + return soap_in__cwmp1__DownloadResponse_Status(soap, NULL, NULL, "cwmp:DownloadResponse-Status"); + case SOAP_TYPE__cwmp1__DeleteObjectResponse_Status: + return soap_in__cwmp1__DeleteObjectResponse_Status(soap, NULL, NULL, "cwmp:DeleteObjectResponse-Status"); + case SOAP_TYPE__cwmp1__AddObjectResponse_Status: + return soap_in__cwmp1__AddObjectResponse_Status(soap, NULL, NULL, "cwmp:AddObjectResponse-Status"); + case SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status: + return soap_in__cwmp1__SetParameterValuesResponse_Status(soap, NULL, NULL, "cwmp:SetParameterValuesResponse-Status"); + case SOAP_TYPE__cwmp1__OptionStruct_IsTransferable: + return soap_in__cwmp1__OptionStruct_IsTransferable(soap, NULL, NULL, "cwmp:OptionStruct-IsTransferable"); + case SOAP_TYPE__cwmp1__OptionStruct_Mode: + return soap_in__cwmp1__OptionStruct_Mode(soap, NULL, NULL, "cwmp:OptionStruct-Mode"); + case SOAP_TYPE__cwmp1__OptionStruct_State: + return soap_in__cwmp1__OptionStruct_State(soap, NULL, NULL, "cwmp:OptionStruct-State"); + case SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State: + return soap_in__cwmp1__AllQueuedTransferStruct_State(soap, NULL, NULL, "cwmp:AllQueuedTransferStruct-State"); + case SOAP_TYPE__cwmp1__QueuedTransferStruct_State: + return soap_in__cwmp1__QueuedTransferStruct_State(soap, NULL, NULL, "cwmp:QueuedTransferStruct-State"); + case SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification: + return soap_in__cwmp1__ParameterAttributeStruct_Notification(soap, NULL, NULL, "cwmp:ParameterAttributeStruct-Notification"); + case SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification: + return soap_in__cwmp1__SetParameterAttributesStruct_Notification(soap, NULL, NULL, "cwmp:SetParameterAttributesStruct-Notification"); + case SOAP_TYPE_xsd__boolean: + return soap_in_xsd__boolean(soap, NULL, NULL, "xsd:boolean"); + case SOAP_TYPE_cwmp1__Inform: + return soap_in_cwmp1__Inform(soap, NULL, NULL, "cwmp:Inform"); + case SOAP_TYPE_cwmp1__InformResponse: + return soap_in_cwmp1__InformResponse(soap, NULL, NULL, "cwmp:InformResponse"); + case SOAP_TYPE_cwmp1FileTypeArg: + return soap_in_cwmp1FileTypeArg(soap, NULL, NULL, "cwmp:ArgStruct"); + case SOAP_TYPE_cwmp1EventList: + return soap_in_cwmp1EventList(soap, NULL, NULL, "cwmp:EventStruct"); + case SOAP_TYPE_cwmp1AllTransferList: + return soap_in_cwmp1AllTransferList(soap, NULL, NULL, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_cwmp1OptionList: + return soap_in_cwmp1OptionList(soap, NULL, NULL, "cwmp:OptionStruct"); + case SOAP_TYPE_cwmp1VoucherList: + return soap_in_cwmp1VoucherList(soap, NULL, NULL, "SOAP-ENC:base64"); + case SOAP_TYPE_cwmp1TransferList: + return soap_in_cwmp1TransferList(soap, NULL, NULL, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_cwmp1ParameterAttributeList: + return soap_in_cwmp1ParameterAttributeList(soap, NULL, NULL, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_cwmp1SetParameterAttributesList: + return soap_in_cwmp1SetParameterAttributesList(soap, NULL, NULL, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_cwmp1ParameterInfoList: + return soap_in_cwmp1ParameterInfoList(soap, NULL, NULL, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_cwmp1ParameterNames: + return soap_in_cwmp1ParameterNames(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_cwmp1ParameterValueList: + return soap_in_cwmp1ParameterValueList(soap, NULL, NULL, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_cwmp1MethodList: + return soap_in_cwmp1MethodList(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_cwmp1__OptionStruct: + return soap_in_cwmp1__OptionStruct(soap, NULL, NULL, "cwmp:OptionStruct"); + case SOAP_TYPE_cwmp1__ArgStruct: + return soap_in_cwmp1__ArgStruct(soap, NULL, NULL, "cwmp:ArgStruct"); + case SOAP_TYPE_cwmp1__AllQueuedTransferStruct: + return soap_in_cwmp1__AllQueuedTransferStruct(soap, NULL, NULL, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_cwmp1__QueuedTransferStruct: + return soap_in_cwmp1__QueuedTransferStruct(soap, NULL, NULL, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_cwmp1__ParameterAttributeStruct: + return soap_in_cwmp1__ParameterAttributeStruct(soap, NULL, NULL, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_cwmp1AccessList: + return soap_in_cwmp1AccessList(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_cwmp1__SetParameterAttributesStruct: + return soap_in_cwmp1__SetParameterAttributesStruct(soap, NULL, NULL, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_cwmp1__ParameterInfoStruct: + return soap_in_cwmp1__ParameterInfoStruct(soap, NULL, NULL, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_cwmp1__ParameterValueStruct: + return soap_in_cwmp1__ParameterValueStruct(soap, NULL, NULL, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_cwmp1__EventStruct: + return soap_in_cwmp1__EventStruct(soap, NULL, NULL, "cwmp:EventStruct"); + case SOAP_TYPE_cwmp1__DeviceIdStruct: + return soap_in_cwmp1__DeviceIdStruct(soap, NULL, NULL, "cwmp:DeviceIdStruct"); + case SOAP_TYPE_cwmp1__FaultStruct: + return soap_in_cwmp1__FaultStruct(soap, NULL, NULL, "cwmp:FaultStruct"); + case SOAP_TYPE_SOAP_ENC__base64: + return soap_in_SOAP_ENC__base64(soap, NULL, NULL, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerTounsignedInt: + return soap_in_PointerTounsignedInt(soap, NULL, NULL, "xsd:unsignedInt"); + case SOAP_TYPE_PointerToPointerTocwmp1__ArgStruct: + return soap_in_PointerToPointerTocwmp1__ArgStruct(soap, NULL, NULL, "cwmp:ArgStruct"); + case SOAP_TYPE_PointerTocwmp1__ArgStruct: + return soap_in_PointerTocwmp1__ArgStruct(soap, NULL, NULL, "cwmp:ArgStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__OptionStruct: + return soap_in_PointerToPointerTocwmp1__OptionStruct(soap, NULL, NULL, "cwmp:OptionStruct"); + case SOAP_TYPE_PointerTocwmp1__OptionStruct: + return soap_in_PointerTocwmp1__OptionStruct(soap, NULL, NULL, "cwmp:OptionStruct"); + case SOAP_TYPE_PointerToPointerToSOAP_ENC__base64: + return soap_in_PointerToPointerToSOAP_ENC__base64(soap, NULL, NULL, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerToSOAP_ENC__base64: + return soap_in_PointerToSOAP_ENC__base64(soap, NULL, NULL, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerToPointerTocwmp1__AllQueuedTransferStruct: + return soap_in_PointerToPointerTocwmp1__AllQueuedTransferStruct(soap, NULL, NULL, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct: + return soap_in_PointerTocwmp1__AllQueuedTransferStruct(soap, NULL, NULL, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__QueuedTransferStruct: + return soap_in_PointerToPointerTocwmp1__QueuedTransferStruct(soap, NULL, NULL, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct: + return soap_in_PointerTocwmp1__QueuedTransferStruct(soap, NULL, NULL, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterAttributeStruct: + return soap_in_PointerToPointerTocwmp1__ParameterAttributeStruct(soap, NULL, NULL, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct: + return soap_in_PointerTocwmp1__ParameterAttributeStruct(soap, NULL, NULL, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__SetParameterAttributesStruct: + return soap_in_PointerToPointerTocwmp1__SetParameterAttributesStruct(soap, NULL, NULL, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct: + return soap_in_PointerTocwmp1__SetParameterAttributesStruct(soap, NULL, NULL, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterInfoStruct: + return soap_in_PointerToPointerTocwmp1__ParameterInfoStruct(soap, NULL, NULL, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct: + return soap_in_PointerTocwmp1__ParameterInfoStruct(soap, NULL, NULL, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterValueStruct: + return soap_in_PointerToPointerTocwmp1__ParameterValueStruct(soap, NULL, NULL, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_PointerTocwmp1__ParameterValueStruct: + return soap_in_PointerTocwmp1__ParameterValueStruct(soap, NULL, NULL, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__EventStruct: + return soap_in_PointerToPointerTocwmp1__EventStruct(soap, NULL, NULL, "cwmp:EventStruct"); + case SOAP_TYPE_PointerTocwmp1__EventStruct: + return soap_in_PointerTocwmp1__EventStruct(soap, NULL, NULL, "cwmp:EventStruct"); + case SOAP_TYPE_PointerTocwmp1FileTypeArg: + return soap_in_PointerTocwmp1FileTypeArg(soap, NULL, NULL, "cwmp:ArgStruct"); + case SOAP_TYPE_PointerTocwmp1__FaultStruct: + return soap_in_PointerTocwmp1__FaultStruct(soap, NULL, NULL, "cwmp:FaultStruct"); + case SOAP_TYPE_PointerTocwmp1EventList: + return soap_in_PointerTocwmp1EventList(soap, NULL, NULL, "cwmp:EventStruct"); + case SOAP_TYPE_PointerTocwmp1__DeviceIdStruct: + return soap_in_PointerTocwmp1__DeviceIdStruct(soap, NULL, NULL, "cwmp:DeviceIdStruct"); + case SOAP_TYPE_PointerTocwmp1AllTransferList: + return soap_in_PointerTocwmp1AllTransferList(soap, NULL, NULL, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1OptionList: + return soap_in_PointerTocwmp1OptionList(soap, NULL, NULL, "cwmp:OptionStruct"); + case SOAP_TYPE_PointerTocwmp1VoucherList: + return soap_in_PointerTocwmp1VoucherList(soap, NULL, NULL, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerTocwmp1TransferList: + return soap_in_PointerTocwmp1TransferList(soap, NULL, NULL, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1ParameterAttributeList: + return soap_in_PointerTocwmp1ParameterAttributeList(soap, NULL, NULL, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_PointerTocwmp1SetParameterAttributesList: + return soap_in_PointerTocwmp1SetParameterAttributesList(soap, NULL, NULL, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_PointerTocwmp1ParameterInfoList: + return soap_in_PointerTocwmp1ParameterInfoList(soap, NULL, NULL, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_PointerTocwmp1ParameterNames: + return soap_in_PointerTocwmp1ParameterNames(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_PointerTocwmp1ParameterValueList: + return soap_in_PointerTocwmp1ParameterValueList(soap, NULL, NULL, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_PointerTocwmp1MethodList: + return soap_in_PointerTocwmp1MethodList(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_PointerTo_cwmp1__Fault_SetParameterValuesFault: + return soap_in_PointerTo_cwmp1__Fault_SetParameterValuesFault(soap, NULL, NULL, "cwmp:Fault-SetParameterValuesFault"); + case SOAP_TYPE_PointerTotime: + return soap_in_PointerTotime(soap, NULL, NULL, "xsd:dateTime"); + case SOAP_TYPE_PointerTocwmp1AccessList: + return soap_in_PointerTocwmp1AccessList(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_PointerTostring: + return soap_in_PointerTostring(soap, NULL, NULL, "xsd:string"); + case SOAP_TYPE_cwmp1__ObjectNameType: + { char **s; + s = soap_in_cwmp1__ObjectNameType(soap, NULL, NULL, "cwmp:ObjectNameType"); + return s ? *s : NULL; + } + case SOAP_TYPE_cwmp1__CommandKeyType: + { char **s; + s = soap_in_cwmp1__CommandKeyType(soap, NULL, NULL, "cwmp:CommandKeyType"); + return s ? *s : NULL; + } + case SOAP_TYPE_cwmp1__ParameterKeyType: + { char **s; + s = soap_in_cwmp1__ParameterKeyType(soap, NULL, NULL, "cwmp:ParameterKeyType"); + return s ? *s : NULL; + } + case SOAP_TYPE_cwmp1__FaultCodeType: + { char **s; + s = soap_in_cwmp1__FaultCodeType(soap, NULL, NULL, "cwmp:FaultCodeType"); + return s ? *s : NULL; + } + case SOAP_TYPE_xsd__anySimpleType: + { char **s; + s = soap_in_xsd__anySimpleType(soap, NULL, NULL, "xsd:anySimpleType"); + return s ? *s : NULL; + } + case SOAP_TYPE_PointerTounsignedByte: + return soap_in_PointerTounsignedByte(soap, NULL, NULL, "xsd:unsignedByte"); + case SOAP_TYPE_string: + { char **s; + s = soap_in_string(soap, NULL, NULL, "xsd:string"); + return s ? *s : NULL; + } + default: + { const char *t = soap->type; + if (!*t) + t = soap->tag; + if (!soap_match_tag(soap, t, "xsd:byte")) + { *type = SOAP_TYPE_byte; + return soap_in_byte(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "xsd:int")) + { *type = SOAP_TYPE_int; + return soap_in_int(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "xsd:unsignedByte")) + { *type = SOAP_TYPE_unsignedByte; + return soap_in_unsignedByte(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "xsd:unsignedInt")) + { *type = SOAP_TYPE_unsignedInt; + return soap_in_unsignedInt(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "xsd:dateTime")) + { *type = SOAP_TYPE_time; + return soap_in_time(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:UploadResponse-Status")) + { *type = SOAP_TYPE__cwmp1__UploadResponse_Status; + return soap_in__cwmp1__UploadResponse_Status(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:DownloadResponse-Status")) + { *type = SOAP_TYPE__cwmp1__DownloadResponse_Status; + return soap_in__cwmp1__DownloadResponse_Status(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:DeleteObjectResponse-Status")) + { *type = SOAP_TYPE__cwmp1__DeleteObjectResponse_Status; + return soap_in__cwmp1__DeleteObjectResponse_Status(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AddObjectResponse-Status")) + { *type = SOAP_TYPE__cwmp1__AddObjectResponse_Status; + return soap_in__cwmp1__AddObjectResponse_Status(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterValuesResponse-Status")) + { *type = SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status; + return soap_in__cwmp1__SetParameterValuesResponse_Status(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:OptionStruct-IsTransferable")) + { *type = SOAP_TYPE__cwmp1__OptionStruct_IsTransferable; + return soap_in__cwmp1__OptionStruct_IsTransferable(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:OptionStruct-Mode")) + { *type = SOAP_TYPE__cwmp1__OptionStruct_Mode; + return soap_in__cwmp1__OptionStruct_Mode(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:OptionStruct-State")) + { *type = SOAP_TYPE__cwmp1__OptionStruct_State; + return soap_in__cwmp1__OptionStruct_State(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AllQueuedTransferStruct-State")) + { *type = SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State; + return soap_in__cwmp1__AllQueuedTransferStruct_State(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:QueuedTransferStruct-State")) + { *type = SOAP_TYPE__cwmp1__QueuedTransferStruct_State; + return soap_in__cwmp1__QueuedTransferStruct_State(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ParameterAttributeStruct-Notification")) + { *type = SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification; + return soap_in__cwmp1__ParameterAttributeStruct_Notification(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterAttributesStruct-Notification")) + { *type = SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification; + return soap_in__cwmp1__SetParameterAttributesStruct_Notification(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "xsd:boolean")) + { *type = SOAP_TYPE_xsd__boolean; + return soap_in_xsd__boolean(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Inform")) + { *type = SOAP_TYPE_cwmp1__Inform; + return soap_in_cwmp1__Inform(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:InformResponse")) + { *type = SOAP_TYPE_cwmp1__InformResponse; + return soap_in_cwmp1__InformResponse(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:ArgStruct")) + { *type = SOAP_TYPE_cwmp1FileTypeArg; + return soap_in_cwmp1FileTypeArg(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:EventStruct")) + { *type = SOAP_TYPE_cwmp1EventList; + return soap_in_cwmp1EventList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:AllQueuedTransferStruct")) + { *type = SOAP_TYPE_cwmp1AllTransferList; + return soap_in_cwmp1AllTransferList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:OptionStruct")) + { *type = SOAP_TYPE_cwmp1OptionList; + return soap_in_cwmp1OptionList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "SOAP-ENC:base64")) + { *type = SOAP_TYPE_cwmp1VoucherList; + return soap_in_cwmp1VoucherList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:QueuedTransferStruct")) + { *type = SOAP_TYPE_cwmp1TransferList; + return soap_in_cwmp1TransferList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:ParameterAttributeStruct")) + { *type = SOAP_TYPE_cwmp1ParameterAttributeList; + return soap_in_cwmp1ParameterAttributeList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:SetParameterAttributesStruct")) + { *type = SOAP_TYPE_cwmp1SetParameterAttributesList; + return soap_in_cwmp1SetParameterAttributesList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:ParameterInfoStruct")) + { *type = SOAP_TYPE_cwmp1ParameterInfoList; + return soap_in_cwmp1ParameterInfoList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "xsd:string")) + { *type = SOAP_TYPE_cwmp1ParameterNames; + return soap_in_cwmp1ParameterNames(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "cwmp:ParameterValueStruct")) + { *type = SOAP_TYPE_cwmp1ParameterValueList; + return soap_in_cwmp1ParameterValueList(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "xsd:string")) + { *type = SOAP_TYPE_cwmp1MethodList; + return soap_in_cwmp1MethodList(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:OptionStruct")) + { *type = SOAP_TYPE_cwmp1__OptionStruct; + return soap_in_cwmp1__OptionStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ArgStruct")) + { *type = SOAP_TYPE_cwmp1__ArgStruct; + return soap_in_cwmp1__ArgStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AllQueuedTransferStruct")) + { *type = SOAP_TYPE_cwmp1__AllQueuedTransferStruct; + return soap_in_cwmp1__AllQueuedTransferStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:QueuedTransferStruct")) + { *type = SOAP_TYPE_cwmp1__QueuedTransferStruct; + return soap_in_cwmp1__QueuedTransferStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ParameterAttributeStruct")) + { *type = SOAP_TYPE_cwmp1__ParameterAttributeStruct; + return soap_in_cwmp1__ParameterAttributeStruct(soap, NULL, NULL, NULL); + } + if (*soap->arrayType && !soap_match_array(soap, "xsd:string")) + { *type = SOAP_TYPE_cwmp1AccessList; + return soap_in_cwmp1AccessList(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterAttributesStruct")) + { *type = SOAP_TYPE_cwmp1__SetParameterAttributesStruct; + return soap_in_cwmp1__SetParameterAttributesStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ParameterInfoStruct")) + { *type = SOAP_TYPE_cwmp1__ParameterInfoStruct; + return soap_in_cwmp1__ParameterInfoStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ParameterValueStruct")) + { *type = SOAP_TYPE_cwmp1__ParameterValueStruct; + return soap_in_cwmp1__ParameterValueStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:EventStruct")) + { *type = SOAP_TYPE_cwmp1__EventStruct; + return soap_in_cwmp1__EventStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:DeviceIdStruct")) + { *type = SOAP_TYPE_cwmp1__DeviceIdStruct; + return soap_in_cwmp1__DeviceIdStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:FaultStruct")) + { *type = SOAP_TYPE_cwmp1__FaultStruct; + return soap_in_cwmp1__FaultStruct(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "SOAP-ENC:base64")) + { *type = SOAP_TYPE_SOAP_ENC__base64; + return soap_in_SOAP_ENC__base64(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ObjectNameType")) + { char **s; + *type = SOAP_TYPE_cwmp1__ObjectNameType; + s = soap_in_cwmp1__ObjectNameType(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + if (!soap_match_tag(soap, t, "cwmp:CommandKeyType")) + { char **s; + *type = SOAP_TYPE_cwmp1__CommandKeyType; + s = soap_in_cwmp1__CommandKeyType(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + if (!soap_match_tag(soap, t, "cwmp:ParameterKeyType")) + { char **s; + *type = SOAP_TYPE_cwmp1__ParameterKeyType; + s = soap_in_cwmp1__ParameterKeyType(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + if (!soap_match_tag(soap, t, "cwmp:FaultCodeType")) + { char **s; + *type = SOAP_TYPE_cwmp1__FaultCodeType; + s = soap_in_cwmp1__FaultCodeType(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + if (!soap_match_tag(soap, t, "xsd:anySimpleType")) + { char **s; + *type = SOAP_TYPE_xsd__anySimpleType; + s = soap_in_xsd__anySimpleType(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + if (!soap_match_tag(soap, t, "xsd:string")) + { char **s; + *type = SOAP_TYPE_string; + s = soap_in_string(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + t = soap->tag; +/* KMD */ +#if 0 + if (!soap_match_tag(soap, t, "cwmp:HoldRequests")) + { *type = SOAP_TYPE__cwmp1__HoldRequests; + return soap_in__cwmp1__HoldRequests(soap, NULL, NULL, NULL); + } +#endif + if (!soap_match_tag(soap, t, "cwmp:ID")) + { *type = SOAP_TYPE__cwmp1__ID; + return soap_in__cwmp1__ID(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:RequestDownloadResponse")) + { *type = SOAP_TYPE__cwmp1__RequestDownloadResponse; + return soap_in__cwmp1__RequestDownloadResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:RequestDownload")) + { *type = SOAP_TYPE__cwmp1__RequestDownload; + return soap_in__cwmp1__RequestDownload(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:KickedResponse")) + { *type = SOAP_TYPE__cwmp1__KickedResponse; + return soap_in__cwmp1__KickedResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Kicked")) + { *type = SOAP_TYPE__cwmp1__Kicked; + return soap_in__cwmp1__Kicked(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AutonomousTransferCompleteResponse")) + { *type = SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse; + return soap_in__cwmp1__AutonomousTransferCompleteResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AutonomousTransferComplete")) + { *type = SOAP_TYPE__cwmp1__AutonomousTransferComplete; + return soap_in__cwmp1__AutonomousTransferComplete(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:TransferCompleteResponse")) + { *type = SOAP_TYPE__cwmp1__TransferCompleteResponse; + return soap_in__cwmp1__TransferCompleteResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:TransferComplete")) + { *type = SOAP_TYPE__cwmp1__TransferComplete; + return soap_in__cwmp1__TransferComplete(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:InformResponse")) + { *type = SOAP_TYPE__cwmp1__InformResponse; + return soap_in__cwmp1__InformResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Inform")) + { *type = SOAP_TYPE__cwmp1__Inform; + return soap_in__cwmp1__Inform(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetAllQueuedTransfersResponse")) + { *type = SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse; + return soap_in__cwmp1__GetAllQueuedTransfersResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetAllQueuedTransfers")) + { *type = SOAP_TYPE__cwmp1__GetAllQueuedTransfers; + return soap_in__cwmp1__GetAllQueuedTransfers(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:FactoryResetResponse")) + { *type = SOAP_TYPE__cwmp1__FactoryResetResponse; + return soap_in__cwmp1__FactoryResetResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:FactoryReset")) + { *type = SOAP_TYPE__cwmp1__FactoryReset; + return soap_in__cwmp1__FactoryReset(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:UploadResponse")) + { *type = SOAP_TYPE__cwmp1__UploadResponse; + return soap_in__cwmp1__UploadResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Upload")) + { *type = SOAP_TYPE__cwmp1__Upload; + return soap_in__cwmp1__Upload(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetOptionsResponse")) + { *type = SOAP_TYPE__cwmp1__GetOptionsResponse; + return soap_in__cwmp1__GetOptionsResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetOptions")) + { *type = SOAP_TYPE__cwmp1__GetOptions; + return soap_in__cwmp1__GetOptions(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetVouchersResponse")) + { *type = SOAP_TYPE__cwmp1__SetVouchersResponse; + return soap_in__cwmp1__SetVouchersResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetVouchers")) + { *type = SOAP_TYPE__cwmp1__SetVouchers; + return soap_in__cwmp1__SetVouchers(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ScheduleInformResponse")) + { *type = SOAP_TYPE__cwmp1__ScheduleInformResponse; + return soap_in__cwmp1__ScheduleInformResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:ScheduleInform")) + { *type = SOAP_TYPE__cwmp1__ScheduleInform; + return soap_in__cwmp1__ScheduleInform(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetQueuedTransfersResponse")) + { *type = SOAP_TYPE__cwmp1__GetQueuedTransfersResponse; + return soap_in__cwmp1__GetQueuedTransfersResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetQueuedTransfers")) + { *type = SOAP_TYPE__cwmp1__GetQueuedTransfers; + return soap_in__cwmp1__GetQueuedTransfers(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:RebootResponse")) + { *type = SOAP_TYPE__cwmp1__RebootResponse; + return soap_in__cwmp1__RebootResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Reboot")) + { *type = SOAP_TYPE__cwmp1__Reboot; + return soap_in__cwmp1__Reboot(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:DownloadResponse")) + { *type = SOAP_TYPE__cwmp1__DownloadResponse; + return soap_in__cwmp1__DownloadResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Download")) + { *type = SOAP_TYPE__cwmp1__Download; + return soap_in__cwmp1__Download(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:DeleteObjectResponse")) + { *type = SOAP_TYPE__cwmp1__DeleteObjectResponse; + return soap_in__cwmp1__DeleteObjectResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:DeleteObject")) + { *type = SOAP_TYPE__cwmp1__DeleteObject; + return soap_in__cwmp1__DeleteObject(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AddObjectResponse")) + { *type = SOAP_TYPE__cwmp1__AddObjectResponse; + return soap_in__cwmp1__AddObjectResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:AddObject")) + { *type = SOAP_TYPE__cwmp1__AddObject; + return soap_in__cwmp1__AddObject(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetParameterAttributesResponse")) + { *type = SOAP_TYPE__cwmp1__GetParameterAttributesResponse; + return soap_in__cwmp1__GetParameterAttributesResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetParameterAttributes")) + { *type = SOAP_TYPE__cwmp1__GetParameterAttributes; + return soap_in__cwmp1__GetParameterAttributes(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterAttributesResponse")) + { *type = SOAP_TYPE__cwmp1__SetParameterAttributesResponse; + return soap_in__cwmp1__SetParameterAttributesResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterAttributes")) + { *type = SOAP_TYPE__cwmp1__SetParameterAttributes; + return soap_in__cwmp1__SetParameterAttributes(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetParameterNamesResponse")) + { *type = SOAP_TYPE__cwmp1__GetParameterNamesResponse; + return soap_in__cwmp1__GetParameterNamesResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetParameterNames")) + { *type = SOAP_TYPE__cwmp1__GetParameterNames; + return soap_in__cwmp1__GetParameterNames(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetParameterValuesResponse")) + { *type = SOAP_TYPE__cwmp1__GetParameterValuesResponse; + return soap_in__cwmp1__GetParameterValuesResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetParameterValues")) + { *type = SOAP_TYPE__cwmp1__GetParameterValues; + return soap_in__cwmp1__GetParameterValues(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterValuesResponse")) + { *type = SOAP_TYPE__cwmp1__SetParameterValuesResponse; + return soap_in__cwmp1__SetParameterValuesResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:SetParameterValues")) + { *type = SOAP_TYPE__cwmp1__SetParameterValues; + return soap_in__cwmp1__SetParameterValues(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetRPCMethodsResponse")) + { *type = SOAP_TYPE__cwmp1__GetRPCMethodsResponse; + return soap_in__cwmp1__GetRPCMethodsResponse(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:GetRPCMethods")) + { *type = SOAP_TYPE__cwmp1__GetRPCMethods; + return soap_in__cwmp1__GetRPCMethods(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Fault-SetParameterValuesFault")) + { *type = SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault; + return soap_in__cwmp1__Fault_SetParameterValuesFault(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "cwmp:Fault")) + { *type = SOAP_TYPE__cwmp1__Fault; + return soap_in__cwmp1__Fault(soap, NULL, NULL, NULL); + } + if (!soap_match_tag(soap, t, "xsd:QName")) + { char **s; + *type = SOAP_TYPE__QName; + s = soap_in__QName(soap, NULL, NULL, NULL); + return s ? *s : NULL; + } + } + } + soap->error = SOAP_TAG_MISMATCH; + return NULL; +} +#endif + +SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap) +{ + if (!soap_peek_element(soap)) + { int t; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unexpected element '%s' in input (level=%u, %d)\n", soap->tag, soap->level, soap->body)); +#if 0 + if (soap->mustUnderstand && !soap->other) + return soap->error = SOAP_MUSTUNDERSTAND; /* KMD IN */ +#endif + if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, "SOAP-ENV:")) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "REJECTING element '%s'\n", soap->tag)); + return soap->error = SOAP_TAG_MISMATCH; + } + if (!*soap->id || !soap_getelement(soap, &t)) + { soap->peeked = 0; + if (soap->fignore) + soap->error = soap->fignore(soap, soap->tag); + else + soap->error = SOAP_OK; + DBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, "IGNORING element '%s'\n", soap->tag)); + if (!soap->error && soap->body) + { soap->level++; + while (!soap_ignore_element(soap)) + ; + if (soap->error == SOAP_NO_TAG) + soap->error = soap_element_end_in(soap, NULL); + } + } + } + return soap->error; +} + +#ifndef WITH_NOIDREF +SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap) +{ + int i; + struct soap_plist *pp; + if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH))) + for (i = 0; i < SOAP_PTRHASH; i++) + for (pp = soap->pht[i]; pp; pp = pp->next) + if (pp->mark1 == 2 || pp->mark2 == 2) + if (soap_putelement(soap, pp->ptr, "id", pp->id, pp->type)) + return soap->error; + return SOAP_OK; +} +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) +{ + switch (type) + { + case SOAP_TYPE_byte: + return soap_out_byte(soap, tag, id, (const char *)ptr, "xsd:byte"); + case SOAP_TYPE_int: + return soap_out_int(soap, tag, id, (const int *)ptr, "xsd:int"); + case SOAP_TYPE_unsignedByte: + return soap_out_unsignedByte(soap, tag, id, (const unsigned char *)ptr, "xsd:unsignedByte"); + case SOAP_TYPE_unsignedInt: + return soap_out_unsignedInt(soap, tag, id, (const unsigned int *)ptr, "xsd:unsignedInt"); + case SOAP_TYPE_time: + return soap_out_time(soap, tag, id, (const time_t *)ptr, "xsd:dateTime"); + case SOAP_TYPE__cwmp1__UploadResponse_Status: + return soap_out__cwmp1__UploadResponse_Status(soap, tag, id, (const enum _cwmp1__UploadResponse_Status *)ptr, "cwmp:UploadResponse-Status"); + case SOAP_TYPE__cwmp1__DownloadResponse_Status: + return soap_out__cwmp1__DownloadResponse_Status(soap, tag, id, (const enum _cwmp1__DownloadResponse_Status *)ptr, "cwmp:DownloadResponse-Status"); + case SOAP_TYPE__cwmp1__DeleteObjectResponse_Status: + return soap_out__cwmp1__DeleteObjectResponse_Status(soap, tag, id, (const enum _cwmp1__DeleteObjectResponse_Status *)ptr, "cwmp:DeleteObjectResponse-Status"); + case SOAP_TYPE__cwmp1__AddObjectResponse_Status: + return soap_out__cwmp1__AddObjectResponse_Status(soap, tag, id, (const enum _cwmp1__AddObjectResponse_Status *)ptr, "cwmp:AddObjectResponse-Status"); + case SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status: + return soap_out__cwmp1__SetParameterValuesResponse_Status(soap, tag, id, (const enum _cwmp1__SetParameterValuesResponse_Status *)ptr, "cwmp:SetParameterValuesResponse-Status"); + case SOAP_TYPE__cwmp1__OptionStruct_IsTransferable: + return soap_out__cwmp1__OptionStruct_IsTransferable(soap, tag, id, (const enum _cwmp1__OptionStruct_IsTransferable *)ptr, "cwmp:OptionStruct-IsTransferable"); + case SOAP_TYPE__cwmp1__OptionStruct_Mode: + return soap_out__cwmp1__OptionStruct_Mode(soap, tag, id, (const enum _cwmp1__OptionStruct_Mode *)ptr, "cwmp:OptionStruct-Mode"); + case SOAP_TYPE__cwmp1__OptionStruct_State: + return soap_out__cwmp1__OptionStruct_State(soap, tag, id, (const enum _cwmp1__OptionStruct_State *)ptr, "cwmp:OptionStruct-State"); + case SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State: + return soap_out__cwmp1__AllQueuedTransferStruct_State(soap, tag, id, (const enum _cwmp1__AllQueuedTransferStruct_State *)ptr, "cwmp:AllQueuedTransferStruct-State"); + case SOAP_TYPE__cwmp1__QueuedTransferStruct_State: + return soap_out__cwmp1__QueuedTransferStruct_State(soap, tag, id, (const enum _cwmp1__QueuedTransferStruct_State *)ptr, "cwmp:QueuedTransferStruct-State"); + case SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification: + return soap_out__cwmp1__ParameterAttributeStruct_Notification(soap, tag, id, (const enum _cwmp1__ParameterAttributeStruct_Notification *)ptr, "cwmp:ParameterAttributeStruct-Notification"); + case SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification: + return soap_out__cwmp1__SetParameterAttributesStruct_Notification(soap, tag, id, (const enum _cwmp1__SetParameterAttributesStruct_Notification *)ptr, "cwmp:SetParameterAttributesStruct-Notification"); + case SOAP_TYPE_xsd__boolean: + return soap_out_xsd__boolean(soap, tag, id, (const enum xsd__boolean *)ptr, "xsd:boolean"); + case SOAP_TYPE_cwmp1__Inform: + return soap_out_cwmp1__Inform(soap, tag, id, (const struct cwmp1__Inform *)ptr, "cwmp:Inform"); + case SOAP_TYPE_cwmp1__InformResponse: + return soap_out_cwmp1__InformResponse(soap, tag, id, (const struct cwmp1__InformResponse *)ptr, "cwmp:InformResponse"); + case SOAP_TYPE__cwmp1__HoldRequests: + return soap_out__cwmp1__HoldRequests(soap, "cwmp:HoldRequests", id, (const struct _cwmp1__HoldRequests *)ptr, NULL); + case SOAP_TYPE__cwmp1__ID: + return soap_out__cwmp1__ID(soap, "cwmp:ID", id, (const struct _cwmp1__ID *)ptr, NULL); + case SOAP_TYPE__cwmp1__RequestDownloadResponse: + return soap_out__cwmp1__RequestDownloadResponse(soap, "cwmp:RequestDownloadResponse", id, (const struct _cwmp1__RequestDownloadResponse *)ptr, NULL); + case SOAP_TYPE_cwmp1FileTypeArg: + return soap_out_cwmp1FileTypeArg(soap, tag, id, (const struct cwmp1FileTypeArg *)ptr, "cwmp:ArgStruct"); + case SOAP_TYPE__cwmp1__RequestDownload: + return soap_out__cwmp1__RequestDownload(soap, "cwmp:RequestDownload", id, (const struct _cwmp1__RequestDownload *)ptr, NULL); + case SOAP_TYPE__cwmp1__KickedResponse: + return soap_out__cwmp1__KickedResponse(soap, "cwmp:KickedResponse", id, (const struct _cwmp1__KickedResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__Kicked: + return soap_out__cwmp1__Kicked(soap, "cwmp:Kicked", id, (const struct _cwmp1__Kicked *)ptr, NULL); + case SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse: + return soap_out__cwmp1__AutonomousTransferCompleteResponse(soap, "cwmp:AutonomousTransferCompleteResponse", id, (const struct _cwmp1__AutonomousTransferCompleteResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__AutonomousTransferComplete: + return soap_out__cwmp1__AutonomousTransferComplete(soap, "cwmp:AutonomousTransferComplete", id, (const struct _cwmp1__AutonomousTransferComplete *)ptr, NULL); + case SOAP_TYPE__cwmp1__TransferCompleteResponse: + return soap_out__cwmp1__TransferCompleteResponse(soap, "cwmp:TransferCompleteResponse", id, (const struct _cwmp1__TransferCompleteResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__TransferComplete: + return soap_out__cwmp1__TransferComplete(soap, "cwmp:TransferComplete", id, (const struct _cwmp1__TransferComplete *)ptr, NULL); + case SOAP_TYPE__cwmp1__InformResponse: + return soap_out__cwmp1__InformResponse(soap, "cwmp:InformResponse", id, (const struct _cwmp1__InformResponse *)ptr, NULL); + case SOAP_TYPE_cwmp1EventList: + return soap_out_cwmp1EventList(soap, tag, id, (const struct cwmp1EventList *)ptr, "cwmp:EventStruct"); + case SOAP_TYPE__cwmp1__Inform: + return soap_out__cwmp1__Inform(soap, "cwmp:Inform", id, (const struct _cwmp1__Inform *)ptr, NULL); + case SOAP_TYPE_cwmp1AllTransferList: + return soap_out_cwmp1AllTransferList(soap, tag, id, (const struct cwmp1AllTransferList *)ptr, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse: + return soap_out__cwmp1__GetAllQueuedTransfersResponse(soap, "cwmp:GetAllQueuedTransfersResponse", id, (const struct _cwmp1__GetAllQueuedTransfersResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetAllQueuedTransfers: + return soap_out__cwmp1__GetAllQueuedTransfers(soap, "cwmp:GetAllQueuedTransfers", id, (const struct _cwmp1__GetAllQueuedTransfers *)ptr, NULL); + case SOAP_TYPE__cwmp1__FactoryResetResponse: + return soap_out__cwmp1__FactoryResetResponse(soap, "cwmp:FactoryResetResponse", id, (const struct _cwmp1__FactoryResetResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__FactoryReset: + return soap_out__cwmp1__FactoryReset(soap, "cwmp:FactoryReset", id, (const struct _cwmp1__FactoryReset *)ptr, NULL); + case SOAP_TYPE__cwmp1__UploadResponse: + return soap_out__cwmp1__UploadResponse(soap, "cwmp:UploadResponse", id, (const struct _cwmp1__UploadResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__Upload: + return soap_out__cwmp1__Upload(soap, "cwmp:Upload", id, (const struct _cwmp1__Upload *)ptr, NULL); + case SOAP_TYPE_cwmp1OptionList: + return soap_out_cwmp1OptionList(soap, tag, id, (const struct cwmp1OptionList *)ptr, "cwmp:OptionStruct"); + case SOAP_TYPE__cwmp1__GetOptionsResponse: + return soap_out__cwmp1__GetOptionsResponse(soap, "cwmp:GetOptionsResponse", id, (const struct _cwmp1__GetOptionsResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetOptions: + return soap_out__cwmp1__GetOptions(soap, "cwmp:GetOptions", id, (const struct _cwmp1__GetOptions *)ptr, NULL); + case SOAP_TYPE__cwmp1__SetVouchersResponse: + return soap_out__cwmp1__SetVouchersResponse(soap, "cwmp:SetVouchersResponse", id, (const struct _cwmp1__SetVouchersResponse *)ptr, NULL); + case SOAP_TYPE_cwmp1VoucherList: + return soap_out_cwmp1VoucherList(soap, tag, id, (const struct cwmp1VoucherList *)ptr, "SOAP-ENC:base64"); + case SOAP_TYPE__cwmp1__SetVouchers: + return soap_out__cwmp1__SetVouchers(soap, "cwmp:SetVouchers", id, (const struct _cwmp1__SetVouchers *)ptr, NULL); + case SOAP_TYPE__cwmp1__ScheduleInformResponse: + return soap_out__cwmp1__ScheduleInformResponse(soap, "cwmp:ScheduleInformResponse", id, (const struct _cwmp1__ScheduleInformResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__ScheduleInform: + return soap_out__cwmp1__ScheduleInform(soap, "cwmp:ScheduleInform", id, (const struct _cwmp1__ScheduleInform *)ptr, NULL); + case SOAP_TYPE_cwmp1TransferList: + return soap_out_cwmp1TransferList(soap, tag, id, (const struct cwmp1TransferList *)ptr, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE__cwmp1__GetQueuedTransfersResponse: + return soap_out__cwmp1__GetQueuedTransfersResponse(soap, "cwmp:GetQueuedTransfersResponse", id, (const struct _cwmp1__GetQueuedTransfersResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetQueuedTransfers: + return soap_out__cwmp1__GetQueuedTransfers(soap, "cwmp:GetQueuedTransfers", id, (const struct _cwmp1__GetQueuedTransfers *)ptr, NULL); + case SOAP_TYPE__cwmp1__RebootResponse: + return soap_out__cwmp1__RebootResponse(soap, "cwmp:RebootResponse", id, (const struct _cwmp1__RebootResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__Reboot: + return soap_out__cwmp1__Reboot(soap, "cwmp:Reboot", id, (const struct _cwmp1__Reboot *)ptr, NULL); + case SOAP_TYPE__cwmp1__DownloadResponse: + return soap_out__cwmp1__DownloadResponse(soap, "cwmp:DownloadResponse", id, (const struct _cwmp1__DownloadResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__Download: + return soap_out__cwmp1__Download(soap, "cwmp:Download", id, (const struct _cwmp1__Download *)ptr, NULL); + case SOAP_TYPE__cwmp1__DeleteObjectResponse: + return soap_out__cwmp1__DeleteObjectResponse(soap, "cwmp:DeleteObjectResponse", id, (const struct _cwmp1__DeleteObjectResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__DeleteObject: + return soap_out__cwmp1__DeleteObject(soap, "cwmp:DeleteObject", id, (const struct _cwmp1__DeleteObject *)ptr, NULL); + case SOAP_TYPE__cwmp1__AddObjectResponse: + return soap_out__cwmp1__AddObjectResponse(soap, "cwmp:AddObjectResponse", id, (const struct _cwmp1__AddObjectResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__AddObject: + return soap_out__cwmp1__AddObject(soap, "cwmp:AddObject", id, (const struct _cwmp1__AddObject *)ptr, NULL); + case SOAP_TYPE_cwmp1ParameterAttributeList: + return soap_out_cwmp1ParameterAttributeList(soap, tag, id, (const struct cwmp1ParameterAttributeList *)ptr, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE__cwmp1__GetParameterAttributesResponse: + return soap_out__cwmp1__GetParameterAttributesResponse(soap, "cwmp:GetParameterAttributesResponse", id, (const struct _cwmp1__GetParameterAttributesResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetParameterAttributes: + return soap_out__cwmp1__GetParameterAttributes(soap, "cwmp:GetParameterAttributes", id, (const struct _cwmp1__GetParameterAttributes *)ptr, NULL); + case SOAP_TYPE__cwmp1__SetParameterAttributesResponse: + return soap_out__cwmp1__SetParameterAttributesResponse(soap, "cwmp:SetParameterAttributesResponse", id, (const struct _cwmp1__SetParameterAttributesResponse *)ptr, NULL); + case SOAP_TYPE_cwmp1SetParameterAttributesList: + return soap_out_cwmp1SetParameterAttributesList(soap, tag, id, (const struct cwmp1SetParameterAttributesList *)ptr, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE__cwmp1__SetParameterAttributes: + return soap_out__cwmp1__SetParameterAttributes(soap, "cwmp:SetParameterAttributes", id, (const struct _cwmp1__SetParameterAttributes *)ptr, NULL); + case SOAP_TYPE_cwmp1ParameterInfoList: + return soap_out_cwmp1ParameterInfoList(soap, tag, id, (const struct cwmp1ParameterInfoList *)ptr, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE__cwmp1__GetParameterNamesResponse: + return soap_out__cwmp1__GetParameterNamesResponse(soap, "cwmp:GetParameterNamesResponse", id, (const struct _cwmp1__GetParameterNamesResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetParameterNames: + return soap_out__cwmp1__GetParameterNames(soap, "cwmp:GetParameterNames", id, (const struct _cwmp1__GetParameterNames *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetParameterValuesResponse: + return soap_out__cwmp1__GetParameterValuesResponse(soap, "cwmp:GetParameterValuesResponse", id, (const struct _cwmp1__GetParameterValuesResponse *)ptr, NULL); + case SOAP_TYPE_cwmp1ParameterNames: + return soap_out_cwmp1ParameterNames(soap, tag, id, (const struct cwmp1ParameterNames *)ptr, "xsd:string"); + case SOAP_TYPE__cwmp1__GetParameterValues: + return soap_out__cwmp1__GetParameterValues(soap, "cwmp:GetParameterValues", id, (const struct _cwmp1__GetParameterValues *)ptr, NULL); + case SOAP_TYPE__cwmp1__SetParameterValuesResponse: + return soap_out__cwmp1__SetParameterValuesResponse(soap, "cwmp:SetParameterValuesResponse", id, (const struct _cwmp1__SetParameterValuesResponse *)ptr, NULL); + case SOAP_TYPE_cwmp1ParameterValueList: + return soap_out_cwmp1ParameterValueList(soap, tag, id, (const struct cwmp1ParameterValueList *)ptr, "cwmp:ParameterValueStruct"); + case SOAP_TYPE__cwmp1__SetParameterValues: + return soap_out__cwmp1__SetParameterValues(soap, "cwmp:SetParameterValues", id, (const struct _cwmp1__SetParameterValues *)ptr, NULL); + case SOAP_TYPE_cwmp1MethodList: + return soap_out_cwmp1MethodList(soap, tag, id, (const struct cwmp1MethodList *)ptr, "xsd:string"); + case SOAP_TYPE__cwmp1__GetRPCMethodsResponse: + return soap_out__cwmp1__GetRPCMethodsResponse(soap, "cwmp:GetRPCMethodsResponse", id, (const struct _cwmp1__GetRPCMethodsResponse *)ptr, NULL); + case SOAP_TYPE__cwmp1__GetRPCMethods: + return soap_out__cwmp1__GetRPCMethods(soap, "cwmp:GetRPCMethods", id, (const struct _cwmp1__GetRPCMethods *)ptr, NULL); + case SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault: + return soap_out__cwmp1__Fault_SetParameterValuesFault(soap, "cwmp:Fault-SetParameterValuesFault", id, (const struct _cwmp1__Fault_SetParameterValuesFault *)ptr, NULL); + case SOAP_TYPE__cwmp1__Fault: + return soap_out__cwmp1__Fault(soap, "cwmp:Fault", id, (const struct _cwmp1__Fault *)ptr, NULL); + case SOAP_TYPE_cwmp1__OptionStruct: + return soap_out_cwmp1__OptionStruct(soap, tag, id, (const struct cwmp1__OptionStruct *)ptr, "cwmp:OptionStruct"); + case SOAP_TYPE_cwmp1__ArgStruct: + return soap_out_cwmp1__ArgStruct(soap, tag, id, (const struct cwmp1__ArgStruct *)ptr, "cwmp:ArgStruct"); + case SOAP_TYPE_cwmp1__AllQueuedTransferStruct: + return soap_out_cwmp1__AllQueuedTransferStruct(soap, tag, id, (const struct cwmp1__AllQueuedTransferStruct *)ptr, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_cwmp1__QueuedTransferStruct: + return soap_out_cwmp1__QueuedTransferStruct(soap, tag, id, (const struct cwmp1__QueuedTransferStruct *)ptr, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_cwmp1__ParameterAttributeStruct: + return soap_out_cwmp1__ParameterAttributeStruct(soap, tag, id, (const struct cwmp1__ParameterAttributeStruct *)ptr, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_cwmp1AccessList: + return soap_out_cwmp1AccessList(soap, tag, id, (const struct cwmp1AccessList *)ptr, "xsd:string"); + case SOAP_TYPE_cwmp1__SetParameterAttributesStruct: + return soap_out_cwmp1__SetParameterAttributesStruct(soap, tag, id, (const struct cwmp1__SetParameterAttributesStruct *)ptr, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_cwmp1__ParameterInfoStruct: + return soap_out_cwmp1__ParameterInfoStruct(soap, tag, id, (const struct cwmp1__ParameterInfoStruct *)ptr, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_cwmp1__ParameterValueStruct: + return soap_out_cwmp1__ParameterValueStruct(soap, tag, id, (const struct cwmp1__ParameterValueStruct *)ptr, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_cwmp1__EventStruct: + return soap_out_cwmp1__EventStruct(soap, tag, id, (const struct cwmp1__EventStruct *)ptr, "cwmp:EventStruct"); + case SOAP_TYPE_cwmp1__DeviceIdStruct: + return soap_out_cwmp1__DeviceIdStruct(soap, tag, id, (const struct cwmp1__DeviceIdStruct *)ptr, "cwmp:DeviceIdStruct"); + case SOAP_TYPE_cwmp1__FaultStruct: + return soap_out_cwmp1__FaultStruct(soap, tag, id, (const struct cwmp1__FaultStruct *)ptr, "cwmp:FaultStruct"); + case SOAP_TYPE_SOAP_ENC__base64: + return soap_out_SOAP_ENC__base64(soap, tag, id, (const struct SOAP_ENC__base64 *)ptr, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerTounsignedInt: + return soap_out_PointerTounsignedInt(soap, tag, id, (unsigned int *const*)ptr, "xsd:unsignedInt"); + case SOAP_TYPE_PointerToPointerTocwmp1__ArgStruct: + return soap_out_PointerToPointerTocwmp1__ArgStruct(soap, tag, id, (struct cwmp1__ArgStruct **const*)ptr, "cwmp:ArgStruct"); + case SOAP_TYPE_PointerTocwmp1__ArgStruct: + return soap_out_PointerTocwmp1__ArgStruct(soap, tag, id, (struct cwmp1__ArgStruct *const*)ptr, "cwmp:ArgStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__OptionStruct: + return soap_out_PointerToPointerTocwmp1__OptionStruct(soap, tag, id, (struct cwmp1__OptionStruct **const*)ptr, "cwmp:OptionStruct"); + case SOAP_TYPE_PointerTocwmp1__OptionStruct: + return soap_out_PointerTocwmp1__OptionStruct(soap, tag, id, (struct cwmp1__OptionStruct *const*)ptr, "cwmp:OptionStruct"); + case SOAP_TYPE_PointerToPointerToSOAP_ENC__base64: + return soap_out_PointerToPointerToSOAP_ENC__base64(soap, tag, id, (struct SOAP_ENC__base64 **const*)ptr, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerToSOAP_ENC__base64: + return soap_out_PointerToSOAP_ENC__base64(soap, tag, id, (struct SOAP_ENC__base64 *const*)ptr, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerToPointerTocwmp1__AllQueuedTransferStruct: + return soap_out_PointerToPointerTocwmp1__AllQueuedTransferStruct(soap, tag, id, (struct cwmp1__AllQueuedTransferStruct **const*)ptr, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct: + return soap_out_PointerTocwmp1__AllQueuedTransferStruct(soap, tag, id, (struct cwmp1__AllQueuedTransferStruct *const*)ptr, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__QueuedTransferStruct: + return soap_out_PointerToPointerTocwmp1__QueuedTransferStruct(soap, tag, id, (struct cwmp1__QueuedTransferStruct **const*)ptr, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct: + return soap_out_PointerTocwmp1__QueuedTransferStruct(soap, tag, id, (struct cwmp1__QueuedTransferStruct *const*)ptr, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterAttributeStruct: + return soap_out_PointerToPointerTocwmp1__ParameterAttributeStruct(soap, tag, id, (struct cwmp1__ParameterAttributeStruct **const*)ptr, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct: + return soap_out_PointerTocwmp1__ParameterAttributeStruct(soap, tag, id, (struct cwmp1__ParameterAttributeStruct *const*)ptr, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__SetParameterAttributesStruct: + return soap_out_PointerToPointerTocwmp1__SetParameterAttributesStruct(soap, tag, id, (struct cwmp1__SetParameterAttributesStruct **const*)ptr, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct: + return soap_out_PointerTocwmp1__SetParameterAttributesStruct(soap, tag, id, (struct cwmp1__SetParameterAttributesStruct *const*)ptr, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterInfoStruct: + return soap_out_PointerToPointerTocwmp1__ParameterInfoStruct(soap, tag, id, (struct cwmp1__ParameterInfoStruct **const*)ptr, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct: + return soap_out_PointerTocwmp1__ParameterInfoStruct(soap, tag, id, (struct cwmp1__ParameterInfoStruct *const*)ptr, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterValueStruct: + return soap_out_PointerToPointerTocwmp1__ParameterValueStruct(soap, tag, id, (struct cwmp1__ParameterValueStruct **const*)ptr, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_PointerTocwmp1__ParameterValueStruct: + return soap_out_PointerTocwmp1__ParameterValueStruct(soap, tag, id, (struct cwmp1__ParameterValueStruct *const*)ptr, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_PointerToPointerTocwmp1__EventStruct: + return soap_out_PointerToPointerTocwmp1__EventStruct(soap, tag, id, (struct cwmp1__EventStruct **const*)ptr, "cwmp:EventStruct"); + case SOAP_TYPE_PointerTocwmp1__EventStruct: + return soap_out_PointerTocwmp1__EventStruct(soap, tag, id, (struct cwmp1__EventStruct *const*)ptr, "cwmp:EventStruct"); + case SOAP_TYPE_PointerTocwmp1FileTypeArg: + return soap_out_PointerTocwmp1FileTypeArg(soap, tag, id, (struct cwmp1FileTypeArg *const*)ptr, "cwmp:ArgStruct"); + case SOAP_TYPE_PointerTocwmp1__FaultStruct: + return soap_out_PointerTocwmp1__FaultStruct(soap, tag, id, (struct cwmp1__FaultStruct *const*)ptr, "cwmp:FaultStruct"); + case SOAP_TYPE_PointerTocwmp1EventList: + return soap_out_PointerTocwmp1EventList(soap, tag, id, (struct cwmp1EventList *const*)ptr, "cwmp:EventStruct"); + case SOAP_TYPE_PointerTocwmp1__DeviceIdStruct: + return soap_out_PointerTocwmp1__DeviceIdStruct(soap, tag, id, (struct cwmp1__DeviceIdStruct *const*)ptr, "cwmp:DeviceIdStruct"); + case SOAP_TYPE_PointerTocwmp1AllTransferList: + return soap_out_PointerTocwmp1AllTransferList(soap, tag, id, (struct cwmp1AllTransferList *const*)ptr, "cwmp:AllQueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1OptionList: + return soap_out_PointerTocwmp1OptionList(soap, tag, id, (struct cwmp1OptionList *const*)ptr, "cwmp:OptionStruct"); + case SOAP_TYPE_PointerTocwmp1VoucherList: + return soap_out_PointerTocwmp1VoucherList(soap, tag, id, (struct cwmp1VoucherList *const*)ptr, "SOAP-ENC:base64"); + case SOAP_TYPE_PointerTocwmp1TransferList: + return soap_out_PointerTocwmp1TransferList(soap, tag, id, (struct cwmp1TransferList *const*)ptr, "cwmp:QueuedTransferStruct"); + case SOAP_TYPE_PointerTocwmp1ParameterAttributeList: + return soap_out_PointerTocwmp1ParameterAttributeList(soap, tag, id, (struct cwmp1ParameterAttributeList *const*)ptr, "cwmp:ParameterAttributeStruct"); + case SOAP_TYPE_PointerTocwmp1SetParameterAttributesList: + return soap_out_PointerTocwmp1SetParameterAttributesList(soap, tag, id, (struct cwmp1SetParameterAttributesList *const*)ptr, "cwmp:SetParameterAttributesStruct"); + case SOAP_TYPE_PointerTocwmp1ParameterInfoList: + return soap_out_PointerTocwmp1ParameterInfoList(soap, tag, id, (struct cwmp1ParameterInfoList *const*)ptr, "cwmp:ParameterInfoStruct"); + case SOAP_TYPE_PointerTocwmp1ParameterNames: + return soap_out_PointerTocwmp1ParameterNames(soap, tag, id, (struct cwmp1ParameterNames *const*)ptr, "xsd:string"); + case SOAP_TYPE_PointerTocwmp1ParameterValueList: + return soap_out_PointerTocwmp1ParameterValueList(soap, tag, id, (struct cwmp1ParameterValueList *const*)ptr, "cwmp:ParameterValueStruct"); + case SOAP_TYPE_PointerTocwmp1MethodList: + return soap_out_PointerTocwmp1MethodList(soap, tag, id, (struct cwmp1MethodList *const*)ptr, "xsd:string"); + case SOAP_TYPE_PointerTo_cwmp1__Fault_SetParameterValuesFault: + return soap_out_PointerTo_cwmp1__Fault_SetParameterValuesFault(soap, tag, id, (struct _cwmp1__Fault_SetParameterValuesFault *const*)ptr, "cwmp:Fault-SetParameterValuesFault"); + case SOAP_TYPE_PointerTotime: + return soap_out_PointerTotime(soap, tag, id, (time_t *const*)ptr, "xsd:dateTime"); + case SOAP_TYPE_PointerTocwmp1AccessList: + return soap_out_PointerTocwmp1AccessList(soap, tag, id, (struct cwmp1AccessList *const*)ptr, "xsd:string"); + case SOAP_TYPE_PointerTostring: + return soap_out_PointerTostring(soap, tag, id, (char **const*)ptr, "xsd:string"); + case SOAP_TYPE_cwmp1__ObjectNameType: + return soap_out_string(soap, tag, id, (char*const*)&ptr, "cwmp:ObjectNameType"); + case SOAP_TYPE_cwmp1__CommandKeyType: + return soap_out_string(soap, tag, id, (char*const*)&ptr, "cwmp:CommandKeyType"); + case SOAP_TYPE_cwmp1__ParameterKeyType: + return soap_out_string(soap, tag, id, (char*const*)&ptr, "cwmp:ParameterKeyType"); + case SOAP_TYPE_cwmp1__FaultCodeType: + return soap_out_string(soap, tag, id, (char*const*)&ptr, "cwmp:FaultCodeType"); + case SOAP_TYPE_xsd__anySimpleType: + return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:anySimpleType"); + case SOAP_TYPE_PointerTounsignedByte: + return soap_out_PointerTounsignedByte(soap, tag, id, (unsigned char *const*)ptr, "xsd:unsignedByte"); + case SOAP_TYPE__QName: + return soap_out_string(soap, "xsd:QName", id, (char*const*)&ptr, NULL); + case SOAP_TYPE_string: + return soap_out_string(soap, tag, id, (char*const*)&ptr, "xsd:string"); + } + return SOAP_OK; +} +#endif + +#ifndef WITH_NOIDREF +SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type) +{ + (void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ + switch (type) + { + case SOAP_TYPE_cwmp1__Inform: + soap_serialize_cwmp1__Inform(soap, (const struct cwmp1__Inform *)ptr); + break; + case SOAP_TYPE_cwmp1__InformResponse: + soap_serialize_cwmp1__InformResponse(soap, (const struct cwmp1__InformResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__HoldRequests: + soap_serialize__cwmp1__HoldRequests(soap, (const struct _cwmp1__HoldRequests *)ptr); + break; + case SOAP_TYPE__cwmp1__ID: + soap_serialize__cwmp1__ID(soap, (const struct _cwmp1__ID *)ptr); + break; + case SOAP_TYPE__cwmp1__RequestDownloadResponse: + soap_serialize__cwmp1__RequestDownloadResponse(soap, (const struct _cwmp1__RequestDownloadResponse *)ptr); + break; + case SOAP_TYPE_cwmp1FileTypeArg: + soap_serialize_cwmp1FileTypeArg(soap, (const struct cwmp1FileTypeArg *)ptr); + break; + case SOAP_TYPE__cwmp1__RequestDownload: + soap_serialize__cwmp1__RequestDownload(soap, (const struct _cwmp1__RequestDownload *)ptr); + break; + case SOAP_TYPE__cwmp1__KickedResponse: + soap_serialize__cwmp1__KickedResponse(soap, (const struct _cwmp1__KickedResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__Kicked: + soap_serialize__cwmp1__Kicked(soap, (const struct _cwmp1__Kicked *)ptr); + break; + case SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse: + soap_serialize__cwmp1__AutonomousTransferCompleteResponse(soap, (const struct _cwmp1__AutonomousTransferCompleteResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__AutonomousTransferComplete: + soap_serialize__cwmp1__AutonomousTransferComplete(soap, (const struct _cwmp1__AutonomousTransferComplete *)ptr); + break; + case SOAP_TYPE__cwmp1__TransferCompleteResponse: + soap_serialize__cwmp1__TransferCompleteResponse(soap, (const struct _cwmp1__TransferCompleteResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__TransferComplete: + soap_serialize__cwmp1__TransferComplete(soap, (const struct _cwmp1__TransferComplete *)ptr); + break; + case SOAP_TYPE__cwmp1__InformResponse: + soap_serialize__cwmp1__InformResponse(soap, (const struct _cwmp1__InformResponse *)ptr); + break; + case SOAP_TYPE_cwmp1EventList: + soap_serialize_cwmp1EventList(soap, (const struct cwmp1EventList *)ptr); + break; + case SOAP_TYPE__cwmp1__Inform: + soap_serialize__cwmp1__Inform(soap, (const struct _cwmp1__Inform *)ptr); + break; + case SOAP_TYPE_cwmp1AllTransferList: + soap_serialize_cwmp1AllTransferList(soap, (const struct cwmp1AllTransferList *)ptr); + break; + case SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse: + soap_serialize__cwmp1__GetAllQueuedTransfersResponse(soap, (const struct _cwmp1__GetAllQueuedTransfersResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__GetAllQueuedTransfers: + soap_serialize__cwmp1__GetAllQueuedTransfers(soap, (const struct _cwmp1__GetAllQueuedTransfers *)ptr); + break; + case SOAP_TYPE__cwmp1__FactoryResetResponse: + soap_serialize__cwmp1__FactoryResetResponse(soap, (const struct _cwmp1__FactoryResetResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__FactoryReset: + soap_serialize__cwmp1__FactoryReset(soap, (const struct _cwmp1__FactoryReset *)ptr); + break; + case SOAP_TYPE__cwmp1__UploadResponse: + soap_serialize__cwmp1__UploadResponse(soap, (const struct _cwmp1__UploadResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__Upload: + soap_serialize__cwmp1__Upload(soap, (const struct _cwmp1__Upload *)ptr); + break; + case SOAP_TYPE_cwmp1OptionList: + soap_serialize_cwmp1OptionList(soap, (const struct cwmp1OptionList *)ptr); + break; + case SOAP_TYPE__cwmp1__GetOptionsResponse: + soap_serialize__cwmp1__GetOptionsResponse(soap, (const struct _cwmp1__GetOptionsResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__GetOptions: + soap_serialize__cwmp1__GetOptions(soap, (const struct _cwmp1__GetOptions *)ptr); + break; + case SOAP_TYPE__cwmp1__SetVouchersResponse: + soap_serialize__cwmp1__SetVouchersResponse(soap, (const struct _cwmp1__SetVouchersResponse *)ptr); + break; + case SOAP_TYPE_cwmp1VoucherList: + soap_serialize_cwmp1VoucherList(soap, (const struct cwmp1VoucherList *)ptr); + break; + case SOAP_TYPE__cwmp1__SetVouchers: + soap_serialize__cwmp1__SetVouchers(soap, (const struct _cwmp1__SetVouchers *)ptr); + break; + case SOAP_TYPE__cwmp1__ScheduleInformResponse: + soap_serialize__cwmp1__ScheduleInformResponse(soap, (const struct _cwmp1__ScheduleInformResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__ScheduleInform: + soap_serialize__cwmp1__ScheduleInform(soap, (const struct _cwmp1__ScheduleInform *)ptr); + break; + case SOAP_TYPE_cwmp1TransferList: + soap_serialize_cwmp1TransferList(soap, (const struct cwmp1TransferList *)ptr); + break; + case SOAP_TYPE__cwmp1__GetQueuedTransfersResponse: + soap_serialize__cwmp1__GetQueuedTransfersResponse(soap, (const struct _cwmp1__GetQueuedTransfersResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__GetQueuedTransfers: + soap_serialize__cwmp1__GetQueuedTransfers(soap, (const struct _cwmp1__GetQueuedTransfers *)ptr); + break; + case SOAP_TYPE__cwmp1__RebootResponse: + soap_serialize__cwmp1__RebootResponse(soap, (const struct _cwmp1__RebootResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__Reboot: + soap_serialize__cwmp1__Reboot(soap, (const struct _cwmp1__Reboot *)ptr); + break; + case SOAP_TYPE__cwmp1__DownloadResponse: + soap_serialize__cwmp1__DownloadResponse(soap, (const struct _cwmp1__DownloadResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__Download: + soap_serialize__cwmp1__Download(soap, (const struct _cwmp1__Download *)ptr); + break; + case SOAP_TYPE__cwmp1__DeleteObjectResponse: + soap_serialize__cwmp1__DeleteObjectResponse(soap, (const struct _cwmp1__DeleteObjectResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__DeleteObject: + soap_serialize__cwmp1__DeleteObject(soap, (const struct _cwmp1__DeleteObject *)ptr); + break; + case SOAP_TYPE__cwmp1__AddObjectResponse: + soap_serialize__cwmp1__AddObjectResponse(soap, (const struct _cwmp1__AddObjectResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__AddObject: + soap_serialize__cwmp1__AddObject(soap, (const struct _cwmp1__AddObject *)ptr); + break; + case SOAP_TYPE_cwmp1ParameterAttributeList: + soap_serialize_cwmp1ParameterAttributeList(soap, (const struct cwmp1ParameterAttributeList *)ptr); + break; + case SOAP_TYPE__cwmp1__GetParameterAttributesResponse: + soap_serialize__cwmp1__GetParameterAttributesResponse(soap, (const struct _cwmp1__GetParameterAttributesResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__GetParameterAttributes: + soap_serialize__cwmp1__GetParameterAttributes(soap, (const struct _cwmp1__GetParameterAttributes *)ptr); + break; + case SOAP_TYPE__cwmp1__SetParameterAttributesResponse: + soap_serialize__cwmp1__SetParameterAttributesResponse(soap, (const struct _cwmp1__SetParameterAttributesResponse *)ptr); + break; + case SOAP_TYPE_cwmp1SetParameterAttributesList: + soap_serialize_cwmp1SetParameterAttributesList(soap, (const struct cwmp1SetParameterAttributesList *)ptr); + break; + case SOAP_TYPE__cwmp1__SetParameterAttributes: + soap_serialize__cwmp1__SetParameterAttributes(soap, (const struct _cwmp1__SetParameterAttributes *)ptr); + break; + case SOAP_TYPE_cwmp1ParameterInfoList: + soap_serialize_cwmp1ParameterInfoList(soap, (const struct cwmp1ParameterInfoList *)ptr); + break; + case SOAP_TYPE__cwmp1__GetParameterNamesResponse: + soap_serialize__cwmp1__GetParameterNamesResponse(soap, (const struct _cwmp1__GetParameterNamesResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__GetParameterNames: + soap_serialize__cwmp1__GetParameterNames(soap, (const struct _cwmp1__GetParameterNames *)ptr); + break; + case SOAP_TYPE__cwmp1__GetParameterValuesResponse: + soap_serialize__cwmp1__GetParameterValuesResponse(soap, (const struct _cwmp1__GetParameterValuesResponse *)ptr); + break; + case SOAP_TYPE_cwmp1ParameterNames: + soap_serialize_cwmp1ParameterNames(soap, (const struct cwmp1ParameterNames *)ptr); + break; + case SOAP_TYPE__cwmp1__GetParameterValues: + soap_serialize__cwmp1__GetParameterValues(soap, (const struct _cwmp1__GetParameterValues *)ptr); + break; + case SOAP_TYPE__cwmp1__SetParameterValuesResponse: + soap_serialize__cwmp1__SetParameterValuesResponse(soap, (const struct _cwmp1__SetParameterValuesResponse *)ptr); + break; + case SOAP_TYPE_cwmp1ParameterValueList: + soap_serialize_cwmp1ParameterValueList(soap, (const struct cwmp1ParameterValueList *)ptr); + break; + case SOAP_TYPE__cwmp1__SetParameterValues: + soap_serialize__cwmp1__SetParameterValues(soap, (const struct _cwmp1__SetParameterValues *)ptr); + break; + case SOAP_TYPE_cwmp1MethodList: + soap_serialize_cwmp1MethodList(soap, (const struct cwmp1MethodList *)ptr); + break; + case SOAP_TYPE__cwmp1__GetRPCMethodsResponse: + soap_serialize__cwmp1__GetRPCMethodsResponse(soap, (const struct _cwmp1__GetRPCMethodsResponse *)ptr); + break; + case SOAP_TYPE__cwmp1__GetRPCMethods: + soap_serialize__cwmp1__GetRPCMethods(soap, (const struct _cwmp1__GetRPCMethods *)ptr); + break; + case SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault: + soap_serialize__cwmp1__Fault_SetParameterValuesFault(soap, (const struct _cwmp1__Fault_SetParameterValuesFault *)ptr); + break; + case SOAP_TYPE__cwmp1__Fault: + soap_serialize__cwmp1__Fault(soap, (const struct _cwmp1__Fault *)ptr); + break; + case SOAP_TYPE_cwmp1__OptionStruct: + soap_serialize_cwmp1__OptionStruct(soap, (const struct cwmp1__OptionStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__ArgStruct: + soap_serialize_cwmp1__ArgStruct(soap, (const struct cwmp1__ArgStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__AllQueuedTransferStruct: + soap_serialize_cwmp1__AllQueuedTransferStruct(soap, (const struct cwmp1__AllQueuedTransferStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__QueuedTransferStruct: + soap_serialize_cwmp1__QueuedTransferStruct(soap, (const struct cwmp1__QueuedTransferStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__ParameterAttributeStruct: + soap_serialize_cwmp1__ParameterAttributeStruct(soap, (const struct cwmp1__ParameterAttributeStruct *)ptr); + break; + case SOAP_TYPE_cwmp1AccessList: + soap_serialize_cwmp1AccessList(soap, (const struct cwmp1AccessList *)ptr); + break; + case SOAP_TYPE_cwmp1__SetParameterAttributesStruct: + soap_serialize_cwmp1__SetParameterAttributesStruct(soap, (const struct cwmp1__SetParameterAttributesStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__ParameterInfoStruct: + soap_serialize_cwmp1__ParameterInfoStruct(soap, (const struct cwmp1__ParameterInfoStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__ParameterValueStruct: + soap_serialize_cwmp1__ParameterValueStruct(soap, (const struct cwmp1__ParameterValueStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__EventStruct: + soap_serialize_cwmp1__EventStruct(soap, (const struct cwmp1__EventStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__DeviceIdStruct: + soap_serialize_cwmp1__DeviceIdStruct(soap, (const struct cwmp1__DeviceIdStruct *)ptr); + break; + case SOAP_TYPE_cwmp1__FaultStruct: + soap_serialize_cwmp1__FaultStruct(soap, (const struct cwmp1__FaultStruct *)ptr); + break; + case SOAP_TYPE_SOAP_ENC__base64: + soap_serialize_SOAP_ENC__base64(soap, (const struct SOAP_ENC__base64 *)ptr); + break; + case SOAP_TYPE_PointerTounsignedInt: + soap_serialize_PointerTounsignedInt(soap, (unsigned int *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__ArgStruct: + soap_serialize_PointerToPointerTocwmp1__ArgStruct(soap, (struct cwmp1__ArgStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__ArgStruct: + soap_serialize_PointerTocwmp1__ArgStruct(soap, (struct cwmp1__ArgStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__OptionStruct: + soap_serialize_PointerToPointerTocwmp1__OptionStruct(soap, (struct cwmp1__OptionStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__OptionStruct: + soap_serialize_PointerTocwmp1__OptionStruct(soap, (struct cwmp1__OptionStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerToSOAP_ENC__base64: + soap_serialize_PointerToPointerToSOAP_ENC__base64(soap, (struct SOAP_ENC__base64 **const*)ptr); + break; + case SOAP_TYPE_PointerToSOAP_ENC__base64: + soap_serialize_PointerToSOAP_ENC__base64(soap, (struct SOAP_ENC__base64 *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__AllQueuedTransferStruct: + soap_serialize_PointerToPointerTocwmp1__AllQueuedTransferStruct(soap, (struct cwmp1__AllQueuedTransferStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct: + soap_serialize_PointerTocwmp1__AllQueuedTransferStruct(soap, (struct cwmp1__AllQueuedTransferStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__QueuedTransferStruct: + soap_serialize_PointerToPointerTocwmp1__QueuedTransferStruct(soap, (struct cwmp1__QueuedTransferStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct: + soap_serialize_PointerTocwmp1__QueuedTransferStruct(soap, (struct cwmp1__QueuedTransferStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterAttributeStruct: + soap_serialize_PointerToPointerTocwmp1__ParameterAttributeStruct(soap, (struct cwmp1__ParameterAttributeStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct: + soap_serialize_PointerTocwmp1__ParameterAttributeStruct(soap, (struct cwmp1__ParameterAttributeStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__SetParameterAttributesStruct: + soap_serialize_PointerToPointerTocwmp1__SetParameterAttributesStruct(soap, (struct cwmp1__SetParameterAttributesStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct: + soap_serialize_PointerTocwmp1__SetParameterAttributesStruct(soap, (struct cwmp1__SetParameterAttributesStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterInfoStruct: + soap_serialize_PointerToPointerTocwmp1__ParameterInfoStruct(soap, (struct cwmp1__ParameterInfoStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct: + soap_serialize_PointerTocwmp1__ParameterInfoStruct(soap, (struct cwmp1__ParameterInfoStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__ParameterValueStruct: + soap_serialize_PointerToPointerTocwmp1__ParameterValueStruct(soap, (struct cwmp1__ParameterValueStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__ParameterValueStruct: + soap_serialize_PointerTocwmp1__ParameterValueStruct(soap, (struct cwmp1__ParameterValueStruct *const*)ptr); + break; + case SOAP_TYPE_PointerToPointerTocwmp1__EventStruct: + soap_serialize_PointerToPointerTocwmp1__EventStruct(soap, (struct cwmp1__EventStruct **const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__EventStruct: + soap_serialize_PointerTocwmp1__EventStruct(soap, (struct cwmp1__EventStruct *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1FileTypeArg: + soap_serialize_PointerTocwmp1FileTypeArg(soap, (struct cwmp1FileTypeArg *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__FaultStruct: + soap_serialize_PointerTocwmp1__FaultStruct(soap, (struct cwmp1__FaultStruct *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1EventList: + soap_serialize_PointerTocwmp1EventList(soap, (struct cwmp1EventList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1__DeviceIdStruct: + soap_serialize_PointerTocwmp1__DeviceIdStruct(soap, (struct cwmp1__DeviceIdStruct *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1AllTransferList: + soap_serialize_PointerTocwmp1AllTransferList(soap, (struct cwmp1AllTransferList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1OptionList: + soap_serialize_PointerTocwmp1OptionList(soap, (struct cwmp1OptionList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1VoucherList: + soap_serialize_PointerTocwmp1VoucherList(soap, (struct cwmp1VoucherList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1TransferList: + soap_serialize_PointerTocwmp1TransferList(soap, (struct cwmp1TransferList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1ParameterAttributeList: + soap_serialize_PointerTocwmp1ParameterAttributeList(soap, (struct cwmp1ParameterAttributeList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1SetParameterAttributesList: + soap_serialize_PointerTocwmp1SetParameterAttributesList(soap, (struct cwmp1SetParameterAttributesList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1ParameterInfoList: + soap_serialize_PointerTocwmp1ParameterInfoList(soap, (struct cwmp1ParameterInfoList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1ParameterNames: + soap_serialize_PointerTocwmp1ParameterNames(soap, (struct cwmp1ParameterNames *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1ParameterValueList: + soap_serialize_PointerTocwmp1ParameterValueList(soap, (struct cwmp1ParameterValueList *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1MethodList: + soap_serialize_PointerTocwmp1MethodList(soap, (struct cwmp1MethodList *const*)ptr); + break; + case SOAP_TYPE_PointerTo_cwmp1__Fault_SetParameterValuesFault: + soap_serialize_PointerTo_cwmp1__Fault_SetParameterValuesFault(soap, (struct _cwmp1__Fault_SetParameterValuesFault *const*)ptr); + break; + case SOAP_TYPE_PointerTotime: + soap_serialize_PointerTotime(soap, (time_t *const*)ptr); + break; + case SOAP_TYPE_PointerTocwmp1AccessList: + soap_serialize_PointerTocwmp1AccessList(soap, (struct cwmp1AccessList *const*)ptr); + break; + case SOAP_TYPE_PointerTostring: + soap_serialize_PointerTostring(soap, (char **const*)ptr); + break; + case SOAP_TYPE_cwmp1__ObjectNameType: + soap_serialize_string(soap, (char*const*)&ptr); + break; + case SOAP_TYPE_cwmp1__CommandKeyType: + soap_serialize_string(soap, (char*const*)&ptr); + break; + case SOAP_TYPE_cwmp1__ParameterKeyType: + soap_serialize_string(soap, (char*const*)&ptr); + break; + case SOAP_TYPE_cwmp1__FaultCodeType: + soap_serialize_string(soap, (char*const*)&ptr); + break; + case SOAP_TYPE_xsd__anySimpleType: + soap_serialize_string(soap, (char*const*)&ptr); + break; + case SOAP_TYPE_PointerTounsignedByte: + soap_serialize_PointerTounsignedByte(soap, (unsigned char *const*)ptr); + break; + case SOAP_TYPE__QName: + soap_serialize_string(soap, (char*const*)&ptr); + break; + case SOAP_TYPE_string: + soap_serialize_string(soap, (char*const*)&ptr); + break; + } +} +#endif + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_byte(struct soap *soap, char *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_byte + *a = SOAP_DEFAULT_byte; +#else + *a = (char)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_byte); + if (soap_out_byte(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_byte(struct soap *soap, const char *tag, int id, const char *a, const char *type) +{ + return soap_outbyte(soap, tag, id, a, type, SOAP_TYPE_byte); +} + +SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap *soap, char *p, const char *tag, const char *type) +{ + if ((p = soap_in_byte(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap *soap, const char *tag, char *a, const char *type) +{ char *p; + p = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_int(struct soap *soap, int *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_int + *a = SOAP_DEFAULT_int; +#else + *a = (int)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_int); + if (soap_out_int(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *a, const char *type) +{ + return soap_outint(soap, tag, id, a, type, SOAP_TYPE_int); +} + +SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *p, const char *tag, const char *type) +{ + if ((p = soap_in_int(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *a, const char *type) +{ int *p; + p = soap_inint(soap, tag, a, type, SOAP_TYPE_int); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_unsignedByte(struct soap *soap, unsigned char *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_unsignedByte + *a = SOAP_DEFAULT_unsignedByte; +#else + *a = (unsigned char)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_unsignedByte(struct soap *soap, const unsigned char *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_unsignedByte); + if (soap_out_unsignedByte(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_unsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *a, const char *type) +{ + return soap_outunsignedByte(soap, tag, id, a, type, SOAP_TYPE_unsignedByte); +} + +SOAP_FMAC3 unsigned char * SOAP_FMAC4 soap_get_unsignedByte(struct soap *soap, unsigned char *p, const char *tag, const char *type) +{ + if ((p = soap_in_unsignedByte(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 unsigned char * SOAP_FMAC4 soap_in_unsignedByte(struct soap *soap, const char *tag, unsigned char *a, const char *type) +{ unsigned char *p; + p = soap_inunsignedByte(soap, tag, a, type, SOAP_TYPE_unsignedByte); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_unsignedInt(struct soap *soap, unsigned int *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_unsignedInt + *a = SOAP_DEFAULT_unsignedInt; +#else + *a = (unsigned int)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_unsignedInt(struct soap *soap, const unsigned int *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_unsignedInt); + if (soap_out_unsignedInt(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_unsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *a, const char *type) +{ + return soap_outunsignedInt(soap, tag, id, a, type, SOAP_TYPE_unsignedInt); +} + +SOAP_FMAC3 unsigned int * SOAP_FMAC4 soap_get_unsignedInt(struct soap *soap, unsigned int *p, const char *tag, const char *type) +{ + if ((p = soap_in_unsignedInt(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 unsigned int * SOAP_FMAC4 soap_in_unsignedInt(struct soap *soap, const char *tag, unsigned int *a, const char *type) +{ unsigned int *p; + p = soap_inunsignedInt(soap, tag, a, type, SOAP_TYPE_unsignedInt); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_time(struct soap *soap, time_t *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_time + *a = SOAP_DEFAULT_time; +#else + *a = (time_t)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_time(struct soap *soap, const time_t *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_time); + if (soap_out_time(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_time(struct soap *soap, const char *tag, int id, const time_t *a, const char *type) +{ + return soap_outdateTime(soap, tag, id, a, type, SOAP_TYPE_time); +} + +SOAP_FMAC3 time_t * SOAP_FMAC4 soap_get_time(struct soap *soap, time_t *p, const char *tag, const char *type) +{ + if ((p = soap_in_time(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 time_t * SOAP_FMAC4 soap_in_time(struct soap *soap, const char *tag, time_t *a, const char *type) +{ time_t *p; + p = soap_indateTime(soap, tag, a, type, SOAP_TYPE_time); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__UploadResponse_Status(struct soap *soap, enum _cwmp1__UploadResponse_Status *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__UploadResponse_Status + *a = SOAP_DEFAULT__cwmp1__UploadResponse_Status; +#else + *a = (enum _cwmp1__UploadResponse_Status)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__UploadResponse_Status(struct soap *soap, const enum _cwmp1__UploadResponse_Status *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__UploadResponse_Status); + if (soap_out__cwmp1__UploadResponse_Status(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__UploadResponse_Status[] = +{ { (long)_cwmp1__UploadResponse_Status__0, "0" }, + { (long)_cwmp1__UploadResponse_Status__1, "1" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__UploadResponse_Status2s(struct soap *soap, enum _cwmp1__UploadResponse_Status n) +{ const char *s = soap_code_str(soap_codes__cwmp1__UploadResponse_Status, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__UploadResponse_Status(struct soap *soap, const char *tag, int id, const enum _cwmp1__UploadResponse_Status *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__UploadResponse_Status), type) || soap_send(soap, soap__cwmp1__UploadResponse_Status2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__UploadResponse_Status * SOAP_FMAC4 soap_get__cwmp1__UploadResponse_Status(struct soap *soap, enum _cwmp1__UploadResponse_Status *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__UploadResponse_Status(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__UploadResponse_Status(struct soap *soap, const char *s, enum _cwmp1__UploadResponse_Status *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__UploadResponse_Status, s); + if (map) + *a = (enum _cwmp1__UploadResponse_Status)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 1))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__UploadResponse_Status)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__UploadResponse_Status * SOAP_FMAC4 soap_in__cwmp1__UploadResponse_Status(struct soap *soap, const char *tag, enum _cwmp1__UploadResponse_Status *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__UploadResponse_Status *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__UploadResponse_Status, sizeof(enum _cwmp1__UploadResponse_Status), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__UploadResponse_Status(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__UploadResponse_Status *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__UploadResponse_Status, 0, sizeof(enum _cwmp1__UploadResponse_Status), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DownloadResponse_Status(struct soap *soap, enum _cwmp1__DownloadResponse_Status *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__DownloadResponse_Status + *a = SOAP_DEFAULT__cwmp1__DownloadResponse_Status; +#else + *a = (enum _cwmp1__DownloadResponse_Status)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DownloadResponse_Status(struct soap *soap, const enum _cwmp1__DownloadResponse_Status *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__DownloadResponse_Status); + if (soap_out__cwmp1__DownloadResponse_Status(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__DownloadResponse_Status[] = +{ { (long)_cwmp1__DownloadResponse_Status__0, "0" }, + { (long)_cwmp1__DownloadResponse_Status__1, "1" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__DownloadResponse_Status2s(struct soap *soap, enum _cwmp1__DownloadResponse_Status n) +{ const char *s = soap_code_str(soap_codes__cwmp1__DownloadResponse_Status, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DownloadResponse_Status(struct soap *soap, const char *tag, int id, const enum _cwmp1__DownloadResponse_Status *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__DownloadResponse_Status), type) || soap_send(soap, soap__cwmp1__DownloadResponse_Status2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__DownloadResponse_Status * SOAP_FMAC4 soap_get__cwmp1__DownloadResponse_Status(struct soap *soap, enum _cwmp1__DownloadResponse_Status *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__DownloadResponse_Status(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__DownloadResponse_Status(struct soap *soap, const char *s, enum _cwmp1__DownloadResponse_Status *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__DownloadResponse_Status, s); + if (map) + *a = (enum _cwmp1__DownloadResponse_Status)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 1))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__DownloadResponse_Status)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__DownloadResponse_Status * SOAP_FMAC4 soap_in__cwmp1__DownloadResponse_Status(struct soap *soap, const char *tag, enum _cwmp1__DownloadResponse_Status *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__DownloadResponse_Status *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__DownloadResponse_Status, sizeof(enum _cwmp1__DownloadResponse_Status), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__DownloadResponse_Status(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__DownloadResponse_Status *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__DownloadResponse_Status, 0, sizeof(enum _cwmp1__DownloadResponse_Status), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DeleteObjectResponse_Status(struct soap *soap, enum _cwmp1__DeleteObjectResponse_Status *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__DeleteObjectResponse_Status + *a = SOAP_DEFAULT__cwmp1__DeleteObjectResponse_Status; +#else + *a = (enum _cwmp1__DeleteObjectResponse_Status)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DeleteObjectResponse_Status(struct soap *soap, const enum _cwmp1__DeleteObjectResponse_Status *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__DeleteObjectResponse_Status); + if (soap_out__cwmp1__DeleteObjectResponse_Status(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__DeleteObjectResponse_Status[] = +{ { (long)_cwmp1__DeleteObjectResponse_Status__0, "0" }, + { (long)_cwmp1__DeleteObjectResponse_Status__1, "1" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__DeleteObjectResponse_Status2s(struct soap *soap, enum _cwmp1__DeleteObjectResponse_Status n) +{ const char *s = soap_code_str(soap_codes__cwmp1__DeleteObjectResponse_Status, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DeleteObjectResponse_Status(struct soap *soap, const char *tag, int id, const enum _cwmp1__DeleteObjectResponse_Status *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__DeleteObjectResponse_Status), type) || soap_send(soap, soap__cwmp1__DeleteObjectResponse_Status2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__DeleteObjectResponse_Status * SOAP_FMAC4 soap_get__cwmp1__DeleteObjectResponse_Status(struct soap *soap, enum _cwmp1__DeleteObjectResponse_Status *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__DeleteObjectResponse_Status(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__DeleteObjectResponse_Status(struct soap *soap, const char *s, enum _cwmp1__DeleteObjectResponse_Status *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__DeleteObjectResponse_Status, s); + if (map) + *a = (enum _cwmp1__DeleteObjectResponse_Status)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 1))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__DeleteObjectResponse_Status)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__DeleteObjectResponse_Status * SOAP_FMAC4 soap_in__cwmp1__DeleteObjectResponse_Status(struct soap *soap, const char *tag, enum _cwmp1__DeleteObjectResponse_Status *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__DeleteObjectResponse_Status *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__DeleteObjectResponse_Status, sizeof(enum _cwmp1__DeleteObjectResponse_Status), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__DeleteObjectResponse_Status(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__DeleteObjectResponse_Status *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__DeleteObjectResponse_Status, 0, sizeof(enum _cwmp1__DeleteObjectResponse_Status), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AddObjectResponse_Status(struct soap *soap, enum _cwmp1__AddObjectResponse_Status *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__AddObjectResponse_Status + *a = SOAP_DEFAULT__cwmp1__AddObjectResponse_Status; +#else + *a = (enum _cwmp1__AddObjectResponse_Status)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AddObjectResponse_Status(struct soap *soap, const enum _cwmp1__AddObjectResponse_Status *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__AddObjectResponse_Status); + if (soap_out__cwmp1__AddObjectResponse_Status(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__AddObjectResponse_Status[] = +{ { (long)_cwmp1__AddObjectResponse_Status__0, "0" }, + { (long)_cwmp1__AddObjectResponse_Status__1, "1" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__AddObjectResponse_Status2s(struct soap *soap, enum _cwmp1__AddObjectResponse_Status n) +{ const char *s = soap_code_str(soap_codes__cwmp1__AddObjectResponse_Status, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AddObjectResponse_Status(struct soap *soap, const char *tag, int id, const enum _cwmp1__AddObjectResponse_Status *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__AddObjectResponse_Status), type) || soap_send(soap, soap__cwmp1__AddObjectResponse_Status2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__AddObjectResponse_Status * SOAP_FMAC4 soap_get__cwmp1__AddObjectResponse_Status(struct soap *soap, enum _cwmp1__AddObjectResponse_Status *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__AddObjectResponse_Status(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__AddObjectResponse_Status(struct soap *soap, const char *s, enum _cwmp1__AddObjectResponse_Status *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__AddObjectResponse_Status, s); + if (map) + *a = (enum _cwmp1__AddObjectResponse_Status)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 1))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__AddObjectResponse_Status)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__AddObjectResponse_Status * SOAP_FMAC4 soap_in__cwmp1__AddObjectResponse_Status(struct soap *soap, const char *tag, enum _cwmp1__AddObjectResponse_Status *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__AddObjectResponse_Status *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__AddObjectResponse_Status, sizeof(enum _cwmp1__AddObjectResponse_Status), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__AddObjectResponse_Status(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__AddObjectResponse_Status *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__AddObjectResponse_Status, 0, sizeof(enum _cwmp1__AddObjectResponse_Status), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterValuesResponse_Status(struct soap *soap, enum _cwmp1__SetParameterValuesResponse_Status *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__SetParameterValuesResponse_Status + *a = SOAP_DEFAULT__cwmp1__SetParameterValuesResponse_Status; +#else + *a = (enum _cwmp1__SetParameterValuesResponse_Status)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterValuesResponse_Status(struct soap *soap, const enum _cwmp1__SetParameterValuesResponse_Status *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status); + if (soap_out__cwmp1__SetParameterValuesResponse_Status(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__SetParameterValuesResponse_Status[] = +{ { (long)_cwmp1__SetParameterValuesResponse_Status__0, "0" }, + { (long)_cwmp1__SetParameterValuesResponse_Status__1, "1" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__SetParameterValuesResponse_Status2s(struct soap *soap, enum _cwmp1__SetParameterValuesResponse_Status n) +{ const char *s = soap_code_str(soap_codes__cwmp1__SetParameterValuesResponse_Status, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterValuesResponse_Status(struct soap *soap, const char *tag, int id, const enum _cwmp1__SetParameterValuesResponse_Status *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status), type) || soap_send(soap, soap__cwmp1__SetParameterValuesResponse_Status2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__SetParameterValuesResponse_Status * SOAP_FMAC4 soap_get__cwmp1__SetParameterValuesResponse_Status(struct soap *soap, enum _cwmp1__SetParameterValuesResponse_Status *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetParameterValuesResponse_Status(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__SetParameterValuesResponse_Status(struct soap *soap, const char *s, enum _cwmp1__SetParameterValuesResponse_Status *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__SetParameterValuesResponse_Status, s); + if (map) + *a = (enum _cwmp1__SetParameterValuesResponse_Status)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 1))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__SetParameterValuesResponse_Status)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__SetParameterValuesResponse_Status * SOAP_FMAC4 soap_in__cwmp1__SetParameterValuesResponse_Status(struct soap *soap, const char *tag, enum _cwmp1__SetParameterValuesResponse_Status *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__SetParameterValuesResponse_Status *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status, sizeof(enum _cwmp1__SetParameterValuesResponse_Status), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__SetParameterValuesResponse_Status(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__SetParameterValuesResponse_Status *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetParameterValuesResponse_Status, 0, sizeof(enum _cwmp1__SetParameterValuesResponse_Status), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__OptionStruct_IsTransferable(struct soap *soap, enum _cwmp1__OptionStruct_IsTransferable *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__OptionStruct_IsTransferable + *a = SOAP_DEFAULT__cwmp1__OptionStruct_IsTransferable; +#else + *a = (enum _cwmp1__OptionStruct_IsTransferable)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__OptionStruct_IsTransferable(struct soap *soap, const enum _cwmp1__OptionStruct_IsTransferable *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__OptionStruct_IsTransferable); + if (soap_out__cwmp1__OptionStruct_IsTransferable(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__OptionStruct_IsTransferable[] = +{ { (long)_cwmp1__OptionStruct_IsTransferable__0, "0" }, + { (long)_cwmp1__OptionStruct_IsTransferable__1, "1" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__OptionStruct_IsTransferable2s(struct soap *soap, enum _cwmp1__OptionStruct_IsTransferable n) +{ const char *s = soap_code_str(soap_codes__cwmp1__OptionStruct_IsTransferable, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__OptionStruct_IsTransferable(struct soap *soap, const char *tag, int id, const enum _cwmp1__OptionStruct_IsTransferable *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__OptionStruct_IsTransferable), type) || soap_send(soap, soap__cwmp1__OptionStruct_IsTransferable2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__OptionStruct_IsTransferable * SOAP_FMAC4 soap_get__cwmp1__OptionStruct_IsTransferable(struct soap *soap, enum _cwmp1__OptionStruct_IsTransferable *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__OptionStruct_IsTransferable(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__OptionStruct_IsTransferable(struct soap *soap, const char *s, enum _cwmp1__OptionStruct_IsTransferable *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__OptionStruct_IsTransferable, s); + if (map) + *a = (enum _cwmp1__OptionStruct_IsTransferable)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 1))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__OptionStruct_IsTransferable)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__OptionStruct_IsTransferable * SOAP_FMAC4 soap_in__cwmp1__OptionStruct_IsTransferable(struct soap *soap, const char *tag, enum _cwmp1__OptionStruct_IsTransferable *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__OptionStruct_IsTransferable *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__OptionStruct_IsTransferable, sizeof(enum _cwmp1__OptionStruct_IsTransferable), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__OptionStruct_IsTransferable(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__OptionStruct_IsTransferable *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__OptionStruct_IsTransferable, 0, sizeof(enum _cwmp1__OptionStruct_IsTransferable), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__OptionStruct_Mode(struct soap *soap, enum _cwmp1__OptionStruct_Mode *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__OptionStruct_Mode + *a = SOAP_DEFAULT__cwmp1__OptionStruct_Mode; +#else + *a = (enum _cwmp1__OptionStruct_Mode)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__OptionStruct_Mode(struct soap *soap, const enum _cwmp1__OptionStruct_Mode *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__OptionStruct_Mode); + if (soap_out__cwmp1__OptionStruct_Mode(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__OptionStruct_Mode[] = +{ { (long)_cwmp1__OptionStruct_Mode__0, "0" }, + { (long)_cwmp1__OptionStruct_Mode__1, "1" }, + { (long)_cwmp1__OptionStruct_Mode__2, "2" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__OptionStruct_Mode2s(struct soap *soap, enum _cwmp1__OptionStruct_Mode n) +{ const char *s = soap_code_str(soap_codes__cwmp1__OptionStruct_Mode, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__OptionStruct_Mode(struct soap *soap, const char *tag, int id, const enum _cwmp1__OptionStruct_Mode *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__OptionStruct_Mode), type) || soap_send(soap, soap__cwmp1__OptionStruct_Mode2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__OptionStruct_Mode * SOAP_FMAC4 soap_get__cwmp1__OptionStruct_Mode(struct soap *soap, enum _cwmp1__OptionStruct_Mode *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__OptionStruct_Mode(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__OptionStruct_Mode(struct soap *soap, const char *s, enum _cwmp1__OptionStruct_Mode *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__OptionStruct_Mode, s); + if (map) + *a = (enum _cwmp1__OptionStruct_Mode)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 2))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__OptionStruct_Mode)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__OptionStruct_Mode * SOAP_FMAC4 soap_in__cwmp1__OptionStruct_Mode(struct soap *soap, const char *tag, enum _cwmp1__OptionStruct_Mode *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__OptionStruct_Mode *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__OptionStruct_Mode, sizeof(enum _cwmp1__OptionStruct_Mode), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__OptionStruct_Mode(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__OptionStruct_Mode *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__OptionStruct_Mode, 0, sizeof(enum _cwmp1__OptionStruct_Mode), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__OptionStruct_State(struct soap *soap, enum _cwmp1__OptionStruct_State *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__OptionStruct_State + *a = SOAP_DEFAULT__cwmp1__OptionStruct_State; +#else + *a = (enum _cwmp1__OptionStruct_State)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__OptionStruct_State(struct soap *soap, const enum _cwmp1__OptionStruct_State *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__OptionStruct_State); + if (soap_out__cwmp1__OptionStruct_State(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__OptionStruct_State[] = +{ { (long)_cwmp1__OptionStruct_State__0, "0" }, + { (long)_cwmp1__OptionStruct_State__1, "1" }, + { (long)_cwmp1__OptionStruct_State__2, "2" }, + { (long)_cwmp1__OptionStruct_State__3, "3" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__OptionStruct_State2s(struct soap *soap, enum _cwmp1__OptionStruct_State n) +{ const char *s = soap_code_str(soap_codes__cwmp1__OptionStruct_State, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__OptionStruct_State(struct soap *soap, const char *tag, int id, const enum _cwmp1__OptionStruct_State *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__OptionStruct_State), type) || soap_send(soap, soap__cwmp1__OptionStruct_State2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__OptionStruct_State * SOAP_FMAC4 soap_get__cwmp1__OptionStruct_State(struct soap *soap, enum _cwmp1__OptionStruct_State *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__OptionStruct_State(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__OptionStruct_State(struct soap *soap, const char *s, enum _cwmp1__OptionStruct_State *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__OptionStruct_State, s); + if (map) + *a = (enum _cwmp1__OptionStruct_State)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 3))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__OptionStruct_State)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__OptionStruct_State * SOAP_FMAC4 soap_in__cwmp1__OptionStruct_State(struct soap *soap, const char *tag, enum _cwmp1__OptionStruct_State *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__OptionStruct_State *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__OptionStruct_State, sizeof(enum _cwmp1__OptionStruct_State), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__OptionStruct_State(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__OptionStruct_State *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__OptionStruct_State, 0, sizeof(enum _cwmp1__OptionStruct_State), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AllQueuedTransferStruct_State(struct soap *soap, enum _cwmp1__AllQueuedTransferStruct_State *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__AllQueuedTransferStruct_State + *a = SOAP_DEFAULT__cwmp1__AllQueuedTransferStruct_State; +#else + *a = (enum _cwmp1__AllQueuedTransferStruct_State)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AllQueuedTransferStruct_State(struct soap *soap, const enum _cwmp1__AllQueuedTransferStruct_State *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State); + if (soap_out__cwmp1__AllQueuedTransferStruct_State(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__AllQueuedTransferStruct_State[] = +{ { (long)_cwmp1__AllQueuedTransferStruct_State__1, "1" }, + { (long)_cwmp1__AllQueuedTransferStruct_State__2, "2" }, + { (long)_cwmp1__AllQueuedTransferStruct_State__3, "3" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__AllQueuedTransferStruct_State2s(struct soap *soap, enum _cwmp1__AllQueuedTransferStruct_State n) +{ const char *s = soap_code_str(soap_codes__cwmp1__AllQueuedTransferStruct_State, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AllQueuedTransferStruct_State(struct soap *soap, const char *tag, int id, const enum _cwmp1__AllQueuedTransferStruct_State *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State), type) || soap_send(soap, soap__cwmp1__AllQueuedTransferStruct_State2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__AllQueuedTransferStruct_State * SOAP_FMAC4 soap_get__cwmp1__AllQueuedTransferStruct_State(struct soap *soap, enum _cwmp1__AllQueuedTransferStruct_State *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__AllQueuedTransferStruct_State(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__AllQueuedTransferStruct_State(struct soap *soap, const char *s, enum _cwmp1__AllQueuedTransferStruct_State *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__AllQueuedTransferStruct_State, s); + if (map) + *a = (enum _cwmp1__AllQueuedTransferStruct_State)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 3))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__AllQueuedTransferStruct_State)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__AllQueuedTransferStruct_State * SOAP_FMAC4 soap_in__cwmp1__AllQueuedTransferStruct_State(struct soap *soap, const char *tag, enum _cwmp1__AllQueuedTransferStruct_State *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__AllQueuedTransferStruct_State *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State, sizeof(enum _cwmp1__AllQueuedTransferStruct_State), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__AllQueuedTransferStruct_State(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__AllQueuedTransferStruct_State *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__AllQueuedTransferStruct_State, 0, sizeof(enum _cwmp1__AllQueuedTransferStruct_State), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__QueuedTransferStruct_State(struct soap *soap, enum _cwmp1__QueuedTransferStruct_State *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__QueuedTransferStruct_State + *a = SOAP_DEFAULT__cwmp1__QueuedTransferStruct_State; +#else + *a = (enum _cwmp1__QueuedTransferStruct_State)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__QueuedTransferStruct_State(struct soap *soap, const enum _cwmp1__QueuedTransferStruct_State *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__QueuedTransferStruct_State); + if (soap_out__cwmp1__QueuedTransferStruct_State(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__QueuedTransferStruct_State[] = +{ { (long)_cwmp1__QueuedTransferStruct_State__1, "1" }, + { (long)_cwmp1__QueuedTransferStruct_State__2, "2" }, + { (long)_cwmp1__QueuedTransferStruct_State__3, "3" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__QueuedTransferStruct_State2s(struct soap *soap, enum _cwmp1__QueuedTransferStruct_State n) +{ const char *s = soap_code_str(soap_codes__cwmp1__QueuedTransferStruct_State, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__QueuedTransferStruct_State(struct soap *soap, const char *tag, int id, const enum _cwmp1__QueuedTransferStruct_State *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__QueuedTransferStruct_State), type) || soap_send(soap, soap__cwmp1__QueuedTransferStruct_State2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__QueuedTransferStruct_State * SOAP_FMAC4 soap_get__cwmp1__QueuedTransferStruct_State(struct soap *soap, enum _cwmp1__QueuedTransferStruct_State *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__QueuedTransferStruct_State(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__QueuedTransferStruct_State(struct soap *soap, const char *s, enum _cwmp1__QueuedTransferStruct_State *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__QueuedTransferStruct_State, s); + if (map) + *a = (enum _cwmp1__QueuedTransferStruct_State)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 3))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__QueuedTransferStruct_State)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__QueuedTransferStruct_State * SOAP_FMAC4 soap_in__cwmp1__QueuedTransferStruct_State(struct soap *soap, const char *tag, enum _cwmp1__QueuedTransferStruct_State *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__QueuedTransferStruct_State *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__QueuedTransferStruct_State, sizeof(enum _cwmp1__QueuedTransferStruct_State), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__QueuedTransferStruct_State(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__QueuedTransferStruct_State *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__QueuedTransferStruct_State, 0, sizeof(enum _cwmp1__QueuedTransferStruct_State), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ParameterAttributeStruct_Notification(struct soap *soap, enum _cwmp1__ParameterAttributeStruct_Notification *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__ParameterAttributeStruct_Notification + *a = SOAP_DEFAULT__cwmp1__ParameterAttributeStruct_Notification; +#else + *a = (enum _cwmp1__ParameterAttributeStruct_Notification)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ParameterAttributeStruct_Notification(struct soap *soap, const enum _cwmp1__ParameterAttributeStruct_Notification *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification); + if (soap_out__cwmp1__ParameterAttributeStruct_Notification(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__ParameterAttributeStruct_Notification[] = +{ { (long)_cwmp1__ParameterAttributeStruct_Notification__0, "0" }, + { (long)_cwmp1__ParameterAttributeStruct_Notification__1, "1" }, + { (long)_cwmp1__ParameterAttributeStruct_Notification__2, "2" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__ParameterAttributeStruct_Notification2s(struct soap *soap, enum _cwmp1__ParameterAttributeStruct_Notification n) +{ const char *s = soap_code_str(soap_codes__cwmp1__ParameterAttributeStruct_Notification, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ParameterAttributeStruct_Notification(struct soap *soap, const char *tag, int id, const enum _cwmp1__ParameterAttributeStruct_Notification *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification), type) || soap_send(soap, soap__cwmp1__ParameterAttributeStruct_Notification2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__ParameterAttributeStruct_Notification * SOAP_FMAC4 soap_get__cwmp1__ParameterAttributeStruct_Notification(struct soap *soap, enum _cwmp1__ParameterAttributeStruct_Notification *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__ParameterAttributeStruct_Notification(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__ParameterAttributeStruct_Notification(struct soap *soap, const char *s, enum _cwmp1__ParameterAttributeStruct_Notification *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__ParameterAttributeStruct_Notification, s); + if (map) + *a = (enum _cwmp1__ParameterAttributeStruct_Notification)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 2))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__ParameterAttributeStruct_Notification)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__ParameterAttributeStruct_Notification * SOAP_FMAC4 soap_in__cwmp1__ParameterAttributeStruct_Notification(struct soap *soap, const char *tag, enum _cwmp1__ParameterAttributeStruct_Notification *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__ParameterAttributeStruct_Notification *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification, sizeof(enum _cwmp1__ParameterAttributeStruct_Notification), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__ParameterAttributeStruct_Notification(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__ParameterAttributeStruct_Notification *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__ParameterAttributeStruct_Notification, 0, sizeof(enum _cwmp1__ParameterAttributeStruct_Notification), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterAttributesStruct_Notification(struct soap *soap, enum _cwmp1__SetParameterAttributesStruct_Notification *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT__cwmp1__SetParameterAttributesStruct_Notification + *a = SOAP_DEFAULT__cwmp1__SetParameterAttributesStruct_Notification; +#else + *a = (enum _cwmp1__SetParameterAttributesStruct_Notification)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterAttributesStruct_Notification(struct soap *soap, const enum _cwmp1__SetParameterAttributesStruct_Notification *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification); + if (soap_out__cwmp1__SetParameterAttributesStruct_Notification(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes__cwmp1__SetParameterAttributesStruct_Notification[] = +{ { (long)_cwmp1__SetParameterAttributesStruct_Notification__0, "0" }, + { (long)_cwmp1__SetParameterAttributesStruct_Notification__1, "1" }, + { (long)_cwmp1__SetParameterAttributesStruct_Notification__2, "2" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap__cwmp1__SetParameterAttributesStruct_Notification2s(struct soap *soap, enum _cwmp1__SetParameterAttributesStruct_Notification n) +{ const char *s = soap_code_str(soap_codes__cwmp1__SetParameterAttributesStruct_Notification, (long)n); + if (s) + return s; + return soap_long2s(soap, (long)n); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterAttributesStruct_Notification(struct soap *soap, const char *tag, int id, const enum _cwmp1__SetParameterAttributesStruct_Notification *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification), type) || soap_send(soap, soap__cwmp1__SetParameterAttributesStruct_Notification2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum _cwmp1__SetParameterAttributesStruct_Notification * SOAP_FMAC4 soap_get__cwmp1__SetParameterAttributesStruct_Notification(struct soap *soap, enum _cwmp1__SetParameterAttributesStruct_Notification *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetParameterAttributesStruct_Notification(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2_cwmp1__SetParameterAttributesStruct_Notification(struct soap *soap, const char *s, enum _cwmp1__SetParameterAttributesStruct_Notification *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes__cwmp1__SetParameterAttributesStruct_Notification, s); + if (map) + *a = (enum _cwmp1__SetParameterAttributesStruct_Notification)map->code; + else + { long n; + if (soap_s2long(soap, s, &n) || ((soap->mode & SOAP_XML_STRICT) && (n < 0 || n > 2))) + return soap->error = SOAP_TYPE; + *a = (enum _cwmp1__SetParameterAttributesStruct_Notification)n; + } + return SOAP_OK; +} + +SOAP_FMAC3 enum _cwmp1__SetParameterAttributesStruct_Notification * SOAP_FMAC4 soap_in__cwmp1__SetParameterAttributesStruct_Notification(struct soap *soap, const char *tag, enum _cwmp1__SetParameterAttributesStruct_Notification *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (enum _cwmp1__SetParameterAttributesStruct_Notification *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification, sizeof(enum _cwmp1__SetParameterAttributesStruct_Notification), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2_cwmp1__SetParameterAttributesStruct_Notification(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum _cwmp1__SetParameterAttributesStruct_Notification *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetParameterAttributesStruct_Notification, 0, sizeof(enum _cwmp1__SetParameterAttributesStruct_Notification), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__boolean(struct soap *soap, enum xsd__boolean *a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_xsd__boolean + *a = SOAP_DEFAULT_xsd__boolean; +#else + *a = (enum xsd__boolean)0; +#endif +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__boolean(struct soap *soap, const enum xsd__boolean *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_xsd__boolean); + if (soap_out_xsd__boolean(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +static const struct soap_code_map soap_codes_xsd__boolean[] = +{ { (long)xsd__boolean__false_, "false" }, + { (long)xsd__boolean__true_, "true" }, + { 0, NULL } +}; + +SOAP_FMAC3S const char* SOAP_FMAC4S soap_xsd__boolean2s(struct soap *soap, enum xsd__boolean n) +{ return soap_code_str(soap_codes_xsd__boolean, n!=0); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__boolean(struct soap *soap, const char *tag, int id, const enum xsd__boolean *a, const char *type) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__boolean), type) || soap_send(soap, soap_xsd__boolean2s(soap, *a))) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 enum xsd__boolean * SOAP_FMAC4 soap_get_xsd__boolean(struct soap *soap, enum xsd__boolean *p, const char *tag, const char *type) +{ + if ((p = soap_in_xsd__boolean(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3S int SOAP_FMAC4S soap_s2xsd__boolean(struct soap *soap, const char *s, enum xsd__boolean *a) +{ + const struct soap_code_map *map; + if (!s) + return SOAP_OK; + map = soap_code(soap_codes_xsd__boolean, s); + if (map) + *a = (enum xsd__boolean)(map->code != 0); + else + { long n; + if (soap_s2long(soap, s, &n) || n < 0 || n > 1) + return soap->error = SOAP_TYPE; + *a = (enum xsd__boolean)(n != 0); + } + return SOAP_OK; +} + +SOAP_FMAC3 enum xsd__boolean * SOAP_FMAC4 soap_in_xsd__boolean(struct soap *soap, const char *tag, enum xsd__boolean *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; + if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":boolean")) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (enum xsd__boolean *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__boolean, sizeof(enum xsd__boolean), 0, NULL, NULL, NULL); + if (!a) + return NULL; + if (soap->body && !*soap->href) + { if (!a || soap_s2xsd__boolean(soap, soap_value(soap), a) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (enum xsd__boolean *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_xsd__boolean, 0, sizeof(enum xsd__boolean), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default__QName(soap, &a->faultcode); + soap_default_string(soap, &a->faultstring); + soap_default_string(soap, &a->faultactor); + a->detail = NULL; + a->SOAP_ENV__Code = NULL; + a->SOAP_ENV__Reason = NULL; + soap_default_string(soap, &a->SOAP_ENV__Node); + soap_default_string(soap, &a->SOAP_ENV__Role); + a->SOAP_ENV__Detail = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize__QName(soap, &a->faultcode); + soap_serialize_string(soap, &a->faultstring); + soap_serialize_string(soap, &a->faultactor); + soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->detail); + soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Code); + soap_serialize_PointerToSOAP_ENV__Reason(soap, &a->SOAP_ENV__Reason); + soap_serialize_string(soap, &a->SOAP_ENV__Node); + soap_serialize_string(soap, &a->SOAP_ENV__Role); + soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap *soap, const struct SOAP_ENV__Fault *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Fault); + if (soap_out_SOAP_ENV__Fault(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Fault(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Fault *a, const char *type) +{ + const char *soap_tmp_faultcode = soap_QName2s(soap, a->faultcode); + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Fault), type)) + return soap->error; + if (soap_out__QName(soap, "faultcode", -1, (char*const*)&soap_tmp_faultcode, "")) + return soap->error; + if (soap_out_string(soap, "faultstring", -1, &a->faultstring, "")) + return soap->error; + if (soap_out_string(soap, "faultactor", -1, &a->faultactor, "")) + return soap->error; + if (soap_out_PointerToSOAP_ENV__Detail(soap, "detail", -1, &a->detail, "")) + return soap->error; + if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", -1, &a->SOAP_ENV__Code, "")) + return soap->error; + if (soap_out_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", -1, &a->SOAP_ENV__Reason, "")) + return soap->error; + if (soap_out_string(soap, "SOAP-ENV:Node", -1, &a->SOAP_ENV__Node, "")) + return soap->error; + if (soap_out_string(soap, "SOAP-ENV:Role", -1, &a->SOAP_ENV__Role, "")) + return soap->error; + if (soap_out_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", -1, &a->SOAP_ENV__Detail, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p, const char *tag, const char *type) +{ + if ((p = soap_in_SOAP_ENV__Fault(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_in_SOAP_ENV__Fault(struct soap *soap, const char *tag, struct SOAP_ENV__Fault *a, const char *type) +{ + size_t soap_flag_faultcode = 1; + size_t soap_flag_faultstring = 1; + size_t soap_flag_faultactor = 1; + size_t soap_flag_detail = 1; + size_t soap_flag_SOAP_ENV__Code = 1; + size_t soap_flag_SOAP_ENV__Reason = 1; + size_t soap_flag_SOAP_ENV__Node = 1; + size_t soap_flag_SOAP_ENV__Role = 1; + size_t soap_flag_SOAP_ENV__Detail = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct SOAP_ENV__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_SOAP_ENV__Fault(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_faultcode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in__QName(soap, "faultcode", &a->faultcode, "")) + { soap_flag_faultcode--; + continue; + } + if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "faultstring", &a->faultstring, "xsd:string")) + { soap_flag_faultstring--; + continue; + } + if (soap_flag_faultactor && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "faultactor", &a->faultactor, "xsd:string")) + { soap_flag_faultactor--; + continue; + } + if (soap_flag_detail && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerToSOAP_ENV__Detail(soap, "detail", &a->detail, "")) + { soap_flag_detail--; + continue; + } + if (soap_flag_SOAP_ENV__Code && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Code", &a->SOAP_ENV__Code, "")) + { soap_flag_SOAP_ENV__Code--; + continue; + } + if (soap_flag_SOAP_ENV__Reason && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerToSOAP_ENV__Reason(soap, "SOAP-ENV:Reason", &a->SOAP_ENV__Reason, "")) + { soap_flag_SOAP_ENV__Reason--; + continue; + } + if (soap_flag_SOAP_ENV__Node && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "SOAP-ENV:Node", &a->SOAP_ENV__Node, "xsd:string")) + { soap_flag_SOAP_ENV__Node--; + continue; + } + if (soap_flag_SOAP_ENV__Role && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "SOAP-ENV:Role", &a->SOAP_ENV__Role, "xsd:string")) + { soap_flag_SOAP_ENV__Role--; + continue; + } + if (soap_flag_SOAP_ENV__Detail && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerToSOAP_ENV__Detail(soap, "SOAP-ENV:Detail", &a->SOAP_ENV__Detail, "")) + { soap_flag_SOAP_ENV__Detail--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct SOAP_ENV__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Fault, 0, sizeof(struct SOAP_ENV__Fault), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->SOAP_ENV__Text); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->SOAP_ENV__Text); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap *soap, const struct SOAP_ENV__Reason *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Reason); + if (soap_out_SOAP_ENV__Reason(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Reason(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Reason *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Reason), type)) + return soap->error; + if (soap->lang) + soap_set_attr(soap, "xml:lang", soap->lang); + if (soap_out_string(soap, "SOAP-ENV:Text", -1, &a->SOAP_ENV__Text, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p, const char *tag, const char *type) +{ + if ((p = soap_in_SOAP_ENV__Reason(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_in_SOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason *a, const char *type) +{ + size_t soap_flag_SOAP_ENV__Text = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct SOAP_ENV__Reason *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_SOAP_ENV__Reason(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_SOAP_ENV__Text && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "SOAP-ENV:Text", &a->SOAP_ENV__Text, "xsd:string")) + { soap_flag_SOAP_ENV__Text--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct SOAP_ENV__Reason *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Reason, 0, sizeof(struct SOAP_ENV__Reason), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->__type = 0; + a->fault = NULL; + a->__any = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_markelement(soap, a->fault, a->__type); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap *soap, const struct SOAP_ENV__Detail *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Detail); + if (soap_out_SOAP_ENV__Detail(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Detail *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) + return soap->error; + if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) + return soap->error; + soap_outliteral(soap, "-any", &a->__any, NULL); + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p, const char *tag, const char *type) +{ + if ((p = soap_in_SOAP_ENV__Detail(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail *a, const char *type) +{ + size_t soap_flag_fault = 1; + size_t soap_flag___any = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct SOAP_ENV__Detail *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_SOAP_ENV__Detail(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH) + if ((a->fault = soap_getelement(soap, &a->__type))) + { soap_flag_fault = 0; + continue; + } + if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_inliteral(soap, "-any", &a->__any)) + { soap_flag___any--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct SOAP_ENV__Detail *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Detail, 0, sizeof(struct SOAP_ENV__Detail), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default__QName(soap, &a->SOAP_ENV__Value); + a->SOAP_ENV__Subcode = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize__QName(soap, &a->SOAP_ENV__Value); + soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap *soap, const struct SOAP_ENV__Code *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Code); + if (soap_out_SOAP_ENV__Code(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Code(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Code *a, const char *type) +{ + const char *soap_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Code), type)) + return soap->error; + if (soap_out__QName(soap, "SOAP-ENV:Value", -1, (char*const*)&soap_tmp_SOAP_ENV__Value, "")) + return soap->error; + if (soap_out_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", -1, &a->SOAP_ENV__Subcode, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p, const char *tag, const char *type) +{ + if ((p = soap_in_SOAP_ENV__Code(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_in_SOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code *a, const char *type) +{ + size_t soap_flag_SOAP_ENV__Value = 1; + size_t soap_flag_SOAP_ENV__Subcode = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct SOAP_ENV__Code *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_SOAP_ENV__Code(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_SOAP_ENV__Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in__QName(soap, "SOAP-ENV:Value", &a->SOAP_ENV__Value, "")) + { soap_flag_SOAP_ENV__Value--; + continue; + } + if (soap_flag_SOAP_ENV__Subcode && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerToSOAP_ENV__Code(soap, "SOAP-ENV:Subcode", &a->SOAP_ENV__Subcode, "")) + { soap_flag_SOAP_ENV__Subcode--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct SOAP_ENV__Code *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Code, 0, sizeof(struct SOAP_ENV__Code), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap *soap, const struct SOAP_ENV__Header *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_SOAP_ENV__Header); + if (soap_out_SOAP_ENV__Header(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) + return soap->error; + /* KMD */ + if (soap_put__cwmp1__ID(soap, &(a->ID), "cwmp:ID", "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p, const char *tag, const char *type) +{ + if ((p = soap_in_SOAP_ENV__Header(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_in_SOAP_ENV__Header(struct soap *soap, const char *tag, struct SOAP_ENV__Header *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct SOAP_ENV__Header *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_SOAP_ENV__Header(soap, a); + memset(a, 0, sizeof(struct SOAP_ENV__Header)); + soap_get__cwmp1__ID(soap, &(a->ID), "cwmp:ID",""); + soap_get__cwmp1__HoldRequests(soap, &(a->HoldRequests), "cwmp:HoldRequests",""); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, 0, sizeof(struct SOAP_ENV__Header), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__Inform(struct soap *soap, struct cwmp1__Inform *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->DeviceId = NULL; + a->Event = NULL; + soap_default_unsignedInt(soap, &a->MaxEnvelopesI); + soap_default_time(soap, &a->CurrentTime); + soap_default_unsignedInt(soap, &a->RetryCount); + a->ParameterList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__Inform(struct soap *soap, const struct cwmp1__Inform *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1__DeviceIdStruct(soap, &a->DeviceId); + soap_serialize_PointerTocwmp1EventList(soap, &a->Event); + soap_embedded(soap, &a->MaxEnvelopesI, SOAP_TYPE_unsignedInt); + soap_embedded(soap, &a->CurrentTime, SOAP_TYPE_time); + soap_embedded(soap, &a->RetryCount, SOAP_TYPE_unsignedInt); + soap_serialize_PointerTocwmp1ParameterValueList(soap, &a->ParameterList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__Inform(struct soap *soap, const struct cwmp1__Inform *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__Inform); + if (soap_out_cwmp1__Inform(soap, tag, id, a, type)) + return soap->error; + /* KMD */ + return SOAP_OK; + /*return soap_putindependent(soap);*/ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__Inform(struct soap *soap, const char *tag, int id, const struct cwmp1__Inform *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__Inform), type)) + return soap->error; + if (soap_out_PointerTocwmp1__DeviceIdStruct(soap, "DeviceId", -1, &a->DeviceId, "")) + return soap->error; + if (soap_out_PointerTocwmp1EventList(soap, "Event", -1, &a->Event, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "MaxEnvelopes", -1, &a->MaxEnvelopesI, "")) + return soap->error; + if (soap_out_time(soap, "CurrentTime", -1, &a->CurrentTime, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "RetryCount", -1, &a->RetryCount, "")) + return soap->error; + if (soap_out_PointerTocwmp1ParameterValueList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__Inform * SOAP_FMAC4 soap_get_cwmp1__Inform(struct soap *soap, struct cwmp1__Inform *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__Inform(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__Inform * SOAP_FMAC4 soap_in_cwmp1__Inform(struct soap *soap, const char *tag, struct cwmp1__Inform *a, const char *type) +{ + size_t soap_flag_DeviceId = 1; + size_t soap_flag_Event = 1; + size_t soap_flag_MaxEnvelopesI = 1; + size_t soap_flag_CurrentTime = 1; + size_t soap_flag_RetryCount = 1; + size_t soap_flag_ParameterList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__Inform *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__Inform, sizeof(struct cwmp1__Inform), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__Inform(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_DeviceId && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1__DeviceIdStruct(soap, "DeviceId", &a->DeviceId, "cwmp:DeviceIdStruct")) + { soap_flag_DeviceId--; + continue; + } + if (soap_flag_Event && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1EventList(soap, "Event", &a->Event, "cwmp:EventStruct")) + { soap_flag_Event--; + continue; + } + if (soap_flag_MaxEnvelopesI && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "MaxEnvelopesI", &a->MaxEnvelopesI, "xsd:unsignedInt")) + { soap_flag_MaxEnvelopesI--; + continue; + } + if (soap_flag_CurrentTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "CurrentTime", &a->CurrentTime, "xsd:dateTime")) + { soap_flag_CurrentTime--; + continue; + } + if (soap_flag_RetryCount && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "RetryCount", &a->RetryCount, "xsd:unsignedInt")) + { soap_flag_RetryCount--; + continue; + } + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterValueList(soap, "ParameterList", &a->ParameterList, "cwmp:ParameterValueStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__Inform *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__Inform, 0, sizeof(struct cwmp1__Inform), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_MaxEnvelopesI > 0 || soap_flag_CurrentTime > 0 || soap_flag_RetryCount > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__InformResponse(struct soap *soap, struct cwmp1__InformResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->MaxEnvelopesO = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__InformResponse(struct soap *soap, const struct cwmp1__InformResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTounsignedInt(soap, &a->MaxEnvelopesO); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__InformResponse(struct soap *soap, const struct cwmp1__InformResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__InformResponse); + if (soap_out_cwmp1__InformResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__InformResponse(struct soap *soap, const char *tag, int id, const struct cwmp1__InformResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__InformResponse), type)) + return soap->error; + if (soap_out_PointerTounsignedInt(soap, "MaxEnvelopesO", -1, &a->MaxEnvelopesO, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__InformResponse * SOAP_FMAC4 soap_get_cwmp1__InformResponse(struct soap *soap, struct cwmp1__InformResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__InformResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__InformResponse * SOAP_FMAC4 soap_in_cwmp1__InformResponse(struct soap *soap, const char *tag, struct cwmp1__InformResponse *a, const char *type) +{ + size_t soap_flag_MaxEnvelopesO = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__InformResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__InformResponse, sizeof(struct cwmp1__InformResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__InformResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_MaxEnvelopesO && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTounsignedInt(soap, "MaxEnvelopes", &a->MaxEnvelopesO, "xsd:unsignedInt")) + { soap_flag_MaxEnvelopesO--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__InformResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__InformResponse, 0, sizeof(struct cwmp1__InformResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__HoldRequests(struct soap *soap, struct _cwmp1__HoldRequests *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_xsd__boolean(soap, &a->__item); + soap_default_string(soap, &a->SOAP_ENV__mustUnderstand); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__HoldRequests(struct soap *soap, const struct _cwmp1__HoldRequests *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__HoldRequests(struct soap *soap, const struct _cwmp1__HoldRequests *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__HoldRequests); + if (soap_out__cwmp1__HoldRequests(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__HoldRequests(struct soap *soap, const char *tag, int id, const struct _cwmp1__HoldRequests *a, const char *type) +{ + if (a->SOAP_ENV__mustUnderstand) + soap_set_attr(soap, "SOAP-ENV:mustUnderstand", a->SOAP_ENV__mustUnderstand); + return soap_out_xsd__boolean(soap, tag, id, &a->__item, ""); +} + +SOAP_FMAC3 struct _cwmp1__HoldRequests * SOAP_FMAC4 soap_get__cwmp1__HoldRequests(struct soap *soap, struct _cwmp1__HoldRequests *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__HoldRequests(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__HoldRequests * SOAP_FMAC4 soap_in__cwmp1__HoldRequests(struct soap *soap, const char *tag, struct _cwmp1__HoldRequests *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!(a = (struct _cwmp1__HoldRequests *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__HoldRequests, sizeof(struct _cwmp1__HoldRequests), 0, NULL, NULL, NULL))) + return NULL; + soap_revert(soap); + *soap->id = '\0'; + soap_default__cwmp1__HoldRequests(soap, a); + if (soap_s2string(soap, soap_attr_value(soap, "SOAP-ENV:mustUnderstand", 1), &a->SOAP_ENV__mustUnderstand)) + return NULL; + if (!soap_in_xsd__boolean(soap, tag, &a->__item, "")) + return NULL; + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ID(struct soap *soap, struct _cwmp1__ID *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->__item); + soap_default_string(soap, &a->SOAP_ENV__mustUnderstand); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__ID(struct soap *soap, const struct _cwmp1__ID *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->__item); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ID(struct soap *soap, const struct _cwmp1__ID *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__ID); + if (soap_out__cwmp1__ID(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ID(struct soap *soap, const char *tag, int id, const struct _cwmp1__ID *a, const char *type) +{ + if (a->SOAP_ENV__mustUnderstand) + soap_set_attr(soap, "SOAP-ENV:mustUnderstand", a->SOAP_ENV__mustUnderstand); + return soap_out_string(soap, tag, id, &a->__item, ""); +} + +SOAP_FMAC3 struct _cwmp1__ID * SOAP_FMAC4 soap_get__cwmp1__ID(struct soap *soap, struct _cwmp1__ID *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__ID(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__ID * SOAP_FMAC4 soap_in__cwmp1__ID(struct soap *soap, const char *tag, struct _cwmp1__ID *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!(a = (struct _cwmp1__ID *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__ID, sizeof(struct _cwmp1__ID), 0, NULL, NULL, NULL))) + return NULL; + soap_revert(soap); + *soap->id = '\0'; + soap_default__cwmp1__ID(soap, a); + if (soap_s2string(soap, soap_attr_value(soap, "SOAP-ENV:mustUnderstand", 1), &a->SOAP_ENV__mustUnderstand)) + return NULL; + if (!soap_in_string(soap, tag, &a->__item, "")) + return NULL; + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__RequestDownloadResponse(struct soap *soap, struct _cwmp1__RequestDownloadResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__RequestDownloadResponse(struct soap *soap, const struct _cwmp1__RequestDownloadResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__RequestDownloadResponse(struct soap *soap, const struct _cwmp1__RequestDownloadResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__RequestDownloadResponse); + if (soap_out__cwmp1__RequestDownloadResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__RequestDownloadResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__RequestDownloadResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__RequestDownloadResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__RequestDownloadResponse * SOAP_FMAC4 soap_get__cwmp1__RequestDownloadResponse(struct soap *soap, struct _cwmp1__RequestDownloadResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__RequestDownloadResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__RequestDownloadResponse * SOAP_FMAC4 soap_in__cwmp1__RequestDownloadResponse(struct soap *soap, const char *tag, struct _cwmp1__RequestDownloadResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__RequestDownloadResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__RequestDownloadResponse, sizeof(struct _cwmp1__RequestDownloadResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__RequestDownloadResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__RequestDownloadResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__RequestDownloadResponse, 0, sizeof(struct _cwmp1__RequestDownloadResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1FileTypeArg(struct soap *soap, struct cwmp1FileTypeArg *a) +{ + a->__size = 0; + a->__ptrArgStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1FileTypeArg(struct soap *soap, struct cwmp1FileTypeArg const*a) +{ + int i; + if (a->__ptrArgStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrArgStruct, 1, SOAP_TYPE_cwmp1FileTypeArg)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__ArgStruct(soap, a->__ptrArgStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1FileTypeArg(struct soap *soap, const struct cwmp1FileTypeArg *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrArgStruct, 1, tag, SOAP_TYPE_cwmp1FileTypeArg); + if (soap_out_cwmp1FileTypeArg(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1FileTypeArg(struct soap *soap, const char *tag, int id, const struct cwmp1FileTypeArg *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrArgStruct ? soap_putsize(soap, "cwmp:ArgStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrArgStruct, 1, type, SOAP_TYPE_cwmp1FileTypeArg); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__ArgStruct(soap, "ArgStruct", -1, &a->__ptrArgStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1FileTypeArg * SOAP_FMAC4 soap_get_cwmp1FileTypeArg(struct soap *soap, struct cwmp1FileTypeArg *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1FileTypeArg(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1FileTypeArg * SOAP_FMAC4 soap_in_cwmp1FileTypeArg(struct soap *soap, const char *tag, struct cwmp1FileTypeArg *a, const char *type) +{ int i, j; + struct cwmp1__ArgStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1FileTypeArg *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1FileTypeArg, sizeof(struct cwmp1FileTypeArg), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1FileTypeArg(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrArgStruct = (struct cwmp1__ArgStruct **)soap_malloc(soap, sizeof(struct cwmp1__ArgStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrArgStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__ArgStruct(soap, NULL, a->__ptrArgStruct + i, "cwmp:ArgStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__ArgStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__ArgStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__ArgStruct(soap, NULL, p, "cwmp:ArgStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrArgStruct = (struct cwmp1__ArgStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrArgStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1FileTypeArg *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1FileTypeArg, 0, sizeof(struct cwmp1FileTypeArg), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__RequestDownload(struct soap *soap, struct _cwmp1__RequestDownload *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->FileType); + a->FileTypeArg = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__RequestDownload(struct soap *soap, const struct _cwmp1__RequestDownload *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->FileType); + soap_serialize_PointerTocwmp1FileTypeArg(soap, &a->FileTypeArg); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__RequestDownload(struct soap *soap, const struct _cwmp1__RequestDownload *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__RequestDownload); + if (soap_out__cwmp1__RequestDownload(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__RequestDownload(struct soap *soap, const char *tag, int id, const struct _cwmp1__RequestDownload *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__RequestDownload), type)) + return soap->error; + if (soap_out_string(soap, "FileType", -1, &a->FileType, "")) + return soap->error; + if (soap_out_PointerTocwmp1FileTypeArg(soap, "FileTypeArg", -1, &a->FileTypeArg, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__RequestDownload * SOAP_FMAC4 soap_get__cwmp1__RequestDownload(struct soap *soap, struct _cwmp1__RequestDownload *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__RequestDownload(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__RequestDownload * SOAP_FMAC4 soap_in__cwmp1__RequestDownload(struct soap *soap, const char *tag, struct _cwmp1__RequestDownload *a, const char *type) +{ + size_t soap_flag_FileType = 1; + size_t soap_flag_FileTypeArg = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__RequestDownload *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__RequestDownload, sizeof(struct _cwmp1__RequestDownload), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__RequestDownload(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_FileType && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FileType", &a->FileType, "xsd:string")) + { soap_flag_FileType--; + continue; + } + if (soap_flag_FileTypeArg && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1FileTypeArg(soap, "FileTypeArg", &a->FileTypeArg, "cwmp:ArgStruct")) + { soap_flag_FileTypeArg--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__RequestDownload *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__RequestDownload, 0, sizeof(struct _cwmp1__RequestDownload), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_FileType > 0 || soap_flag_FileTypeArg > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__KickedResponse(struct soap *soap, struct _cwmp1__KickedResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->NextURL); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__KickedResponse(struct soap *soap, const struct _cwmp1__KickedResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->NextURL); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__KickedResponse(struct soap *soap, const struct _cwmp1__KickedResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__KickedResponse); + if (soap_out__cwmp1__KickedResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__KickedResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__KickedResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__KickedResponse), type)) + return soap->error; + if (soap_out_string(soap, "NextURL", -1, &a->NextURL, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__KickedResponse * SOAP_FMAC4 soap_get__cwmp1__KickedResponse(struct soap *soap, struct _cwmp1__KickedResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__KickedResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__KickedResponse * SOAP_FMAC4 soap_in__cwmp1__KickedResponse(struct soap *soap, const char *tag, struct _cwmp1__KickedResponse *a, const char *type) +{ + size_t soap_flag_NextURL = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__KickedResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__KickedResponse, sizeof(struct _cwmp1__KickedResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__KickedResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_NextURL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "NextURL", &a->NextURL, "xsd:string")) + { soap_flag_NextURL--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__KickedResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__KickedResponse, 0, sizeof(struct _cwmp1__KickedResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_NextURL > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Kicked(struct soap *soap, struct _cwmp1__Kicked *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->Command); + soap_default_string(soap, &a->Referer); + soap_default_string(soap, &a->Arg); + soap_default_string(soap, &a->Next); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Kicked(struct soap *soap, const struct _cwmp1__Kicked *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->Command); + soap_serialize_string(soap, &a->Referer); + soap_serialize_string(soap, &a->Arg); + soap_serialize_string(soap, &a->Next); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Kicked(struct soap *soap, const struct _cwmp1__Kicked *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Kicked); + if (soap_out__cwmp1__Kicked(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Kicked(struct soap *soap, const char *tag, int id, const struct _cwmp1__Kicked *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Kicked), type)) + return soap->error; + if (soap_out_string(soap, "Command", -1, &a->Command, "")) + return soap->error; + if (soap_out_string(soap, "Referer", -1, &a->Referer, "")) + return soap->error; + if (soap_out_string(soap, "Arg", -1, &a->Arg, "")) + return soap->error; + if (soap_out_string(soap, "Next", -1, &a->Next, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Kicked * SOAP_FMAC4 soap_get__cwmp1__Kicked(struct soap *soap, struct _cwmp1__Kicked *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Kicked(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Kicked * SOAP_FMAC4 soap_in__cwmp1__Kicked(struct soap *soap, const char *tag, struct _cwmp1__Kicked *a, const char *type) +{ + size_t soap_flag_Command = 1; + size_t soap_flag_Referer = 1; + size_t soap_flag_Arg = 1; + size_t soap_flag_Next = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Kicked *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Kicked, sizeof(struct _cwmp1__Kicked), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Kicked(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Command && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Command", &a->Command, "xsd:string")) + { soap_flag_Command--; + continue; + } + if (soap_flag_Referer && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Referer", &a->Referer, "xsd:string")) + { soap_flag_Referer--; + continue; + } + if (soap_flag_Arg && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Arg", &a->Arg, "xsd:string")) + { soap_flag_Arg--; + continue; + } + if (soap_flag_Next && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Next", &a->Next, "xsd:string")) + { soap_flag_Next--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Kicked *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Kicked, 0, sizeof(struct _cwmp1__Kicked), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Command > 0 || soap_flag_Referer > 0 || soap_flag_Arg > 0 || soap_flag_Next > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AutonomousTransferCompleteResponse(struct soap *soap, struct _cwmp1__AutonomousTransferCompleteResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AutonomousTransferCompleteResponse(struct soap *soap, const struct _cwmp1__AutonomousTransferCompleteResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AutonomousTransferCompleteResponse(struct soap *soap, const struct _cwmp1__AutonomousTransferCompleteResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse); + if (soap_out__cwmp1__AutonomousTransferCompleteResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AutonomousTransferCompleteResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__AutonomousTransferCompleteResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__AutonomousTransferCompleteResponse * SOAP_FMAC4 soap_get__cwmp1__AutonomousTransferCompleteResponse(struct soap *soap, struct _cwmp1__AutonomousTransferCompleteResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__AutonomousTransferCompleteResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__AutonomousTransferCompleteResponse * SOAP_FMAC4 soap_in__cwmp1__AutonomousTransferCompleteResponse(struct soap *soap, const char *tag, struct _cwmp1__AutonomousTransferCompleteResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__AutonomousTransferCompleteResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse, sizeof(struct _cwmp1__AutonomousTransferCompleteResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__AutonomousTransferCompleteResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__AutonomousTransferCompleteResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__AutonomousTransferCompleteResponse, 0, sizeof(struct _cwmp1__AutonomousTransferCompleteResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AutonomousTransferComplete(struct soap *soap, struct _cwmp1__AutonomousTransferComplete *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->AnnounceURL); + soap_default_string(soap, &a->TransferURL); + soap_default_xsd__boolean(soap, &a->IsDownload); + soap_default_string(soap, &a->FileType); + soap_default_unsignedInt(soap, &a->FileSize); + soap_default_string(soap, &a->TargetFileName); + a->FaultStruct = NULL; + soap_default_time(soap, &a->StartTime); + soap_default_time(soap, &a->CompleteTime); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AutonomousTransferComplete(struct soap *soap, const struct _cwmp1__AutonomousTransferComplete *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->AnnounceURL); + soap_serialize_string(soap, &a->TransferURL); + soap_serialize_string(soap, &a->FileType); + soap_embedded(soap, &a->FileSize, SOAP_TYPE_unsignedInt); + soap_serialize_string(soap, &a->TargetFileName); + soap_serialize_PointerTocwmp1__FaultStruct(soap, &a->FaultStruct); + soap_embedded(soap, &a->StartTime, SOAP_TYPE_time); + soap_embedded(soap, &a->CompleteTime, SOAP_TYPE_time); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AutonomousTransferComplete(struct soap *soap, const struct _cwmp1__AutonomousTransferComplete *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__AutonomousTransferComplete); + if (soap_out__cwmp1__AutonomousTransferComplete(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AutonomousTransferComplete(struct soap *soap, const char *tag, int id, const struct _cwmp1__AutonomousTransferComplete *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__AutonomousTransferComplete), type)) + return soap->error; + if (soap_out_string(soap, "AnnounceURL", -1, &a->AnnounceURL, "")) + return soap->error; + if (soap_out_string(soap, "TransferURL", -1, &a->TransferURL, "")) + return soap->error; + if (soap_out_xsd__boolean(soap, "IsDownload", -1, &a->IsDownload, "")) + return soap->error; + if (soap_out_string(soap, "FileType", -1, &a->FileType, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "FileSize", -1, &a->FileSize, "")) + return soap->error; + if (soap_out_string(soap, "TargetFileName", -1, &a->TargetFileName, "")) + return soap->error; + if (soap_out_PointerTocwmp1__FaultStruct(soap, "FaultStruct", -1, &a->FaultStruct, "")) + return soap->error; + if (soap_out_time(soap, "StartTime", -1, &a->StartTime, "")) + return soap->error; + if (soap_out_time(soap, "CompleteTime", -1, &a->CompleteTime, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__AutonomousTransferComplete * SOAP_FMAC4 soap_get__cwmp1__AutonomousTransferComplete(struct soap *soap, struct _cwmp1__AutonomousTransferComplete *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__AutonomousTransferComplete(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__AutonomousTransferComplete * SOAP_FMAC4 soap_in__cwmp1__AutonomousTransferComplete(struct soap *soap, const char *tag, struct _cwmp1__AutonomousTransferComplete *a, const char *type) +{ + size_t soap_flag_AnnounceURL = 1; + size_t soap_flag_TransferURL = 1; + size_t soap_flag_IsDownload = 1; + size_t soap_flag_FileType = 1; + size_t soap_flag_FileSize = 1; + size_t soap_flag_TargetFileName = 1; + size_t soap_flag_FaultStruct = 1; + size_t soap_flag_StartTime = 1; + size_t soap_flag_CompleteTime = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__AutonomousTransferComplete *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__AutonomousTransferComplete, sizeof(struct _cwmp1__AutonomousTransferComplete), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__AutonomousTransferComplete(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_AnnounceURL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "AnnounceURL", &a->AnnounceURL, "xsd:string")) + { soap_flag_AnnounceURL--; + continue; + } + if (soap_flag_TransferURL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "TransferURL", &a->TransferURL, "xsd:string")) + { soap_flag_TransferURL--; + continue; + } + if (soap_flag_IsDownload && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_xsd__boolean(soap, "IsDownload", &a->IsDownload, "xsd:boolean")) + { soap_flag_IsDownload--; + continue; + } + if (soap_flag_FileType && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FileType", &a->FileType, "xsd:string")) + { soap_flag_FileType--; + continue; + } + if (soap_flag_FileSize && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "FileSize", &a->FileSize, "xsd:unsignedInt")) + { soap_flag_FileSize--; + continue; + } + if (soap_flag_TargetFileName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "TargetFileName", &a->TargetFileName, "xsd:string")) + { soap_flag_TargetFileName--; + continue; + } + if (soap_flag_FaultStruct && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1__FaultStruct(soap, "FaultStruct", &a->FaultStruct, "cwmp:FaultStruct")) + { soap_flag_FaultStruct--; + continue; + } + if (soap_flag_StartTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "StartTime", &a->StartTime, "xsd:dateTime")) + { soap_flag_StartTime--; + continue; + } + if (soap_flag_CompleteTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "CompleteTime", &a->CompleteTime, "xsd:dateTime")) + { soap_flag_CompleteTime--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__AutonomousTransferComplete *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__AutonomousTransferComplete, 0, sizeof(struct _cwmp1__AutonomousTransferComplete), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_AnnounceURL > 0 || soap_flag_TransferURL > 0 || soap_flag_IsDownload > 0 || soap_flag_FileType > 0 || soap_flag_FileSize > 0 || soap_flag_TargetFileName > 0 || soap_flag_FaultStruct > 0 || soap_flag_StartTime > 0 || soap_flag_CompleteTime > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__TransferCompleteResponse(struct soap *soap, struct _cwmp1__TransferCompleteResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__TransferCompleteResponse(struct soap *soap, const struct _cwmp1__TransferCompleteResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__TransferCompleteResponse(struct soap *soap, const struct _cwmp1__TransferCompleteResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__TransferCompleteResponse); + if (soap_out__cwmp1__TransferCompleteResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__TransferCompleteResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__TransferCompleteResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__TransferCompleteResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__TransferCompleteResponse * SOAP_FMAC4 soap_get__cwmp1__TransferCompleteResponse(struct soap *soap, struct _cwmp1__TransferCompleteResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__TransferCompleteResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__TransferCompleteResponse * SOAP_FMAC4 soap_in__cwmp1__TransferCompleteResponse(struct soap *soap, const char *tag, struct _cwmp1__TransferCompleteResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__TransferCompleteResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__TransferCompleteResponse, sizeof(struct _cwmp1__TransferCompleteResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__TransferCompleteResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__TransferCompleteResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__TransferCompleteResponse, 0, sizeof(struct _cwmp1__TransferCompleteResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__TransferComplete(struct soap *soap, struct _cwmp1__TransferComplete *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); + a->FaultStruct = NULL; + soap_default_time(soap, &a->StartTime); + soap_default_time(soap, &a->CompleteTime); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__TransferComplete(struct soap *soap, const struct _cwmp1__TransferComplete *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_serialize_PointerTocwmp1__FaultStruct(soap, &a->FaultStruct); + soap_embedded(soap, &a->StartTime, SOAP_TYPE_time); + soap_embedded(soap, &a->CompleteTime, SOAP_TYPE_time); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__TransferComplete(struct soap *soap, const struct _cwmp1__TransferComplete *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__TransferComplete); + if (soap_out__cwmp1__TransferComplete(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__TransferComplete(struct soap *soap, const char *tag, int id, const struct _cwmp1__TransferComplete *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__TransferComplete), type)) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + if (soap_out_PointerTocwmp1__FaultStruct(soap, "FaultStruct", -1, &a->FaultStruct, "")) + return soap->error; + if (soap_out_time(soap, "StartTime", -1, &a->StartTime, "")) + return soap->error; + if (soap_out_time(soap, "CompleteTime", -1, &a->CompleteTime, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__TransferComplete * SOAP_FMAC4 soap_get__cwmp1__TransferComplete(struct soap *soap, struct _cwmp1__TransferComplete *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__TransferComplete(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__TransferComplete * SOAP_FMAC4 soap_in__cwmp1__TransferComplete(struct soap *soap, const char *tag, struct _cwmp1__TransferComplete *a, const char *type) +{ + size_t soap_flag_CommandKey = 1; + size_t soap_flag_FaultStruct = 1; + size_t soap_flag_StartTime = 1; + size_t soap_flag_CompleteTime = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__TransferComplete *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__TransferComplete, sizeof(struct _cwmp1__TransferComplete), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__TransferComplete(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap_flag_FaultStruct && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1__FaultStruct(soap, "FaultStruct", &a->FaultStruct, "cwmp:FaultStruct")) + { soap_flag_FaultStruct--; + continue; + } + if (soap_flag_StartTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "StartTime", &a->StartTime, "xsd:dateTime")) + { soap_flag_StartTime--; + continue; + } + if (soap_flag_CompleteTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "CompleteTime", &a->CompleteTime, "xsd:dateTime")) + { soap_flag_CompleteTime--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__TransferComplete *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__TransferComplete, 0, sizeof(struct _cwmp1__TransferComplete), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_CommandKey > 0 || soap_flag_FaultStruct > 0 || soap_flag_StartTime > 0 || soap_flag_CompleteTime > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__InformResponse(struct soap *soap, struct _cwmp1__InformResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_unsignedInt(soap, &a->MaxEnvelopes); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__InformResponse(struct soap *soap, const struct _cwmp1__InformResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_embedded(soap, &a->MaxEnvelopes, SOAP_TYPE_unsignedInt); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__InformResponse(struct soap *soap, const struct _cwmp1__InformResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__InformResponse); + if (soap_out__cwmp1__InformResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__InformResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__InformResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__InformResponse), type)) + return soap->error; + if (soap_out_unsignedInt(soap, "MaxEnvelopes", -1, &a->MaxEnvelopes, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__InformResponse * SOAP_FMAC4 soap_get__cwmp1__InformResponse(struct soap *soap, struct _cwmp1__InformResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__InformResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__InformResponse * SOAP_FMAC4 soap_in__cwmp1__InformResponse(struct soap *soap, const char *tag, struct _cwmp1__InformResponse *a, const char *type) +{ + size_t soap_flag_MaxEnvelopes = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__InformResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__InformResponse, sizeof(struct _cwmp1__InformResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__InformResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_MaxEnvelopes && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "MaxEnvelopes", &a->MaxEnvelopes, "xsd:unsignedInt")) + { soap_flag_MaxEnvelopes--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__InformResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__InformResponse, 0, sizeof(struct _cwmp1__InformResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_MaxEnvelopes > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1EventList(struct soap *soap, struct cwmp1EventList *a) +{ + a->__size = 0; + a->__ptrEventStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1EventList(struct soap *soap, struct cwmp1EventList const*a) +{ + int i; + if (a->__ptrEventStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrEventStruct, 1, SOAP_TYPE_cwmp1EventList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__EventStruct(soap, a->__ptrEventStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1EventList(struct soap *soap, const struct cwmp1EventList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrEventStruct, 1, tag, SOAP_TYPE_cwmp1EventList); + if (soap_out_cwmp1EventList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1EventList(struct soap *soap, const char *tag, int id, const struct cwmp1EventList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrEventStruct ? soap_putsize(soap, "cwmp:EventStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrEventStruct, 1, type, SOAP_TYPE_cwmp1EventList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__EventStruct(soap, "EventStruct", -1, &a->__ptrEventStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1EventList * SOAP_FMAC4 soap_get_cwmp1EventList(struct soap *soap, struct cwmp1EventList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1EventList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1EventList * SOAP_FMAC4 soap_in_cwmp1EventList(struct soap *soap, const char *tag, struct cwmp1EventList *a, const char *type) +{ int i, j; + struct cwmp1__EventStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1EventList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1EventList, sizeof(struct cwmp1EventList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1EventList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrEventStruct = (struct cwmp1__EventStruct **)soap_malloc(soap, sizeof(struct cwmp1__EventStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrEventStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__EventStruct(soap, NULL, a->__ptrEventStruct + i, "cwmp:EventStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__EventStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__EventStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__EventStruct(soap, NULL, p, "cwmp:EventStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrEventStruct = (struct cwmp1__EventStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrEventStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1EventList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1EventList, 0, sizeof(struct cwmp1EventList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Inform(struct soap *soap, struct _cwmp1__Inform *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->DeviceId = NULL; + a->Event = NULL; + soap_default_unsignedInt(soap, &a->MaxEnvelopes); + soap_default_time(soap, &a->CurrentTime); + soap_default_unsignedInt(soap, &a->RetryCount); + a->ParameterList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Inform(struct soap *soap, const struct _cwmp1__Inform *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1__DeviceIdStruct(soap, &a->DeviceId); + soap_serialize_PointerTocwmp1EventList(soap, &a->Event); + soap_embedded(soap, &a->MaxEnvelopes, SOAP_TYPE_unsignedInt); + soap_embedded(soap, &a->CurrentTime, SOAP_TYPE_time); + soap_embedded(soap, &a->RetryCount, SOAP_TYPE_unsignedInt); + soap_serialize_PointerTocwmp1ParameterValueList(soap, &a->ParameterList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Inform(struct soap *soap, const struct _cwmp1__Inform *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Inform); + if (soap_out__cwmp1__Inform(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Inform(struct soap *soap, const char *tag, int id, const struct _cwmp1__Inform *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Inform), type)) + return soap->error; + if (soap_out_PointerTocwmp1__DeviceIdStruct(soap, "DeviceId", -1, &a->DeviceId, "")) + return soap->error; + if (soap_out_PointerTocwmp1EventList(soap, "Event", -1, &a->Event, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "MaxEnvelopes", -1, &a->MaxEnvelopes, "")) + return soap->error; + if (soap_out_time(soap, "CurrentTime", -1, &a->CurrentTime, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "RetryCount", -1, &a->RetryCount, "")) + return soap->error; + if (soap_out_PointerTocwmp1ParameterValueList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Inform * SOAP_FMAC4 soap_get__cwmp1__Inform(struct soap *soap, struct _cwmp1__Inform *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Inform(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Inform * SOAP_FMAC4 soap_in__cwmp1__Inform(struct soap *soap, const char *tag, struct _cwmp1__Inform *a, const char *type) +{ + size_t soap_flag_DeviceId = 1; + size_t soap_flag_Event = 1; + size_t soap_flag_MaxEnvelopes = 1; + size_t soap_flag_CurrentTime = 1; + size_t soap_flag_RetryCount = 1; + size_t soap_flag_ParameterList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Inform *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Inform, sizeof(struct _cwmp1__Inform), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Inform(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_DeviceId && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1__DeviceIdStruct(soap, "DeviceId", &a->DeviceId, "cwmp:DeviceIdStruct")) + { soap_flag_DeviceId--; + continue; + } + if (soap_flag_Event && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1EventList(soap, "Event", &a->Event, "cwmp:EventStruct")) + { soap_flag_Event--; + continue; + } + if (soap_flag_MaxEnvelopes && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "MaxEnvelopes", &a->MaxEnvelopes, "xsd:unsignedInt")) + { soap_flag_MaxEnvelopes--; + continue; + } + if (soap_flag_CurrentTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "CurrentTime", &a->CurrentTime, "xsd:dateTime")) + { soap_flag_CurrentTime--; + continue; + } + if (soap_flag_RetryCount && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "RetryCount", &a->RetryCount, "xsd:unsignedInt")) + { soap_flag_RetryCount--; + continue; + } + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterValueList(soap, "ParameterList", &a->ParameterList, "cwmp:ParameterValueStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Inform *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Inform, 0, sizeof(struct _cwmp1__Inform), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_DeviceId > 0 || soap_flag_Event > 0 || soap_flag_MaxEnvelopes > 0 || soap_flag_CurrentTime > 0 || soap_flag_RetryCount > 0 || soap_flag_ParameterList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1AllTransferList(struct soap *soap, struct cwmp1AllTransferList *a) +{ + a->__size = 0; + a->__ptrAllQueuedTransferStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1AllTransferList(struct soap *soap, struct cwmp1AllTransferList const*a) +{ + int i; + if (a->__ptrAllQueuedTransferStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrAllQueuedTransferStruct, 1, SOAP_TYPE_cwmp1AllTransferList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__AllQueuedTransferStruct(soap, a->__ptrAllQueuedTransferStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1AllTransferList(struct soap *soap, const struct cwmp1AllTransferList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrAllQueuedTransferStruct, 1, tag, SOAP_TYPE_cwmp1AllTransferList); + if (soap_out_cwmp1AllTransferList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1AllTransferList(struct soap *soap, const char *tag, int id, const struct cwmp1AllTransferList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrAllQueuedTransferStruct ? soap_putsize(soap, "cwmp:AllQueuedTransferStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrAllQueuedTransferStruct, 1, type, SOAP_TYPE_cwmp1AllTransferList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__AllQueuedTransferStruct(soap, "AllQueuedTransferStruct", -1, &a->__ptrAllQueuedTransferStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1AllTransferList * SOAP_FMAC4 soap_get_cwmp1AllTransferList(struct soap *soap, struct cwmp1AllTransferList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1AllTransferList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1AllTransferList * SOAP_FMAC4 soap_in_cwmp1AllTransferList(struct soap *soap, const char *tag, struct cwmp1AllTransferList *a, const char *type) +{ int i, j; + struct cwmp1__AllQueuedTransferStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1AllTransferList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1AllTransferList, sizeof(struct cwmp1AllTransferList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1AllTransferList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrAllQueuedTransferStruct = (struct cwmp1__AllQueuedTransferStruct **)soap_malloc(soap, sizeof(struct cwmp1__AllQueuedTransferStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrAllQueuedTransferStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__AllQueuedTransferStruct(soap, NULL, a->__ptrAllQueuedTransferStruct + i, "cwmp:AllQueuedTransferStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__AllQueuedTransferStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__AllQueuedTransferStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__AllQueuedTransferStruct(soap, NULL, p, "cwmp:AllQueuedTransferStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrAllQueuedTransferStruct = (struct cwmp1__AllQueuedTransferStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrAllQueuedTransferStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1AllTransferList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1AllTransferList, 0, sizeof(struct cwmp1AllTransferList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetAllQueuedTransfersResponse(struct soap *soap, struct _cwmp1__GetAllQueuedTransfersResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->TransferList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetAllQueuedTransfersResponse(struct soap *soap, const struct _cwmp1__GetAllQueuedTransfersResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1AllTransferList(soap, &a->TransferList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetAllQueuedTransfersResponse(struct soap *soap, const struct _cwmp1__GetAllQueuedTransfersResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse); + if (soap_out__cwmp1__GetAllQueuedTransfersResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetAllQueuedTransfersResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetAllQueuedTransfersResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1AllTransferList(soap, "TransferList", -1, &a->TransferList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfersResponse * SOAP_FMAC4 soap_get__cwmp1__GetAllQueuedTransfersResponse(struct soap *soap, struct _cwmp1__GetAllQueuedTransfersResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetAllQueuedTransfersResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfersResponse * SOAP_FMAC4 soap_in__cwmp1__GetAllQueuedTransfersResponse(struct soap *soap, const char *tag, struct _cwmp1__GetAllQueuedTransfersResponse *a, const char *type) +{ + size_t soap_flag_TransferList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetAllQueuedTransfersResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse, sizeof(struct _cwmp1__GetAllQueuedTransfersResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetAllQueuedTransfersResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_TransferList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1AllTransferList(soap, "TransferList", &a->TransferList, "cwmp:AllQueuedTransferStruct")) + { soap_flag_TransferList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetAllQueuedTransfersResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetAllQueuedTransfersResponse, 0, sizeof(struct _cwmp1__GetAllQueuedTransfersResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_TransferList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetAllQueuedTransfers(struct soap *soap, struct _cwmp1__GetAllQueuedTransfers *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetAllQueuedTransfers(struct soap *soap, const struct _cwmp1__GetAllQueuedTransfers *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetAllQueuedTransfers(struct soap *soap, const struct _cwmp1__GetAllQueuedTransfers *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetAllQueuedTransfers); + if (soap_out__cwmp1__GetAllQueuedTransfers(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetAllQueuedTransfers(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetAllQueuedTransfers *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetAllQueuedTransfers), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfers * SOAP_FMAC4 soap_get__cwmp1__GetAllQueuedTransfers(struct soap *soap, struct _cwmp1__GetAllQueuedTransfers *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetAllQueuedTransfers(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetAllQueuedTransfers * SOAP_FMAC4 soap_in__cwmp1__GetAllQueuedTransfers(struct soap *soap, const char *tag, struct _cwmp1__GetAllQueuedTransfers *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetAllQueuedTransfers *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetAllQueuedTransfers, sizeof(struct _cwmp1__GetAllQueuedTransfers), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetAllQueuedTransfers(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetAllQueuedTransfers *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetAllQueuedTransfers, 0, sizeof(struct _cwmp1__GetAllQueuedTransfers), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__FactoryResetResponse(struct soap *soap, struct _cwmp1__FactoryResetResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__FactoryResetResponse(struct soap *soap, const struct _cwmp1__FactoryResetResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__FactoryResetResponse(struct soap *soap, const struct _cwmp1__FactoryResetResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__FactoryResetResponse); + if (soap_out__cwmp1__FactoryResetResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__FactoryResetResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__FactoryResetResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__FactoryResetResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__FactoryResetResponse * SOAP_FMAC4 soap_get__cwmp1__FactoryResetResponse(struct soap *soap, struct _cwmp1__FactoryResetResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__FactoryResetResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__FactoryResetResponse * SOAP_FMAC4 soap_in__cwmp1__FactoryResetResponse(struct soap *soap, const char *tag, struct _cwmp1__FactoryResetResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__FactoryResetResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__FactoryResetResponse, sizeof(struct _cwmp1__FactoryResetResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__FactoryResetResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__FactoryResetResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__FactoryResetResponse, 0, sizeof(struct _cwmp1__FactoryResetResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__FactoryReset(struct soap *soap, struct _cwmp1__FactoryReset *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__FactoryReset(struct soap *soap, const struct _cwmp1__FactoryReset *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__FactoryReset(struct soap *soap, const struct _cwmp1__FactoryReset *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__FactoryReset); + if (soap_out__cwmp1__FactoryReset(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__FactoryReset(struct soap *soap, const char *tag, int id, const struct _cwmp1__FactoryReset *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__FactoryReset), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__FactoryReset * SOAP_FMAC4 soap_get__cwmp1__FactoryReset(struct soap *soap, struct _cwmp1__FactoryReset *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__FactoryReset(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__FactoryReset * SOAP_FMAC4 soap_in__cwmp1__FactoryReset(struct soap *soap, const char *tag, struct _cwmp1__FactoryReset *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__FactoryReset *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__FactoryReset, sizeof(struct _cwmp1__FactoryReset), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__FactoryReset(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__FactoryReset *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__FactoryReset, 0, sizeof(struct _cwmp1__FactoryReset), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__UploadResponse(struct soap *soap, struct _cwmp1__UploadResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default__cwmp1__UploadResponse_Status(soap, &a->Status); + soap_default_time(soap, &a->StartTime); + soap_default_time(soap, &a->CompleteTime); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__UploadResponse(struct soap *soap, const struct _cwmp1__UploadResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_embedded(soap, &a->StartTime, SOAP_TYPE_time); + soap_embedded(soap, &a->CompleteTime, SOAP_TYPE_time); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__UploadResponse(struct soap *soap, const struct _cwmp1__UploadResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__UploadResponse); + if (soap_out__cwmp1__UploadResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__UploadResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__UploadResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__UploadResponse), type)) + return soap->error; + if (soap_out__cwmp1__UploadResponse_Status(soap, "Status", -1, &a->Status, "")) + return soap->error; + if (soap_out_time(soap, "StartTime", -1, &a->StartTime, "")) + return soap->error; + if (soap_out_time(soap, "CompleteTime", -1, &a->CompleteTime, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__UploadResponse * SOAP_FMAC4 soap_get__cwmp1__UploadResponse(struct soap *soap, struct _cwmp1__UploadResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__UploadResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__UploadResponse * SOAP_FMAC4 soap_in__cwmp1__UploadResponse(struct soap *soap, const char *tag, struct _cwmp1__UploadResponse *a, const char *type) +{ + size_t soap_flag_Status = 1; + size_t soap_flag_StartTime = 1; + size_t soap_flag_CompleteTime = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__UploadResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__UploadResponse, sizeof(struct _cwmp1__UploadResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__UploadResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Status && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__UploadResponse_Status(soap, "Status", &a->Status, "cwmp:UploadResponse-Status")) + { soap_flag_Status--; + continue; + } + if (soap_flag_StartTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "StartTime", &a->StartTime, "xsd:dateTime")) + { soap_flag_StartTime--; + continue; + } + if (soap_flag_CompleteTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "CompleteTime", &a->CompleteTime, "xsd:dateTime")) + { soap_flag_CompleteTime--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__UploadResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__UploadResponse, 0, sizeof(struct _cwmp1__UploadResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Status > 0 || soap_flag_StartTime > 0 || soap_flag_CompleteTime > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Upload(struct soap *soap, struct _cwmp1__Upload *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_default_string(soap, &a->FileType); + soap_default_string(soap, &a->URL); + soap_default_string(soap, &a->Username); + soap_default_string(soap, &a->Password); + soap_default_unsignedInt(soap, &a->DelaySeconds); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Upload(struct soap *soap, const struct _cwmp1__Upload *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_serialize_string(soap, &a->FileType); + soap_serialize_string(soap, &a->URL); + soap_serialize_string(soap, &a->Username); + soap_serialize_string(soap, &a->Password); + soap_embedded(soap, &a->DelaySeconds, SOAP_TYPE_unsignedInt); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Upload(struct soap *soap, const struct _cwmp1__Upload *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Upload); + if (soap_out__cwmp1__Upload(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Upload(struct soap *soap, const char *tag, int id, const struct _cwmp1__Upload *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Upload), type)) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + if (soap_out_string(soap, "FileType", -1, &a->FileType, "")) + return soap->error; + if (soap_out_string(soap, "URL", -1, &a->URL, "")) + return soap->error; + if (soap_out_string(soap, "Username", -1, &a->Username, "")) + return soap->error; + if (soap_out_string(soap, "Password", -1, &a->Password, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "DelaySeconds", -1, &a->DelaySeconds, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Upload * SOAP_FMAC4 soap_get__cwmp1__Upload(struct soap *soap, struct _cwmp1__Upload *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Upload(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Upload * SOAP_FMAC4 soap_in__cwmp1__Upload(struct soap *soap, const char *tag, struct _cwmp1__Upload *a, const char *type) +{ + size_t soap_flag_CommandKey = 1; + size_t soap_flag_FileType = 1; + size_t soap_flag_URL = 1; + size_t soap_flag_Username = 1; + size_t soap_flag_Password = 1; + size_t soap_flag_DelaySeconds = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Upload *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Upload, sizeof(struct _cwmp1__Upload), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Upload(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap_flag_FileType && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FileType", &a->FileType, "xsd:string")) + { soap_flag_FileType--; + continue; + } + if (soap_flag_URL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "URL", &a->URL, "xsd:string")) + { soap_flag_URL--; + continue; + } + if (soap_flag_Username && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Username", &a->Username, "xsd:string")) + { soap_flag_Username--; + continue; + } + if (soap_flag_Password && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Password", &a->Password, "xsd:string")) + { soap_flag_Password--; + continue; + } + if (soap_flag_DelaySeconds && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "DelaySeconds", &a->DelaySeconds, "xsd:unsignedInt")) + { soap_flag_DelaySeconds--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Upload *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Upload, 0, sizeof(struct _cwmp1__Upload), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_CommandKey > 0 || soap_flag_FileType > 0 || soap_flag_URL > 0 || soap_flag_Username > 0 || soap_flag_Password > 0 || soap_flag_DelaySeconds > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1OptionList(struct soap *soap, struct cwmp1OptionList *a) +{ + a->__size = 0; + a->__ptrOptionStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1OptionList(struct soap *soap, struct cwmp1OptionList const*a) +{ + int i; + if (a->__ptrOptionStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrOptionStruct, 1, SOAP_TYPE_cwmp1OptionList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__OptionStruct(soap, a->__ptrOptionStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1OptionList(struct soap *soap, const struct cwmp1OptionList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrOptionStruct, 1, tag, SOAP_TYPE_cwmp1OptionList); + if (soap_out_cwmp1OptionList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1OptionList(struct soap *soap, const char *tag, int id, const struct cwmp1OptionList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrOptionStruct ? soap_putsize(soap, "cwmp:OptionStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrOptionStruct, 1, type, SOAP_TYPE_cwmp1OptionList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__OptionStruct(soap, "OptionStruct", -1, &a->__ptrOptionStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1OptionList * SOAP_FMAC4 soap_get_cwmp1OptionList(struct soap *soap, struct cwmp1OptionList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1OptionList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1OptionList * SOAP_FMAC4 soap_in_cwmp1OptionList(struct soap *soap, const char *tag, struct cwmp1OptionList *a, const char *type) +{ int i, j; + struct cwmp1__OptionStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1OptionList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1OptionList, sizeof(struct cwmp1OptionList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1OptionList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrOptionStruct = (struct cwmp1__OptionStruct **)soap_malloc(soap, sizeof(struct cwmp1__OptionStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrOptionStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__OptionStruct(soap, NULL, a->__ptrOptionStruct + i, "cwmp:OptionStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__OptionStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__OptionStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__OptionStruct(soap, NULL, p, "cwmp:OptionStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrOptionStruct = (struct cwmp1__OptionStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrOptionStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1OptionList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1OptionList, 0, sizeof(struct cwmp1OptionList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetOptionsResponse(struct soap *soap, struct _cwmp1__GetOptionsResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->OptionList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetOptionsResponse(struct soap *soap, const struct _cwmp1__GetOptionsResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1OptionList(soap, &a->OptionList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetOptionsResponse(struct soap *soap, const struct _cwmp1__GetOptionsResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetOptionsResponse); + if (soap_out__cwmp1__GetOptionsResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetOptionsResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetOptionsResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetOptionsResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1OptionList(soap, "OptionList", -1, &a->OptionList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetOptionsResponse * SOAP_FMAC4 soap_get__cwmp1__GetOptionsResponse(struct soap *soap, struct _cwmp1__GetOptionsResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetOptionsResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetOptionsResponse * SOAP_FMAC4 soap_in__cwmp1__GetOptionsResponse(struct soap *soap, const char *tag, struct _cwmp1__GetOptionsResponse *a, const char *type) +{ + size_t soap_flag_OptionList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetOptionsResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetOptionsResponse, sizeof(struct _cwmp1__GetOptionsResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetOptionsResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_OptionList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1OptionList(soap, "OptionList", &a->OptionList, "cwmp:OptionStruct")) + { soap_flag_OptionList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetOptionsResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetOptionsResponse, 0, sizeof(struct _cwmp1__GetOptionsResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_OptionList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetOptions(struct soap *soap, struct _cwmp1__GetOptions *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->OptionName); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetOptions(struct soap *soap, const struct _cwmp1__GetOptions *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->OptionName); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetOptions(struct soap *soap, const struct _cwmp1__GetOptions *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetOptions); + if (soap_out__cwmp1__GetOptions(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetOptions(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetOptions *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetOptions), type)) + return soap->error; + if (soap_out_string(soap, "OptionName", -1, &a->OptionName, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetOptions * SOAP_FMAC4 soap_get__cwmp1__GetOptions(struct soap *soap, struct _cwmp1__GetOptions *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetOptions(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetOptions * SOAP_FMAC4 soap_in__cwmp1__GetOptions(struct soap *soap, const char *tag, struct _cwmp1__GetOptions *a, const char *type) +{ + size_t soap_flag_OptionName = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetOptions *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetOptions, sizeof(struct _cwmp1__GetOptions), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetOptions(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_OptionName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "OptionName", &a->OptionName, "xsd:string")) + { soap_flag_OptionName--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetOptions *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetOptions, 0, sizeof(struct _cwmp1__GetOptions), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_OptionName > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetVouchersResponse(struct soap *soap, struct _cwmp1__SetVouchersResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetVouchersResponse(struct soap *soap, const struct _cwmp1__SetVouchersResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetVouchersResponse(struct soap *soap, const struct _cwmp1__SetVouchersResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetVouchersResponse); + if (soap_out__cwmp1__SetVouchersResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetVouchersResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__SetVouchersResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetVouchersResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__SetVouchersResponse * SOAP_FMAC4 soap_get__cwmp1__SetVouchersResponse(struct soap *soap, struct _cwmp1__SetVouchersResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetVouchersResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__SetVouchersResponse * SOAP_FMAC4 soap_in__cwmp1__SetVouchersResponse(struct soap *soap, const char *tag, struct _cwmp1__SetVouchersResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__SetVouchersResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetVouchersResponse, sizeof(struct _cwmp1__SetVouchersResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__SetVouchersResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__SetVouchersResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetVouchersResponse, 0, sizeof(struct _cwmp1__SetVouchersResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1VoucherList(struct soap *soap, struct cwmp1VoucherList *a) +{ + a->__size = 0; + a->__ptrbase64 = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1VoucherList(struct soap *soap, struct cwmp1VoucherList const*a) +{ + int i; + if (a->__ptrbase64 && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrbase64, 1, SOAP_TYPE_cwmp1VoucherList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerToSOAP_ENC__base64(soap, a->__ptrbase64 + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1VoucherList(struct soap *soap, const struct cwmp1VoucherList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrbase64, 1, tag, SOAP_TYPE_cwmp1VoucherList); + if (soap_out_cwmp1VoucherList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1VoucherList(struct soap *soap, const char *tag, int id, const struct cwmp1VoucherList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrbase64 ? soap_putsize(soap, "SOAP-ENC:base64", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrbase64, 1, type, SOAP_TYPE_cwmp1VoucherList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerToSOAP_ENC__base64(soap, "base64", -1, &a->__ptrbase64[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1VoucherList * SOAP_FMAC4 soap_get_cwmp1VoucherList(struct soap *soap, struct cwmp1VoucherList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1VoucherList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1VoucherList * SOAP_FMAC4 soap_in_cwmp1VoucherList(struct soap *soap, const char *tag, struct cwmp1VoucherList *a, const char *type) +{ int i, j; + struct SOAP_ENC__base64 **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1VoucherList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1VoucherList, sizeof(struct cwmp1VoucherList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1VoucherList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrbase64 = (struct SOAP_ENC__base64 **)soap_malloc(soap, sizeof(struct SOAP_ENC__base64 *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrbase64[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerToSOAP_ENC__base64(soap, NULL, a->__ptrbase64 + i, "SOAP-ENC:base64")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct SOAP_ENC__base64 **)soap_push_block(soap, NULL, sizeof(struct SOAP_ENC__base64 *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerToSOAP_ENC__base64(soap, NULL, p, "SOAP-ENC:base64")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrbase64 = (struct SOAP_ENC__base64 **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrbase64, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1VoucherList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1VoucherList, 0, sizeof(struct cwmp1VoucherList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetVouchers(struct soap *soap, struct _cwmp1__SetVouchers *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->VoucherList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetVouchers(struct soap *soap, const struct _cwmp1__SetVouchers *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1VoucherList(soap, &a->VoucherList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetVouchers(struct soap *soap, const struct _cwmp1__SetVouchers *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetVouchers); + if (soap_out__cwmp1__SetVouchers(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetVouchers(struct soap *soap, const char *tag, int id, const struct _cwmp1__SetVouchers *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetVouchers), type)) + return soap->error; + if (soap_out_PointerTocwmp1VoucherList(soap, "VoucherList", -1, &a->VoucherList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__SetVouchers * SOAP_FMAC4 soap_get__cwmp1__SetVouchers(struct soap *soap, struct _cwmp1__SetVouchers *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetVouchers(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__SetVouchers * SOAP_FMAC4 soap_in__cwmp1__SetVouchers(struct soap *soap, const char *tag, struct _cwmp1__SetVouchers *a, const char *type) +{ + size_t soap_flag_VoucherList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__SetVouchers *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetVouchers, sizeof(struct _cwmp1__SetVouchers), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__SetVouchers(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_VoucherList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1VoucherList(soap, "VoucherList", &a->VoucherList, "SOAP-ENC:base64")) + { soap_flag_VoucherList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__SetVouchers *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetVouchers, 0, sizeof(struct _cwmp1__SetVouchers), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_VoucherList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ScheduleInformResponse(struct soap *soap, struct _cwmp1__ScheduleInformResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__ScheduleInformResponse(struct soap *soap, const struct _cwmp1__ScheduleInformResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ScheduleInformResponse(struct soap *soap, const struct _cwmp1__ScheduleInformResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__ScheduleInformResponse); + if (soap_out__cwmp1__ScheduleInformResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ScheduleInformResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__ScheduleInformResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__ScheduleInformResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__ScheduleInformResponse * SOAP_FMAC4 soap_get__cwmp1__ScheduleInformResponse(struct soap *soap, struct _cwmp1__ScheduleInformResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__ScheduleInformResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__ScheduleInformResponse * SOAP_FMAC4 soap_in__cwmp1__ScheduleInformResponse(struct soap *soap, const char *tag, struct _cwmp1__ScheduleInformResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__ScheduleInformResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__ScheduleInformResponse, sizeof(struct _cwmp1__ScheduleInformResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__ScheduleInformResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__ScheduleInformResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__ScheduleInformResponse, 0, sizeof(struct _cwmp1__ScheduleInformResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__ScheduleInform(struct soap *soap, struct _cwmp1__ScheduleInform *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_unsignedInt(soap, &a->DelaySeconds); + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__ScheduleInform(struct soap *soap, const struct _cwmp1__ScheduleInform *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_embedded(soap, &a->DelaySeconds, SOAP_TYPE_unsignedInt); + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__ScheduleInform(struct soap *soap, const struct _cwmp1__ScheduleInform *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__ScheduleInform); + if (soap_out__cwmp1__ScheduleInform(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__ScheduleInform(struct soap *soap, const char *tag, int id, const struct _cwmp1__ScheduleInform *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__ScheduleInform), type)) + return soap->error; + if (soap_out_unsignedInt(soap, "DelaySeconds", -1, &a->DelaySeconds, "")) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__ScheduleInform * SOAP_FMAC4 soap_get__cwmp1__ScheduleInform(struct soap *soap, struct _cwmp1__ScheduleInform *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__ScheduleInform(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__ScheduleInform * SOAP_FMAC4 soap_in__cwmp1__ScheduleInform(struct soap *soap, const char *tag, struct _cwmp1__ScheduleInform *a, const char *type) +{ + size_t soap_flag_DelaySeconds = 1; + size_t soap_flag_CommandKey = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__ScheduleInform *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__ScheduleInform, sizeof(struct _cwmp1__ScheduleInform), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__ScheduleInform(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_DelaySeconds && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "DelaySeconds", &a->DelaySeconds, "xsd:unsignedInt")) + { soap_flag_DelaySeconds--; + continue; + } + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__ScheduleInform *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__ScheduleInform, 0, sizeof(struct _cwmp1__ScheduleInform), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_DelaySeconds > 0 || soap_flag_CommandKey > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1TransferList(struct soap *soap, struct cwmp1TransferList *a) +{ + a->__size = 0; + a->__ptrQueuedTransferStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1TransferList(struct soap *soap, struct cwmp1TransferList const*a) +{ + int i; + if (a->__ptrQueuedTransferStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrQueuedTransferStruct, 1, SOAP_TYPE_cwmp1TransferList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__QueuedTransferStruct(soap, a->__ptrQueuedTransferStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1TransferList(struct soap *soap, const struct cwmp1TransferList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrQueuedTransferStruct, 1, tag, SOAP_TYPE_cwmp1TransferList); + if (soap_out_cwmp1TransferList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1TransferList(struct soap *soap, const char *tag, int id, const struct cwmp1TransferList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrQueuedTransferStruct ? soap_putsize(soap, "cwmp:QueuedTransferStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrQueuedTransferStruct, 1, type, SOAP_TYPE_cwmp1TransferList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__QueuedTransferStruct(soap, "QueuedTransferStruct", -1, &a->__ptrQueuedTransferStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1TransferList * SOAP_FMAC4 soap_get_cwmp1TransferList(struct soap *soap, struct cwmp1TransferList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1TransferList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1TransferList * SOAP_FMAC4 soap_in_cwmp1TransferList(struct soap *soap, const char *tag, struct cwmp1TransferList *a, const char *type) +{ int i, j; + struct cwmp1__QueuedTransferStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1TransferList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1TransferList, sizeof(struct cwmp1TransferList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1TransferList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrQueuedTransferStruct = (struct cwmp1__QueuedTransferStruct **)soap_malloc(soap, sizeof(struct cwmp1__QueuedTransferStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrQueuedTransferStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__QueuedTransferStruct(soap, NULL, a->__ptrQueuedTransferStruct + i, "cwmp:QueuedTransferStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__QueuedTransferStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__QueuedTransferStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__QueuedTransferStruct(soap, NULL, p, "cwmp:QueuedTransferStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrQueuedTransferStruct = (struct cwmp1__QueuedTransferStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrQueuedTransferStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1TransferList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1TransferList, 0, sizeof(struct cwmp1TransferList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetQueuedTransfersResponse(struct soap *soap, struct _cwmp1__GetQueuedTransfersResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->TransferList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetQueuedTransfersResponse(struct soap *soap, const struct _cwmp1__GetQueuedTransfersResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1TransferList(soap, &a->TransferList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetQueuedTransfersResponse(struct soap *soap, const struct _cwmp1__GetQueuedTransfersResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetQueuedTransfersResponse); + if (soap_out__cwmp1__GetQueuedTransfersResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetQueuedTransfersResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetQueuedTransfersResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetQueuedTransfersResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1TransferList(soap, "TransferList", -1, &a->TransferList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfersResponse * SOAP_FMAC4 soap_get__cwmp1__GetQueuedTransfersResponse(struct soap *soap, struct _cwmp1__GetQueuedTransfersResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetQueuedTransfersResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfersResponse * SOAP_FMAC4 soap_in__cwmp1__GetQueuedTransfersResponse(struct soap *soap, const char *tag, struct _cwmp1__GetQueuedTransfersResponse *a, const char *type) +{ + size_t soap_flag_TransferList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetQueuedTransfersResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetQueuedTransfersResponse, sizeof(struct _cwmp1__GetQueuedTransfersResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetQueuedTransfersResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_TransferList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1TransferList(soap, "TransferList", &a->TransferList, "cwmp:QueuedTransferStruct")) + { soap_flag_TransferList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetQueuedTransfersResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetQueuedTransfersResponse, 0, sizeof(struct _cwmp1__GetQueuedTransfersResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_TransferList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetQueuedTransfers(struct soap *soap, struct _cwmp1__GetQueuedTransfers *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetQueuedTransfers(struct soap *soap, const struct _cwmp1__GetQueuedTransfers *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetQueuedTransfers(struct soap *soap, const struct _cwmp1__GetQueuedTransfers *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetQueuedTransfers); + if (soap_out__cwmp1__GetQueuedTransfers(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetQueuedTransfers(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetQueuedTransfers *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetQueuedTransfers), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfers * SOAP_FMAC4 soap_get__cwmp1__GetQueuedTransfers(struct soap *soap, struct _cwmp1__GetQueuedTransfers *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetQueuedTransfers(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetQueuedTransfers * SOAP_FMAC4 soap_in__cwmp1__GetQueuedTransfers(struct soap *soap, const char *tag, struct _cwmp1__GetQueuedTransfers *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetQueuedTransfers *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetQueuedTransfers, sizeof(struct _cwmp1__GetQueuedTransfers), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetQueuedTransfers(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetQueuedTransfers *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetQueuedTransfers, 0, sizeof(struct _cwmp1__GetQueuedTransfers), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__RebootResponse(struct soap *soap, struct _cwmp1__RebootResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__RebootResponse(struct soap *soap, const struct _cwmp1__RebootResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__RebootResponse(struct soap *soap, const struct _cwmp1__RebootResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__RebootResponse); + if (soap_out__cwmp1__RebootResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__RebootResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__RebootResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__RebootResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__RebootResponse * SOAP_FMAC4 soap_get__cwmp1__RebootResponse(struct soap *soap, struct _cwmp1__RebootResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__RebootResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__RebootResponse * SOAP_FMAC4 soap_in__cwmp1__RebootResponse(struct soap *soap, const char *tag, struct _cwmp1__RebootResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__RebootResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__RebootResponse, sizeof(struct _cwmp1__RebootResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__RebootResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__RebootResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__RebootResponse, 0, sizeof(struct _cwmp1__RebootResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Reboot(struct soap *soap, struct _cwmp1__Reboot *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Reboot(struct soap *soap, const struct _cwmp1__Reboot *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Reboot(struct soap *soap, const struct _cwmp1__Reboot *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Reboot); + if (soap_out__cwmp1__Reboot(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Reboot(struct soap *soap, const char *tag, int id, const struct _cwmp1__Reboot *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Reboot), type)) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Reboot * SOAP_FMAC4 soap_get__cwmp1__Reboot(struct soap *soap, struct _cwmp1__Reboot *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Reboot(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Reboot * SOAP_FMAC4 soap_in__cwmp1__Reboot(struct soap *soap, const char *tag, struct _cwmp1__Reboot *a, const char *type) +{ + size_t soap_flag_CommandKey = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Reboot *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Reboot, sizeof(struct _cwmp1__Reboot), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Reboot(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Reboot *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Reboot, 0, sizeof(struct _cwmp1__Reboot), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_CommandKey > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DownloadResponse(struct soap *soap, struct _cwmp1__DownloadResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default__cwmp1__DownloadResponse_Status(soap, &a->Status); + soap_default_time(soap, &a->StartTime); + soap_default_time(soap, &a->CompleteTime); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__DownloadResponse(struct soap *soap, const struct _cwmp1__DownloadResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_embedded(soap, &a->StartTime, SOAP_TYPE_time); + soap_embedded(soap, &a->CompleteTime, SOAP_TYPE_time); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DownloadResponse(struct soap *soap, const struct _cwmp1__DownloadResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__DownloadResponse); + if (soap_out__cwmp1__DownloadResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DownloadResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__DownloadResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__DownloadResponse), type)) + return soap->error; + if (soap_out__cwmp1__DownloadResponse_Status(soap, "Status", -1, &a->Status, "")) + return soap->error; + if (soap_out_time(soap, "StartTime", -1, &a->StartTime, "")) + return soap->error; + if (soap_out_time(soap, "CompleteTime", -1, &a->CompleteTime, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__DownloadResponse * SOAP_FMAC4 soap_get__cwmp1__DownloadResponse(struct soap *soap, struct _cwmp1__DownloadResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__DownloadResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__DownloadResponse * SOAP_FMAC4 soap_in__cwmp1__DownloadResponse(struct soap *soap, const char *tag, struct _cwmp1__DownloadResponse *a, const char *type) +{ + size_t soap_flag_Status = 1; + size_t soap_flag_StartTime = 1; + size_t soap_flag_CompleteTime = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__DownloadResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__DownloadResponse, sizeof(struct _cwmp1__DownloadResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__DownloadResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Status && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__DownloadResponse_Status(soap, "Status", &a->Status, "cwmp:DownloadResponse-Status")) + { soap_flag_Status--; + continue; + } + if (soap_flag_StartTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "StartTime", &a->StartTime, "xsd:dateTime")) + { soap_flag_StartTime--; + continue; + } + if (soap_flag_CompleteTime && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "CompleteTime", &a->CompleteTime, "xsd:dateTime")) + { soap_flag_CompleteTime--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__DownloadResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__DownloadResponse, 0, sizeof(struct _cwmp1__DownloadResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Status > 0 || soap_flag_StartTime > 0 || soap_flag_CompleteTime > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Download(struct soap *soap, struct _cwmp1__Download *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_default_string(soap, &a->FileType); + soap_default_string(soap, &a->URL); + soap_default_string(soap, &a->Username); + soap_default_string(soap, &a->Password); + soap_default_unsignedInt(soap, &a->FileSize); + soap_default_string(soap, &a->TargetFileName); + soap_default_unsignedInt(soap, &a->DelaySeconds); + soap_default_string(soap, &a->SuccessURL); + soap_default_string(soap, &a->FailureURL); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Download(struct soap *soap, const struct _cwmp1__Download *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_serialize_string(soap, &a->FileType); + soap_serialize_string(soap, &a->URL); + soap_serialize_string(soap, &a->Username); + soap_serialize_string(soap, &a->Password); + soap_embedded(soap, &a->FileSize, SOAP_TYPE_unsignedInt); + soap_serialize_string(soap, &a->TargetFileName); + soap_embedded(soap, &a->DelaySeconds, SOAP_TYPE_unsignedInt); + soap_serialize_string(soap, &a->SuccessURL); + soap_serialize_string(soap, &a->FailureURL); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Download(struct soap *soap, const struct _cwmp1__Download *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Download); + if (soap_out__cwmp1__Download(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Download(struct soap *soap, const char *tag, int id, const struct _cwmp1__Download *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Download), type)) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + if (soap_out_string(soap, "FileType", -1, &a->FileType, "")) + return soap->error; + if (soap_out_string(soap, "URL", -1, &a->URL, "")) + return soap->error; + if (soap_out_string(soap, "Username", -1, &a->Username, "")) + return soap->error; + if (soap_out_string(soap, "Password", -1, &a->Password, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "FileSize", -1, &a->FileSize, "")) + return soap->error; + if (soap_out_string(soap, "TargetFileName", -1, &a->TargetFileName, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "DelaySeconds", -1, &a->DelaySeconds, "")) + return soap->error; + if (soap_out_string(soap, "SuccessURL", -1, &a->SuccessURL, "")) + return soap->error; + if (soap_out_string(soap, "FailureURL", -1, &a->FailureURL, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Download * SOAP_FMAC4 soap_get__cwmp1__Download(struct soap *soap, struct _cwmp1__Download *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Download(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Download * SOAP_FMAC4 soap_in__cwmp1__Download(struct soap *soap, const char *tag, struct _cwmp1__Download *a, const char *type) +{ + size_t soap_flag_CommandKey = 1; + size_t soap_flag_FileType = 1; + size_t soap_flag_URL = 1; + size_t soap_flag_Username = 1; + size_t soap_flag_Password = 1; + size_t soap_flag_FileSize = 1; + size_t soap_flag_TargetFileName = 1; + size_t soap_flag_DelaySeconds = 1; + size_t soap_flag_SuccessURL = 1; + size_t soap_flag_FailureURL = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Download *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Download, sizeof(struct _cwmp1__Download), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Download(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap_flag_FileType && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FileType", &a->FileType, "xsd:string")) + { soap_flag_FileType--; + continue; + } + if (soap_flag_URL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "URL", &a->URL, "xsd:string")) + { soap_flag_URL--; + continue; + } + if (soap_flag_Username && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Username", &a->Username, "xsd:string")) + { soap_flag_Username--; + continue; + } + if (soap_flag_Password && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Password", &a->Password, "xsd:string")) + { soap_flag_Password--; + continue; + } + if (soap_flag_FileSize && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "FileSize", &a->FileSize, "xsd:unsignedInt")) + { soap_flag_FileSize--; + continue; + } + if (soap_flag_TargetFileName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "TargetFileName", &a->TargetFileName, "xsd:string")) + { soap_flag_TargetFileName--; + continue; + } + if (soap_flag_DelaySeconds && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "DelaySeconds", &a->DelaySeconds, "xsd:unsignedInt")) + { soap_flag_DelaySeconds--; + continue; + } + if (soap_flag_SuccessURL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "SuccessURL", &a->SuccessURL, "xsd:string")) + { soap_flag_SuccessURL--; + continue; + } + if (soap_flag_FailureURL && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FailureURL", &a->FailureURL, "xsd:string")) + { soap_flag_FailureURL--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Download *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Download, 0, sizeof(struct _cwmp1__Download), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_CommandKey > 0 || soap_flag_FileType > 0 || soap_flag_URL > 0 || soap_flag_Username > 0 || soap_flag_Password > 0 || soap_flag_FileSize > 0 || soap_flag_TargetFileName > 0 || soap_flag_DelaySeconds > 0 || soap_flag_SuccessURL > 0 || soap_flag_FailureURL > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DeleteObjectResponse(struct soap *soap, struct _cwmp1__DeleteObjectResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default__cwmp1__DeleteObjectResponse_Status(soap, &a->Status); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__DeleteObjectResponse(struct soap *soap, const struct _cwmp1__DeleteObjectResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DeleteObjectResponse(struct soap *soap, const struct _cwmp1__DeleteObjectResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__DeleteObjectResponse); + if (soap_out__cwmp1__DeleteObjectResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DeleteObjectResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__DeleteObjectResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__DeleteObjectResponse), type)) + return soap->error; + if (soap_out__cwmp1__DeleteObjectResponse_Status(soap, "Status", -1, &a->Status, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__DeleteObjectResponse * SOAP_FMAC4 soap_get__cwmp1__DeleteObjectResponse(struct soap *soap, struct _cwmp1__DeleteObjectResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__DeleteObjectResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__DeleteObjectResponse * SOAP_FMAC4 soap_in__cwmp1__DeleteObjectResponse(struct soap *soap, const char *tag, struct _cwmp1__DeleteObjectResponse *a, const char *type) +{ + size_t soap_flag_Status = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__DeleteObjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__DeleteObjectResponse, sizeof(struct _cwmp1__DeleteObjectResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__DeleteObjectResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Status && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__DeleteObjectResponse_Status(soap, "Status", &a->Status, "cwmp:DeleteObjectResponse-Status")) + { soap_flag_Status--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__DeleteObjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__DeleteObjectResponse, 0, sizeof(struct _cwmp1__DeleteObjectResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Status > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__DeleteObject(struct soap *soap, struct _cwmp1__DeleteObject *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__ObjectNameType(soap, &a->ObjectName); + soap_default_cwmp1__ParameterKeyType(soap, &a->ParameterKey); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__DeleteObject(struct soap *soap, const struct _cwmp1__DeleteObject *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__ObjectNameType(soap, &a->ObjectName); + soap_serialize_cwmp1__ParameterKeyType(soap, &a->ParameterKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__DeleteObject(struct soap *soap, const struct _cwmp1__DeleteObject *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__DeleteObject); + if (soap_out__cwmp1__DeleteObject(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__DeleteObject(struct soap *soap, const char *tag, int id, const struct _cwmp1__DeleteObject *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__DeleteObject), type)) + return soap->error; + if (soap_out_cwmp1__ObjectNameType(soap, "ObjectName", -1, &a->ObjectName, "")) + return soap->error; + if (soap_out_cwmp1__ParameterKeyType(soap, "ParameterKey", -1, &a->ParameterKey, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__DeleteObject * SOAP_FMAC4 soap_get__cwmp1__DeleteObject(struct soap *soap, struct _cwmp1__DeleteObject *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__DeleteObject(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__DeleteObject * SOAP_FMAC4 soap_in__cwmp1__DeleteObject(struct soap *soap, const char *tag, struct _cwmp1__DeleteObject *a, const char *type) +{ + size_t soap_flag_ObjectName = 1; + size_t soap_flag_ParameterKey = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__DeleteObject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__DeleteObject, sizeof(struct _cwmp1__DeleteObject), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__DeleteObject(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ObjectName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__ObjectNameType(soap, "ObjectName", &a->ObjectName, "cwmp:ObjectNameType")) + { soap_flag_ObjectName--; + continue; + } + if (soap_flag_ParameterKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__ParameterKeyType(soap, "ParameterKey", &a->ParameterKey, "cwmp:ParameterKeyType")) + { soap_flag_ParameterKey--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__DeleteObject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__DeleteObject, 0, sizeof(struct _cwmp1__DeleteObject), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ObjectName > 0 || soap_flag_ParameterKey > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AddObjectResponse(struct soap *soap, struct _cwmp1__AddObjectResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_unsignedInt(soap, &a->InstanceNumber); + soap_default__cwmp1__AddObjectResponse_Status(soap, &a->Status); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AddObjectResponse(struct soap *soap, const struct _cwmp1__AddObjectResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_embedded(soap, &a->InstanceNumber, SOAP_TYPE_unsignedInt); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AddObjectResponse(struct soap *soap, const struct _cwmp1__AddObjectResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__AddObjectResponse); + if (soap_out__cwmp1__AddObjectResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AddObjectResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__AddObjectResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__AddObjectResponse), type)) + return soap->error; + if (soap_out_unsignedInt(soap, "InstanceNumber", -1, &a->InstanceNumber, "")) + return soap->error; + if (soap_out__cwmp1__AddObjectResponse_Status(soap, "Status", -1, &a->Status, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__AddObjectResponse * SOAP_FMAC4 soap_get__cwmp1__AddObjectResponse(struct soap *soap, struct _cwmp1__AddObjectResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__AddObjectResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__AddObjectResponse * SOAP_FMAC4 soap_in__cwmp1__AddObjectResponse(struct soap *soap, const char *tag, struct _cwmp1__AddObjectResponse *a, const char *type) +{ + size_t soap_flag_InstanceNumber = 1; + size_t soap_flag_Status = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__AddObjectResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__AddObjectResponse, sizeof(struct _cwmp1__AddObjectResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__AddObjectResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_InstanceNumber && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "InstanceNumber", &a->InstanceNumber, "xsd:unsignedInt")) + { soap_flag_InstanceNumber--; + continue; + } + if (soap_flag_Status && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__AddObjectResponse_Status(soap, "Status", &a->Status, "cwmp:AddObjectResponse-Status")) + { soap_flag_Status--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__AddObjectResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__AddObjectResponse, 0, sizeof(struct _cwmp1__AddObjectResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_InstanceNumber > 0 || soap_flag_Status > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__AddObject(struct soap *soap, struct _cwmp1__AddObject *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__ObjectNameType(soap, &a->ObjectName); + soap_default_cwmp1__ParameterKeyType(soap, &a->ParameterKey); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__AddObject(struct soap *soap, const struct _cwmp1__AddObject *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__ObjectNameType(soap, &a->ObjectName); + soap_serialize_cwmp1__ParameterKeyType(soap, &a->ParameterKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__AddObject(struct soap *soap, const struct _cwmp1__AddObject *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__AddObject); + if (soap_out__cwmp1__AddObject(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__AddObject(struct soap *soap, const char *tag, int id, const struct _cwmp1__AddObject *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__AddObject), type)) + return soap->error; + if (soap_out_cwmp1__ObjectNameType(soap, "ObjectName", -1, &a->ObjectName, "")) + return soap->error; + if (soap_out_cwmp1__ParameterKeyType(soap, "ParameterKey", -1, &a->ParameterKey, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__AddObject * SOAP_FMAC4 soap_get__cwmp1__AddObject(struct soap *soap, struct _cwmp1__AddObject *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__AddObject(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__AddObject * SOAP_FMAC4 soap_in__cwmp1__AddObject(struct soap *soap, const char *tag, struct _cwmp1__AddObject *a, const char *type) +{ + size_t soap_flag_ObjectName = 1; + size_t soap_flag_ParameterKey = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__AddObject *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__AddObject, sizeof(struct _cwmp1__AddObject), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__AddObject(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ObjectName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__ObjectNameType(soap, "ObjectName", &a->ObjectName, "cwmp:ObjectNameType")) + { soap_flag_ObjectName--; + continue; + } + if (soap_flag_ParameterKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__ParameterKeyType(soap, "ParameterKey", &a->ParameterKey, "cwmp:ParameterKeyType")) + { soap_flag_ParameterKey--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__AddObject *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__AddObject, 0, sizeof(struct _cwmp1__AddObject), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ObjectName > 0 || soap_flag_ParameterKey > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterAttributeList(struct soap *soap, struct cwmp1ParameterAttributeList *a) +{ + a->__size = 0; + a->__ptrParameterAttributeStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterAttributeList(struct soap *soap, struct cwmp1ParameterAttributeList const*a) +{ + int i; + if (a->__ptrParameterAttributeStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrParameterAttributeStruct, 1, SOAP_TYPE_cwmp1ParameterAttributeList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__ParameterAttributeStruct(soap, a->__ptrParameterAttributeStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterAttributeList(struct soap *soap, const struct cwmp1ParameterAttributeList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrParameterAttributeStruct, 1, tag, SOAP_TYPE_cwmp1ParameterAttributeList); + if (soap_out_cwmp1ParameterAttributeList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterAttributeList(struct soap *soap, const char *tag, int id, const struct cwmp1ParameterAttributeList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrParameterAttributeStruct ? soap_putsize(soap, "cwmp:ParameterAttributeStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrParameterAttributeStruct, 1, type, SOAP_TYPE_cwmp1ParameterAttributeList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__ParameterAttributeStruct(soap, "ParameterAttributeStruct", -1, &a->__ptrParameterAttributeStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1ParameterAttributeList * SOAP_FMAC4 soap_get_cwmp1ParameterAttributeList(struct soap *soap, struct cwmp1ParameterAttributeList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1ParameterAttributeList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterAttributeList * SOAP_FMAC4 soap_in_cwmp1ParameterAttributeList(struct soap *soap, const char *tag, struct cwmp1ParameterAttributeList *a, const char *type) +{ int i, j; + struct cwmp1__ParameterAttributeStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1ParameterAttributeList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1ParameterAttributeList, sizeof(struct cwmp1ParameterAttributeList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1ParameterAttributeList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrParameterAttributeStruct = (struct cwmp1__ParameterAttributeStruct **)soap_malloc(soap, sizeof(struct cwmp1__ParameterAttributeStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrParameterAttributeStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__ParameterAttributeStruct(soap, NULL, a->__ptrParameterAttributeStruct + i, "cwmp:ParameterAttributeStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__ParameterAttributeStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__ParameterAttributeStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__ParameterAttributeStruct(soap, NULL, p, "cwmp:ParameterAttributeStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrParameterAttributeStruct = (struct cwmp1__ParameterAttributeStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrParameterAttributeStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1ParameterAttributeList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1ParameterAttributeList, 0, sizeof(struct cwmp1ParameterAttributeList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterAttributesResponse(struct soap *soap, struct _cwmp1__GetParameterAttributesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterAttributesResponse(struct soap *soap, const struct _cwmp1__GetParameterAttributesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1ParameterAttributeList(soap, &a->ParameterList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterAttributesResponse(struct soap *soap, const struct _cwmp1__GetParameterAttributesResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetParameterAttributesResponse); + if (soap_out__cwmp1__GetParameterAttributesResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterAttributesResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetParameterAttributesResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetParameterAttributesResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1ParameterAttributeList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetParameterAttributesResponse * SOAP_FMAC4 soap_get__cwmp1__GetParameterAttributesResponse(struct soap *soap, struct _cwmp1__GetParameterAttributesResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetParameterAttributesResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetParameterAttributesResponse * SOAP_FMAC4 soap_in__cwmp1__GetParameterAttributesResponse(struct soap *soap, const char *tag, struct _cwmp1__GetParameterAttributesResponse *a, const char *type) +{ + size_t soap_flag_ParameterList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetParameterAttributesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetParameterAttributesResponse, sizeof(struct _cwmp1__GetParameterAttributesResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetParameterAttributesResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterAttributeList(soap, "ParameterList", &a->ParameterList, "cwmp:ParameterAttributeStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetParameterAttributesResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetParameterAttributesResponse, 0, sizeof(struct _cwmp1__GetParameterAttributesResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterAttributes(struct soap *soap, struct _cwmp1__GetParameterAttributes *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterNames = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterAttributes(struct soap *soap, const struct _cwmp1__GetParameterAttributes *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1ParameterNames(soap, &a->ParameterNames); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterAttributes(struct soap *soap, const struct _cwmp1__GetParameterAttributes *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetParameterAttributes); + if (soap_out__cwmp1__GetParameterAttributes(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterAttributes(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetParameterAttributes *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetParameterAttributes), type)) + return soap->error; + if (soap_out_PointerTocwmp1ParameterNames(soap, "ParameterNames", -1, &a->ParameterNames, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetParameterAttributes * SOAP_FMAC4 soap_get__cwmp1__GetParameterAttributes(struct soap *soap, struct _cwmp1__GetParameterAttributes *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetParameterAttributes(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetParameterAttributes * SOAP_FMAC4 soap_in__cwmp1__GetParameterAttributes(struct soap *soap, const char *tag, struct _cwmp1__GetParameterAttributes *a, const char *type) +{ + size_t soap_flag_ParameterNames = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetParameterAttributes *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetParameterAttributes, sizeof(struct _cwmp1__GetParameterAttributes), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetParameterAttributes(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterNames && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterNames(soap, "ParameterNames", &a->ParameterNames, "xsd:string")) + { soap_flag_ParameterNames--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetParameterAttributes *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetParameterAttributes, 0, sizeof(struct _cwmp1__GetParameterAttributes), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterNames > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterAttributesResponse(struct soap *soap, struct _cwmp1__SetParameterAttributesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterAttributesResponse(struct soap *soap, const struct _cwmp1__SetParameterAttributesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterAttributesResponse(struct soap *soap, const struct _cwmp1__SetParameterAttributesResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetParameterAttributesResponse); + if (soap_out__cwmp1__SetParameterAttributesResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterAttributesResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__SetParameterAttributesResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetParameterAttributesResponse), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__SetParameterAttributesResponse * SOAP_FMAC4 soap_get__cwmp1__SetParameterAttributesResponse(struct soap *soap, struct _cwmp1__SetParameterAttributesResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetParameterAttributesResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__SetParameterAttributesResponse * SOAP_FMAC4 soap_in__cwmp1__SetParameterAttributesResponse(struct soap *soap, const char *tag, struct _cwmp1__SetParameterAttributesResponse *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__SetParameterAttributesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetParameterAttributesResponse, sizeof(struct _cwmp1__SetParameterAttributesResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__SetParameterAttributesResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__SetParameterAttributesResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetParameterAttributesResponse, 0, sizeof(struct _cwmp1__SetParameterAttributesResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1SetParameterAttributesList(struct soap *soap, struct cwmp1SetParameterAttributesList *a) +{ + a->__size = 0; + a->__ptrSetParameterAttributesStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1SetParameterAttributesList(struct soap *soap, struct cwmp1SetParameterAttributesList const*a) +{ + int i; + if (a->__ptrSetParameterAttributesStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrSetParameterAttributesStruct, 1, SOAP_TYPE_cwmp1SetParameterAttributesList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__SetParameterAttributesStruct(soap, a->__ptrSetParameterAttributesStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1SetParameterAttributesList(struct soap *soap, const struct cwmp1SetParameterAttributesList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrSetParameterAttributesStruct, 1, tag, SOAP_TYPE_cwmp1SetParameterAttributesList); + if (soap_out_cwmp1SetParameterAttributesList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1SetParameterAttributesList(struct soap *soap, const char *tag, int id, const struct cwmp1SetParameterAttributesList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrSetParameterAttributesStruct ? soap_putsize(soap, "cwmp:SetParameterAttributesStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrSetParameterAttributesStruct, 1, type, SOAP_TYPE_cwmp1SetParameterAttributesList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__SetParameterAttributesStruct(soap, "SetParameterAttributesStruct", -1, &a->__ptrSetParameterAttributesStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1SetParameterAttributesList * SOAP_FMAC4 soap_get_cwmp1SetParameterAttributesList(struct soap *soap, struct cwmp1SetParameterAttributesList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1SetParameterAttributesList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1SetParameterAttributesList * SOAP_FMAC4 soap_in_cwmp1SetParameterAttributesList(struct soap *soap, const char *tag, struct cwmp1SetParameterAttributesList *a, const char *type) +{ int i, j; + struct cwmp1__SetParameterAttributesStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1SetParameterAttributesList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1SetParameterAttributesList, sizeof(struct cwmp1SetParameterAttributesList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1SetParameterAttributesList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrSetParameterAttributesStruct = (struct cwmp1__SetParameterAttributesStruct **)soap_malloc(soap, sizeof(struct cwmp1__SetParameterAttributesStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrSetParameterAttributesStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__SetParameterAttributesStruct(soap, NULL, a->__ptrSetParameterAttributesStruct + i, "cwmp:SetParameterAttributesStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__SetParameterAttributesStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__SetParameterAttributesStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__SetParameterAttributesStruct(soap, NULL, p, "cwmp:SetParameterAttributesStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrSetParameterAttributesStruct = (struct cwmp1__SetParameterAttributesStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrSetParameterAttributesStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1SetParameterAttributesList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1SetParameterAttributesList, 0, sizeof(struct cwmp1SetParameterAttributesList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterAttributes(struct soap *soap, struct _cwmp1__SetParameterAttributes *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterAttributes(struct soap *soap, const struct _cwmp1__SetParameterAttributes *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1SetParameterAttributesList(soap, &a->ParameterList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterAttributes(struct soap *soap, const struct _cwmp1__SetParameterAttributes *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetParameterAttributes); + if (soap_out__cwmp1__SetParameterAttributes(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterAttributes(struct soap *soap, const char *tag, int id, const struct _cwmp1__SetParameterAttributes *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetParameterAttributes), type)) + return soap->error; + if (soap_out_PointerTocwmp1SetParameterAttributesList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__SetParameterAttributes * SOAP_FMAC4 soap_get__cwmp1__SetParameterAttributes(struct soap *soap, struct _cwmp1__SetParameterAttributes *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetParameterAttributes(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__SetParameterAttributes * SOAP_FMAC4 soap_in__cwmp1__SetParameterAttributes(struct soap *soap, const char *tag, struct _cwmp1__SetParameterAttributes *a, const char *type) +{ + size_t soap_flag_ParameterList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__SetParameterAttributes *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetParameterAttributes, sizeof(struct _cwmp1__SetParameterAttributes), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__SetParameterAttributes(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1SetParameterAttributesList(soap, "ParameterList", &a->ParameterList, "cwmp:SetParameterAttributesStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__SetParameterAttributes *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetParameterAttributes, 0, sizeof(struct _cwmp1__SetParameterAttributes), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterInfoList(struct soap *soap, struct cwmp1ParameterInfoList *a) +{ + a->__size = 0; + a->__ptrParameterInfoStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterInfoList(struct soap *soap, struct cwmp1ParameterInfoList const*a) +{ + int i; + if (a->__ptrParameterInfoStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrParameterInfoStruct, 1, SOAP_TYPE_cwmp1ParameterInfoList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__ParameterInfoStruct(soap, a->__ptrParameterInfoStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterInfoList(struct soap *soap, const struct cwmp1ParameterInfoList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrParameterInfoStruct, 1, tag, SOAP_TYPE_cwmp1ParameterInfoList); + if (soap_out_cwmp1ParameterInfoList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterInfoList(struct soap *soap, const char *tag, int id, const struct cwmp1ParameterInfoList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrParameterInfoStruct ? soap_putsize(soap, "cwmp:ParameterInfoStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrParameterInfoStruct, 1, type, SOAP_TYPE_cwmp1ParameterInfoList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__ParameterInfoStruct(soap, "ParameterInfoStruct", -1, &a->__ptrParameterInfoStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1ParameterInfoList * SOAP_FMAC4 soap_get_cwmp1ParameterInfoList(struct soap *soap, struct cwmp1ParameterInfoList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1ParameterInfoList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterInfoList * SOAP_FMAC4 soap_in_cwmp1ParameterInfoList(struct soap *soap, const char *tag, struct cwmp1ParameterInfoList *a, const char *type) +{ int i, j; + struct cwmp1__ParameterInfoStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1ParameterInfoList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1ParameterInfoList, sizeof(struct cwmp1ParameterInfoList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1ParameterInfoList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrParameterInfoStruct = (struct cwmp1__ParameterInfoStruct **)soap_malloc(soap, sizeof(struct cwmp1__ParameterInfoStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrParameterInfoStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__ParameterInfoStruct(soap, NULL, a->__ptrParameterInfoStruct + i, "cwmp:ParameterInfoStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__ParameterInfoStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__ParameterInfoStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__ParameterInfoStruct(soap, NULL, p, "cwmp:ParameterInfoStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrParameterInfoStruct = (struct cwmp1__ParameterInfoStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrParameterInfoStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1ParameterInfoList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1ParameterInfoList, 0, sizeof(struct cwmp1ParameterInfoList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterNamesResponse(struct soap *soap, struct _cwmp1__GetParameterNamesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterNamesResponse(struct soap *soap, const struct _cwmp1__GetParameterNamesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1ParameterInfoList(soap, &a->ParameterList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterNamesResponse(struct soap *soap, const struct _cwmp1__GetParameterNamesResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetParameterNamesResponse); + if (soap_out__cwmp1__GetParameterNamesResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterNamesResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetParameterNamesResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetParameterNamesResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1ParameterInfoList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetParameterNamesResponse * SOAP_FMAC4 soap_get__cwmp1__GetParameterNamesResponse(struct soap *soap, struct _cwmp1__GetParameterNamesResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetParameterNamesResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetParameterNamesResponse * SOAP_FMAC4 soap_in__cwmp1__GetParameterNamesResponse(struct soap *soap, const char *tag, struct _cwmp1__GetParameterNamesResponse *a, const char *type) +{ + size_t soap_flag_ParameterList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetParameterNamesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetParameterNamesResponse, sizeof(struct _cwmp1__GetParameterNamesResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetParameterNamesResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterInfoList(soap, "ParameterList", &a->ParameterList, "cwmp:ParameterInfoStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetParameterNamesResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetParameterNamesResponse, 0, sizeof(struct _cwmp1__GetParameterNamesResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterNames(struct soap *soap, struct _cwmp1__GetParameterNames *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterPath = NULL; + soap_default_xsd__boolean(soap, &a->NextLevel); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterNames(struct soap *soap, const struct _cwmp1__GetParameterNames *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTostring(soap, &a->ParameterPath); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterNames(struct soap *soap, const struct _cwmp1__GetParameterNames *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetParameterNames); + if (soap_out__cwmp1__GetParameterNames(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterNames(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetParameterNames *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetParameterNames), type)) + return soap->error; + if (soap_out_PointerTostring(soap, "ParameterPath", -1, &a->ParameterPath, "")) + return soap->error; + if (soap_out_xsd__boolean(soap, "NextLevel", -1, &a->NextLevel, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetParameterNames * SOAP_FMAC4 soap_get__cwmp1__GetParameterNames(struct soap *soap, struct _cwmp1__GetParameterNames *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetParameterNames(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetParameterNames * SOAP_FMAC4 soap_in__cwmp1__GetParameterNames(struct soap *soap, const char *tag, struct _cwmp1__GetParameterNames *a, const char *type) +{ + size_t soap_flag_ParameterPath = 1; + size_t soap_flag_NextLevel = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetParameterNames *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetParameterNames, sizeof(struct _cwmp1__GetParameterNames), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetParameterNames(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterPath && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTostring(soap, "ParameterPath", &a->ParameterPath, "xsd:string")) + { soap_flag_ParameterPath--; + continue; + } + if (soap_flag_NextLevel && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_xsd__boolean(soap, "NextLevel", &a->NextLevel, "xsd:boolean")) + { soap_flag_NextLevel--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetParameterNames *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetParameterNames, 0, sizeof(struct _cwmp1__GetParameterNames), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_NextLevel > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterValuesResponse(struct soap *soap, struct _cwmp1__GetParameterValuesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterValuesResponse(struct soap *soap, const struct _cwmp1__GetParameterValuesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1ParameterValueList(soap, &a->ParameterList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterValuesResponse(struct soap *soap, const struct _cwmp1__GetParameterValuesResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetParameterValuesResponse); + if (soap_out__cwmp1__GetParameterValuesResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterValuesResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetParameterValuesResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetParameterValuesResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1ParameterValueList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetParameterValuesResponse * SOAP_FMAC4 soap_get__cwmp1__GetParameterValuesResponse(struct soap *soap, struct _cwmp1__GetParameterValuesResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetParameterValuesResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetParameterValuesResponse * SOAP_FMAC4 soap_in__cwmp1__GetParameterValuesResponse(struct soap *soap, const char *tag, struct _cwmp1__GetParameterValuesResponse *a, const char *type) +{ + size_t soap_flag_ParameterList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetParameterValuesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetParameterValuesResponse, sizeof(struct _cwmp1__GetParameterValuesResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetParameterValuesResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterValueList(soap, "ParameterList", &a->ParameterList, "cwmp:ParameterValueStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetParameterValuesResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetParameterValuesResponse, 0, sizeof(struct _cwmp1__GetParameterValuesResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterNames(struct soap *soap, struct cwmp1ParameterNames *a) +{ + a->__size = 0; + a->__ptrstring = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterNames(struct soap *soap, struct cwmp1ParameterNames const*a) +{ + int i; + if (a->__ptrstring && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrstring, 1, SOAP_TYPE_cwmp1ParameterNames)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_string(soap, a->__ptrstring + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterNames(struct soap *soap, const struct cwmp1ParameterNames *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrstring, 1, tag, SOAP_TYPE_cwmp1ParameterNames); + if (soap_out_cwmp1ParameterNames(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterNames(struct soap *soap, const char *tag, int id, const struct cwmp1ParameterNames *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrstring ? soap_putsize(soap, "xsd:string", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrstring, 1, type, SOAP_TYPE_cwmp1ParameterNames); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_string(soap, "string", -1, &a->__ptrstring[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1ParameterNames * SOAP_FMAC4 soap_get_cwmp1ParameterNames(struct soap *soap, struct cwmp1ParameterNames *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1ParameterNames(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterNames * SOAP_FMAC4 soap_in_cwmp1ParameterNames(struct soap *soap, const char *tag, struct cwmp1ParameterNames *a, const char *type) +{ int i, j; + char **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1ParameterNames *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1ParameterNames, sizeof(struct cwmp1ParameterNames), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1ParameterNames(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrstring = (char **)soap_malloc(soap, sizeof(char *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrstring[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_string(soap, NULL, a->__ptrstring + i, "xsd:string")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (char **)soap_push_block(soap, NULL, sizeof(char *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_string(soap, NULL, p, "xsd:string")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrstring = (char **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrstring, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1ParameterNames *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1ParameterNames, 0, sizeof(struct cwmp1ParameterNames), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetParameterValues(struct soap *soap, struct _cwmp1__GetParameterValues *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterNames = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetParameterValues(struct soap *soap, const struct _cwmp1__GetParameterValues *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1ParameterNames(soap, &a->ParameterNames); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetParameterValues(struct soap *soap, const struct _cwmp1__GetParameterValues *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetParameterValues); + if (soap_out__cwmp1__GetParameterValues(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetParameterValues(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetParameterValues *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetParameterValues), type)) + return soap->error; + if (soap_out_PointerTocwmp1ParameterNames(soap, "ParameterNames", -1, &a->ParameterNames, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetParameterValues * SOAP_FMAC4 soap_get__cwmp1__GetParameterValues(struct soap *soap, struct _cwmp1__GetParameterValues *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetParameterValues(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetParameterValues * SOAP_FMAC4 soap_in__cwmp1__GetParameterValues(struct soap *soap, const char *tag, struct _cwmp1__GetParameterValues *a, const char *type) +{ + size_t soap_flag_ParameterNames = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetParameterValues *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetParameterValues, sizeof(struct _cwmp1__GetParameterValues), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetParameterValues(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterNames && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterNames(soap, "ParameterNames", &a->ParameterNames, "xsd:string")) + { soap_flag_ParameterNames--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetParameterValues *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetParameterValues, 0, sizeof(struct _cwmp1__GetParameterValues), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterNames > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterValuesResponse(struct soap *soap, struct _cwmp1__SetParameterValuesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default__cwmp1__SetParameterValuesResponse_Status(soap, &a->Status); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterValuesResponse(struct soap *soap, const struct _cwmp1__SetParameterValuesResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterValuesResponse(struct soap *soap, const struct _cwmp1__SetParameterValuesResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetParameterValuesResponse); + if (soap_out__cwmp1__SetParameterValuesResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterValuesResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__SetParameterValuesResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetParameterValuesResponse), type)) + return soap->error; + if (soap_out__cwmp1__SetParameterValuesResponse_Status(soap, "Status", -1, &a->Status, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__SetParameterValuesResponse * SOAP_FMAC4 soap_get__cwmp1__SetParameterValuesResponse(struct soap *soap, struct _cwmp1__SetParameterValuesResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetParameterValuesResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__SetParameterValuesResponse * SOAP_FMAC4 soap_in__cwmp1__SetParameterValuesResponse(struct soap *soap, const char *tag, struct _cwmp1__SetParameterValuesResponse *a, const char *type) +{ + size_t soap_flag_Status = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__SetParameterValuesResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetParameterValuesResponse, sizeof(struct _cwmp1__SetParameterValuesResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__SetParameterValuesResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Status && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__SetParameterValuesResponse_Status(soap, "Status", &a->Status, "cwmp:SetParameterValuesResponse-Status")) + { soap_flag_Status--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__SetParameterValuesResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetParameterValuesResponse, 0, sizeof(struct _cwmp1__SetParameterValuesResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Status > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1ParameterValueList(struct soap *soap, struct cwmp1ParameterValueList *a) +{ + a->__size = 0; + a->__ptrParameterValueStruct = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1ParameterValueList(struct soap *soap, struct cwmp1ParameterValueList const*a) +{ + int i; + if (a->__ptrParameterValueStruct && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrParameterValueStruct, 1, SOAP_TYPE_cwmp1ParameterValueList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_PointerTocwmp1__ParameterValueStruct(soap, a->__ptrParameterValueStruct + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1ParameterValueList(struct soap *soap, const struct cwmp1ParameterValueList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrParameterValueStruct, 1, tag, SOAP_TYPE_cwmp1ParameterValueList); + if (soap_out_cwmp1ParameterValueList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1ParameterValueList(struct soap *soap, const char *tag, int id, const struct cwmp1ParameterValueList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrParameterValueStruct ? soap_putsize(soap, "cwmp:ParameterValueStruct", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrParameterValueStruct, 1, type, SOAP_TYPE_cwmp1ParameterValueList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_PointerTocwmp1__ParameterValueStruct(soap, "ParameterValueStruct", -1, &a->__ptrParameterValueStruct[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1ParameterValueList * SOAP_FMAC4 soap_get_cwmp1ParameterValueList(struct soap *soap, struct cwmp1ParameterValueList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1ParameterValueList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterValueList * SOAP_FMAC4 soap_in_cwmp1ParameterValueList(struct soap *soap, const char *tag, struct cwmp1ParameterValueList *a, const char *type) +{ int i, j; + struct cwmp1__ParameterValueStruct **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1ParameterValueList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1ParameterValueList, sizeof(struct cwmp1ParameterValueList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1ParameterValueList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrParameterValueStruct = (struct cwmp1__ParameterValueStruct **)soap_malloc(soap, sizeof(struct cwmp1__ParameterValueStruct *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrParameterValueStruct[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_PointerTocwmp1__ParameterValueStruct(soap, NULL, a->__ptrParameterValueStruct + i, "cwmp:ParameterValueStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (struct cwmp1__ParameterValueStruct **)soap_push_block(soap, NULL, sizeof(struct cwmp1__ParameterValueStruct *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_PointerTocwmp1__ParameterValueStruct(soap, NULL, p, "cwmp:ParameterValueStruct")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrParameterValueStruct = (struct cwmp1__ParameterValueStruct **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrParameterValueStruct, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1ParameterValueList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1ParameterValueList, 0, sizeof(struct cwmp1ParameterValueList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__SetParameterValues(struct soap *soap, struct _cwmp1__SetParameterValues *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->ParameterList = NULL; + soap_default_cwmp1__ParameterKeyType(soap, &a->ParameterKey); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__SetParameterValues(struct soap *soap, const struct _cwmp1__SetParameterValues *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1ParameterValueList(soap, &a->ParameterList); + soap_serialize_cwmp1__ParameterKeyType(soap, &a->ParameterKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__SetParameterValues(struct soap *soap, const struct _cwmp1__SetParameterValues *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__SetParameterValues); + if (soap_out__cwmp1__SetParameterValues(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__SetParameterValues(struct soap *soap, const char *tag, int id, const struct _cwmp1__SetParameterValues *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__SetParameterValues), type)) + return soap->error; + if (soap_out_PointerTocwmp1ParameterValueList(soap, "ParameterList", -1, &a->ParameterList, "")) + return soap->error; + if (soap_out_cwmp1__ParameterKeyType(soap, "ParameterKey", -1, &a->ParameterKey, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__SetParameterValues * SOAP_FMAC4 soap_get__cwmp1__SetParameterValues(struct soap *soap, struct _cwmp1__SetParameterValues *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__SetParameterValues(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__SetParameterValues * SOAP_FMAC4 soap_in__cwmp1__SetParameterValues(struct soap *soap, const char *tag, struct _cwmp1__SetParameterValues *a, const char *type) +{ + size_t soap_flag_ParameterList = 1; + size_t soap_flag_ParameterKey = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__SetParameterValues *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__SetParameterValues, sizeof(struct _cwmp1__SetParameterValues), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__SetParameterValues(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1ParameterValueList(soap, "ParameterList", &a->ParameterList, "cwmp:ParameterValueStruct")) + { soap_flag_ParameterList--; + continue; + } + if (soap_flag_ParameterKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__ParameterKeyType(soap, "ParameterKey", &a->ParameterKey, "cwmp:ParameterKeyType")) + { soap_flag_ParameterKey--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__SetParameterValues *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__SetParameterValues, 0, sizeof(struct _cwmp1__SetParameterValues), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterList > 0 || soap_flag_ParameterKey > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1MethodList(struct soap *soap, struct cwmp1MethodList *a) +{ + a->__size = 0; + a->__ptrstring = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1MethodList(struct soap *soap, struct cwmp1MethodList const*a) +{ + int i; + if (a->__ptrstring && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrstring, 1, SOAP_TYPE_cwmp1MethodList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_string(soap, a->__ptrstring + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1MethodList(struct soap *soap, const struct cwmp1MethodList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrstring, 1, tag, SOAP_TYPE_cwmp1MethodList); + if (soap_out_cwmp1MethodList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1MethodList(struct soap *soap, const char *tag, int id, const struct cwmp1MethodList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrstring ? soap_putsize(soap, "xsd:string", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrstring, 1, type, SOAP_TYPE_cwmp1MethodList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_string(soap, "string", -1, &a->__ptrstring[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1MethodList * SOAP_FMAC4 soap_get_cwmp1MethodList(struct soap *soap, struct cwmp1MethodList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1MethodList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1MethodList * SOAP_FMAC4 soap_in_cwmp1MethodList(struct soap *soap, const char *tag, struct cwmp1MethodList *a, const char *type) +{ int i, j; + char **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1MethodList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1MethodList, sizeof(struct cwmp1MethodList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1MethodList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrstring = (char **)soap_malloc(soap, sizeof(char *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrstring[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_string(soap, NULL, a->__ptrstring + i, "xsd:string")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (char **)soap_push_block(soap, NULL, sizeof(char *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_string(soap, NULL, p, "xsd:string")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrstring = (char **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrstring, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1MethodList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1MethodList, 0, sizeof(struct cwmp1MethodList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetRPCMethodsResponse(struct soap *soap, struct _cwmp1__GetRPCMethodsResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->MethodList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetRPCMethodsResponse(struct soap *soap, const struct _cwmp1__GetRPCMethodsResponse *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTocwmp1MethodList(soap, &a->MethodList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetRPCMethodsResponse(struct soap *soap, const struct _cwmp1__GetRPCMethodsResponse *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetRPCMethodsResponse); + if (soap_out__cwmp1__GetRPCMethodsResponse(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetRPCMethodsResponse(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetRPCMethodsResponse *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetRPCMethodsResponse), type)) + return soap->error; + if (soap_out_PointerTocwmp1MethodList(soap, "MethodList", -1, &a->MethodList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetRPCMethodsResponse * SOAP_FMAC4 soap_get__cwmp1__GetRPCMethodsResponse(struct soap *soap, struct _cwmp1__GetRPCMethodsResponse *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetRPCMethodsResponse(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetRPCMethodsResponse * SOAP_FMAC4 soap_in__cwmp1__GetRPCMethodsResponse(struct soap *soap, const char *tag, struct _cwmp1__GetRPCMethodsResponse *a, const char *type) +{ + size_t soap_flag_MethodList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetRPCMethodsResponse *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetRPCMethodsResponse, sizeof(struct _cwmp1__GetRPCMethodsResponse), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetRPCMethodsResponse(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_MethodList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1MethodList(soap, "MethodList", &a->MethodList, "xsd:string")) + { soap_flag_MethodList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetRPCMethodsResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetRPCMethodsResponse, 0, sizeof(struct _cwmp1__GetRPCMethodsResponse), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_MethodList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__GetRPCMethods(struct soap *soap, struct _cwmp1__GetRPCMethods *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__GetRPCMethods(struct soap *soap, const struct _cwmp1__GetRPCMethods *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__GetRPCMethods(struct soap *soap, const struct _cwmp1__GetRPCMethods *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__GetRPCMethods); + if (soap_out__cwmp1__GetRPCMethods(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__GetRPCMethods(struct soap *soap, const char *tag, int id, const struct _cwmp1__GetRPCMethods *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__GetRPCMethods), type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__GetRPCMethods * SOAP_FMAC4 soap_get__cwmp1__GetRPCMethods(struct soap *soap, struct _cwmp1__GetRPCMethods *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__GetRPCMethods(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__GetRPCMethods * SOAP_FMAC4 soap_in__cwmp1__GetRPCMethods(struct soap *soap, const char *tag, struct _cwmp1__GetRPCMethods *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__GetRPCMethods *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__GetRPCMethods, sizeof(struct _cwmp1__GetRPCMethods), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__GetRPCMethods(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__GetRPCMethods *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__GetRPCMethods, 0, sizeof(struct _cwmp1__GetRPCMethods), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Fault_SetParameterValuesFault(struct soap *soap, struct _cwmp1__Fault_SetParameterValuesFault *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->ParameterName); + soap_default_cwmp1__FaultCodeType(soap, &a->FaultCode); + soap_default_string(soap, &a->FaultString); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Fault_SetParameterValuesFault(struct soap *soap, const struct _cwmp1__Fault_SetParameterValuesFault *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->ParameterName); + soap_serialize_cwmp1__FaultCodeType(soap, &a->FaultCode); + soap_serialize_string(soap, &a->FaultString); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Fault_SetParameterValuesFault(struct soap *soap, const struct _cwmp1__Fault_SetParameterValuesFault *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault); + if (soap_out__cwmp1__Fault_SetParameterValuesFault(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Fault_SetParameterValuesFault(struct soap *soap, const char *tag, int id, const struct _cwmp1__Fault_SetParameterValuesFault *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault), type)) + return soap->error; + if (soap_out_string(soap, "ParameterName", -1, &a->ParameterName, "")) + return soap->error; + if (soap_out_cwmp1__FaultCodeType(soap, "FaultCode", -1, &a->FaultCode, "")) + return soap->error; + if (soap_out_string(soap, "FaultString", -1, &a->FaultString, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault * SOAP_FMAC4 soap_get__cwmp1__Fault_SetParameterValuesFault(struct soap *soap, struct _cwmp1__Fault_SetParameterValuesFault *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Fault_SetParameterValuesFault(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault * SOAP_FMAC4 soap_in__cwmp1__Fault_SetParameterValuesFault(struct soap *soap, const char *tag, struct _cwmp1__Fault_SetParameterValuesFault *a, const char *type) +{ + size_t soap_flag_ParameterName = 1; + size_t soap_flag_FaultCode = 1; + size_t soap_flag_FaultString = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Fault_SetParameterValuesFault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault, sizeof(struct _cwmp1__Fault_SetParameterValuesFault), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Fault_SetParameterValuesFault(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_ParameterName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "ParameterName", &a->ParameterName, "xsd:string")) + { soap_flag_ParameterName--; + continue; + } + if (soap_flag_FaultCode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__FaultCodeType(soap, "FaultCode", &a->FaultCode, "cwmp:FaultCodeType")) + { soap_flag_FaultCode--; + continue; + } + if (soap_flag_FaultString && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FaultString", &a->FaultString, "xsd:string")) + { soap_flag_FaultString--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Fault_SetParameterValuesFault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault, 0, sizeof(struct _cwmp1__Fault_SetParameterValuesFault), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_ParameterName > 0 || soap_flag_FaultCode > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__cwmp1__Fault(struct soap *soap, struct _cwmp1__Fault *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__FaultCodeType(soap, &a->FaultCode); + soap_default_string(soap, &a->FaultString); + a->__sizeSetParameterValuesFault = 0; + a->SetParameterValuesFault = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__cwmp1__Fault(struct soap *soap, const struct _cwmp1__Fault *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__FaultCodeType(soap, &a->FaultCode); + soap_serialize_string(soap, &a->FaultString); + if (a->SetParameterValuesFault) + { int i; + for (i = 0; i < a->__sizeSetParameterValuesFault; i++) + { + soap_embedded(soap, a->SetParameterValuesFault + i, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault); + soap_serialize__cwmp1__Fault_SetParameterValuesFault(soap, a->SetParameterValuesFault + i); + } + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__cwmp1__Fault(struct soap *soap, const struct _cwmp1__Fault *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__cwmp1__Fault); + if (soap_out__cwmp1__Fault(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__cwmp1__Fault(struct soap *soap, const char *tag, int id, const struct _cwmp1__Fault *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE__cwmp1__Fault), type)) + return soap->error; + if (soap_out_cwmp1__FaultCodeType(soap, "FaultCode", -1, &a->FaultCode, "")) + return soap->error; + if (soap_out_string(soap, "FaultString", -1, &a->FaultString, "")) + return soap->error; + if (a->SetParameterValuesFault) + { int i; + for (i = 0; i < a->__sizeSetParameterValuesFault; i++) + if (soap_out__cwmp1__Fault_SetParameterValuesFault(soap, "SetParameterValuesFault", -1, a->SetParameterValuesFault + i, "")) + return soap->error; + } + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct _cwmp1__Fault * SOAP_FMAC4 soap_get__cwmp1__Fault(struct soap *soap, struct _cwmp1__Fault *p, const char *tag, const char *type) +{ + if ((p = soap_in__cwmp1__Fault(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Fault * SOAP_FMAC4 soap_in__cwmp1__Fault(struct soap *soap, const char *tag, struct _cwmp1__Fault *a, const char *type) +{ + size_t soap_flag_FaultCode = 1; + size_t soap_flag_FaultString = 1; + struct soap_blist *soap_blist_SetParameterValuesFault = NULL; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct _cwmp1__Fault *)soap_id_enter(soap, soap->id, a, SOAP_TYPE__cwmp1__Fault, sizeof(struct _cwmp1__Fault), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default__cwmp1__Fault(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_FaultCode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__FaultCodeType(soap, "FaultCode", &a->FaultCode, "cwmp:FaultCodeType")) + { soap_flag_FaultCode--; + continue; + } + if (soap_flag_FaultString && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FaultString", &a->FaultString, "xsd:string")) + { soap_flag_FaultString--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH && !soap_element_begin_in(soap, "SetParameterValuesFault", 1, NULL)) + { if (a->SetParameterValuesFault == NULL) + { if (soap_blist_SetParameterValuesFault == NULL) + soap_blist_SetParameterValuesFault = soap_new_block(soap); + a->SetParameterValuesFault = (struct _cwmp1__Fault_SetParameterValuesFault *)soap_push_block(soap, soap_blist_SetParameterValuesFault, sizeof(struct _cwmp1__Fault_SetParameterValuesFault)); + if (a->SetParameterValuesFault == NULL) + return NULL; + soap_default__cwmp1__Fault_SetParameterValuesFault(soap, a->SetParameterValuesFault); + }soap_revert(soap); + if (soap_in__cwmp1__Fault_SetParameterValuesFault(soap, "SetParameterValuesFault", a->SetParameterValuesFault, "")) + { a->__sizeSetParameterValuesFault++; + a->SetParameterValuesFault = NULL; + continue; + } + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (a->SetParameterValuesFault) + soap_pop_block(soap, soap_blist_SetParameterValuesFault); + if (a->__sizeSetParameterValuesFault) + a->SetParameterValuesFault = (struct _cwmp1__Fault_SetParameterValuesFault *)soap_save_block(soap, soap_blist_SetParameterValuesFault, NULL, 1); + else + { a->SetParameterValuesFault = NULL; + if (soap_blist_SetParameterValuesFault) + soap_end_block(soap, soap_blist_SetParameterValuesFault); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct _cwmp1__Fault *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE__cwmp1__Fault, 0, sizeof(struct _cwmp1__Fault), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_FaultCode > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->OptionName); + soap_default_unsignedInt(soap, &a->VoucherSN); + soap_default__cwmp1__OptionStruct_State(soap, &a->State); + soap_default__cwmp1__OptionStruct_Mode(soap, &a->Mode); + soap_default_time(soap, &a->StartDate); + a->ExpirationDate = NULL; + soap_default__cwmp1__OptionStruct_IsTransferable(soap, &a->IsTransferable); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__OptionStruct(struct soap *soap, const struct cwmp1__OptionStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->OptionName); + soap_embedded(soap, &a->VoucherSN, SOAP_TYPE_unsignedInt); + soap_embedded(soap, &a->StartDate, SOAP_TYPE_time); + soap_serialize_PointerTotime(soap, &a->ExpirationDate); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__OptionStruct(struct soap *soap, const struct cwmp1__OptionStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__OptionStruct); + if (soap_out_cwmp1__OptionStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__OptionStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__OptionStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__OptionStruct), type)) + return soap->error; + if (soap_out_string(soap, "OptionName", -1, &a->OptionName, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "VoucherSN", -1, &a->VoucherSN, "")) + return soap->error; + if (soap_out__cwmp1__OptionStruct_State(soap, "State", -1, &a->State, "")) + return soap->error; + if (soap_out__cwmp1__OptionStruct_Mode(soap, "Mode", -1, &a->Mode, "")) + return soap->error; + if (soap_out_time(soap, "StartDate", -1, &a->StartDate, "")) + return soap->error; + if (soap_out_PointerTotime(soap, "ExpirationDate", -1, &a->ExpirationDate, "")) + return soap->error; + if (soap_out__cwmp1__OptionStruct_IsTransferable(soap, "IsTransferable", -1, &a->IsTransferable, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__OptionStruct * SOAP_FMAC4 soap_get_cwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__OptionStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__OptionStruct * SOAP_FMAC4 soap_in_cwmp1__OptionStruct(struct soap *soap, const char *tag, struct cwmp1__OptionStruct *a, const char *type) +{ + size_t soap_flag_OptionName = 1; + size_t soap_flag_VoucherSN = 1; + size_t soap_flag_State = 1; + size_t soap_flag_Mode = 1; + size_t soap_flag_StartDate = 1; + size_t soap_flag_ExpirationDate = 1; + size_t soap_flag_IsTransferable = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__OptionStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__OptionStruct, sizeof(struct cwmp1__OptionStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__OptionStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_OptionName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "OptionName", &a->OptionName, "xsd:string")) + { soap_flag_OptionName--; + continue; + } + if (soap_flag_VoucherSN && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "VoucherSN", &a->VoucherSN, "xsd:unsignedInt")) + { soap_flag_VoucherSN--; + continue; + } + if (soap_flag_State && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__OptionStruct_State(soap, "State", &a->State, "cwmp:OptionStruct-State")) + { soap_flag_State--; + continue; + } + if (soap_flag_Mode && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__OptionStruct_Mode(soap, "Mode", &a->Mode, "cwmp:OptionStruct-Mode")) + { soap_flag_Mode--; + continue; + } + if (soap_flag_StartDate && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_time(soap, "StartDate", &a->StartDate, "xsd:dateTime")) + { soap_flag_StartDate--; + continue; + } + if (soap_flag_ExpirationDate && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTotime(soap, "ExpirationDate", &a->ExpirationDate, "xsd:dateTime")) + { soap_flag_ExpirationDate--; + continue; + } + if (soap_flag_IsTransferable && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__OptionStruct_IsTransferable(soap, "IsTransferable", &a->IsTransferable, "cwmp:OptionStruct-IsTransferable")) + { soap_flag_IsTransferable--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__OptionStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__OptionStruct, 0, sizeof(struct cwmp1__OptionStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_OptionName > 0 || soap_flag_VoucherSN > 0 || soap_flag_State > 0 || soap_flag_Mode > 0 || soap_flag_StartDate > 0 || soap_flag_IsTransferable > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->Name); + soap_default_string(soap, &a->Value); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ArgStruct(struct soap *soap, const struct cwmp1__ArgStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->Name); + soap_serialize_string(soap, &a->Value); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ArgStruct(struct soap *soap, const struct cwmp1__ArgStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__ArgStruct); + if (soap_out_cwmp1__ArgStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ArgStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__ArgStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__ArgStruct), type)) + return soap->error; + if (soap_out_string(soap, "Name", -1, &a->Name, "")) + return soap->error; + if (soap_out_string(soap, "Value", -1, &a->Value, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__ArgStruct * SOAP_FMAC4 soap_get_cwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__ArgStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ArgStruct * SOAP_FMAC4 soap_in_cwmp1__ArgStruct(struct soap *soap, const char *tag, struct cwmp1__ArgStruct *a, const char *type) +{ + size_t soap_flag_Name = 1; + size_t soap_flag_Value = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__ArgStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__ArgStruct, sizeof(struct cwmp1__ArgStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__ArgStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Name && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Name", &a->Name, "xsd:string")) + { soap_flag_Name--; + continue; + } + if (soap_flag_Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Value", &a->Value, "xsd:string")) + { soap_flag_Value--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__ArgStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__ArgStruct, 0, sizeof(struct cwmp1__ArgStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Name > 0 || soap_flag_Value > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_default__cwmp1__AllQueuedTransferStruct_State(soap, &a->State); + soap_default_xsd__boolean(soap, &a->IsDownload); + soap_default_string(soap, &a->FileType); + soap_default_unsignedInt(soap, &a->FileSize); + soap_default_string(soap, &a->TargetFileName); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__AllQueuedTransferStruct(struct soap *soap, const struct cwmp1__AllQueuedTransferStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_serialize_string(soap, &a->FileType); + soap_embedded(soap, &a->FileSize, SOAP_TYPE_unsignedInt); + soap_serialize_string(soap, &a->TargetFileName); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__AllQueuedTransferStruct(struct soap *soap, const struct cwmp1__AllQueuedTransferStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__AllQueuedTransferStruct); + if (soap_out_cwmp1__AllQueuedTransferStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__AllQueuedTransferStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__AllQueuedTransferStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__AllQueuedTransferStruct), type)) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + if (soap_out__cwmp1__AllQueuedTransferStruct_State(soap, "State", -1, &a->State, "")) + return soap->error; + if (soap_out_xsd__boolean(soap, "IsDownload", -1, &a->IsDownload, "")) + return soap->error; + if (soap_out_string(soap, "FileType", -1, &a->FileType, "")) + return soap->error; + if (soap_out_unsignedInt(soap, "FileSize", -1, &a->FileSize, "")) + return soap->error; + if (soap_out_string(soap, "TargetFileName", -1, &a->TargetFileName, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct * SOAP_FMAC4 soap_get_cwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__AllQueuedTransferStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct * SOAP_FMAC4 soap_in_cwmp1__AllQueuedTransferStruct(struct soap *soap, const char *tag, struct cwmp1__AllQueuedTransferStruct *a, const char *type) +{ + size_t soap_flag_CommandKey = 1; + size_t soap_flag_State = 1; + size_t soap_flag_IsDownload = 1; + size_t soap_flag_FileType = 1; + size_t soap_flag_FileSize = 1; + size_t soap_flag_TargetFileName = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__AllQueuedTransferStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__AllQueuedTransferStruct, sizeof(struct cwmp1__AllQueuedTransferStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__AllQueuedTransferStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap_flag_State && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__AllQueuedTransferStruct_State(soap, "State", &a->State, "cwmp:AllQueuedTransferStruct-State")) + { soap_flag_State--; + continue; + } + if (soap_flag_IsDownload && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_xsd__boolean(soap, "IsDownload", &a->IsDownload, "xsd:boolean")) + { soap_flag_IsDownload--; + continue; + } + if (soap_flag_FileType && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FileType", &a->FileType, "xsd:string")) + { soap_flag_FileType--; + continue; + } + if (soap_flag_FileSize && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_unsignedInt(soap, "FileSize", &a->FileSize, "xsd:unsignedInt")) + { soap_flag_FileSize--; + continue; + } + if (soap_flag_TargetFileName && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "TargetFileName", &a->TargetFileName, "xsd:string")) + { soap_flag_TargetFileName--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__AllQueuedTransferStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__AllQueuedTransferStruct, 0, sizeof(struct cwmp1__AllQueuedTransferStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_CommandKey > 0 || soap_flag_State > 0 || soap_flag_IsDownload > 0 || soap_flag_FileType > 0 || soap_flag_FileSize > 0 || soap_flag_TargetFileName > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); + soap_default__cwmp1__QueuedTransferStruct_State(soap, &a->State); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__QueuedTransferStruct(struct soap *soap, const struct cwmp1__QueuedTransferStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__QueuedTransferStruct(struct soap *soap, const struct cwmp1__QueuedTransferStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__QueuedTransferStruct); + if (soap_out_cwmp1__QueuedTransferStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__QueuedTransferStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__QueuedTransferStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__QueuedTransferStruct), type)) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + if (soap_out__cwmp1__QueuedTransferStruct_State(soap, "State", -1, &a->State, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct * SOAP_FMAC4 soap_get_cwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__QueuedTransferStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct * SOAP_FMAC4 soap_in_cwmp1__QueuedTransferStruct(struct soap *soap, const char *tag, struct cwmp1__QueuedTransferStruct *a, const char *type) +{ + size_t soap_flag_CommandKey = 1; + size_t soap_flag_State = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__QueuedTransferStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__QueuedTransferStruct, sizeof(struct cwmp1__QueuedTransferStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__QueuedTransferStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap_flag_State && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__QueuedTransferStruct_State(soap, "State", &a->State, "cwmp:QueuedTransferStruct-State")) + { soap_flag_State--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__QueuedTransferStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__QueuedTransferStruct, 0, sizeof(struct cwmp1__QueuedTransferStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_CommandKey > 0 || soap_flag_State > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->Name); + soap_default__cwmp1__ParameterAttributeStruct_Notification(soap, &a->Notification); + a->AccessList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterAttributeStruct(struct soap *soap, const struct cwmp1__ParameterAttributeStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->Name); + soap_serialize_PointerTocwmp1AccessList(soap, &a->AccessList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterAttributeStruct(struct soap *soap, const struct cwmp1__ParameterAttributeStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__ParameterAttributeStruct); + if (soap_out_cwmp1__ParameterAttributeStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterAttributeStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__ParameterAttributeStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__ParameterAttributeStruct), type)) + return soap->error; + if (soap_out_string(soap, "Name", -1, &a->Name, "")) + return soap->error; + if (soap_out__cwmp1__ParameterAttributeStruct_Notification(soap, "Notification", -1, &a->Notification, "")) + return soap->error; + if (soap_out_PointerTocwmp1AccessList(soap, "AccessList", -1, &a->AccessList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct * SOAP_FMAC4 soap_get_cwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__ParameterAttributeStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct * SOAP_FMAC4 soap_in_cwmp1__ParameterAttributeStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterAttributeStruct *a, const char *type) +{ + size_t soap_flag_Name = 1; + size_t soap_flag_Notification = 1; + size_t soap_flag_AccessList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__ParameterAttributeStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__ParameterAttributeStruct, sizeof(struct cwmp1__ParameterAttributeStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__ParameterAttributeStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Name && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Name", &a->Name, "xsd:string")) + { soap_flag_Name--; + continue; + } + if (soap_flag_Notification && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__ParameterAttributeStruct_Notification(soap, "Notification", &a->Notification, "cwmp:ParameterAttributeStruct-Notification")) + { soap_flag_Notification--; + continue; + } + if (soap_flag_AccessList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1AccessList(soap, "AccessList", &a->AccessList, "xsd:string")) + { soap_flag_AccessList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__ParameterAttributeStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__ParameterAttributeStruct, 0, sizeof(struct cwmp1__ParameterAttributeStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Name > 0 || soap_flag_Notification > 0 || soap_flag_AccessList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1AccessList(struct soap *soap, struct cwmp1AccessList *a) +{ + a->__size = 0; + a->__ptrstring = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1AccessList(struct soap *soap, struct cwmp1AccessList const*a) +{ + int i; + if (a->__ptrstring && !soap_array_reference(soap, a, (struct soap_array*)&a->__ptrstring, 1, SOAP_TYPE_cwmp1AccessList)) + for (i = 0; i < a->__size; i++) + { + soap_serialize_string(soap, a->__ptrstring + i); + } +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1AccessList(struct soap *soap, const struct cwmp1AccessList *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptrstring, 1, tag, SOAP_TYPE_cwmp1AccessList); + if (soap_out_cwmp1AccessList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1AccessList(struct soap *soap, const char *tag, int id, const struct cwmp1AccessList *a, const char *type) +{ + int i, n = a->__size; + char *t = a->__ptrstring ? soap_putsize(soap, "xsd:string", a->__size) : NULL; + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptrstring, 1, type, SOAP_TYPE_cwmp1AccessList); + if (id < 0) + return soap->error; + if (soap_array_begin_out(soap, tag, id, t, NULL)) + return soap->error; + for (i = 0; i < n; i++) + { + soap->position = 1; + soap->positions[0] = i; + soap_out_string(soap, "string", -1, &a->__ptrstring[i], ""); + } + soap->position = 0; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1AccessList * SOAP_FMAC4 soap_get_cwmp1AccessList(struct soap *soap, struct cwmp1AccessList *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1AccessList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1AccessList * SOAP_FMAC4 soap_in_cwmp1AccessList(struct soap *soap, const char *tag, struct cwmp1AccessList *a, const char *type) +{ int i, j; + char **p; + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (soap_match_array(soap, type)) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct cwmp1AccessList *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1AccessList, sizeof(struct cwmp1AccessList), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1AccessList(soap, a); + if (soap->body && !*soap->href) + { + a->__size = soap_getsize(soap->arraySize, soap->arrayOffset, &j); + if (a->__size >= 0) + { a->__ptrstring = (char **)soap_malloc(soap, sizeof(char *) * a->__size); + for (i = 0; i < a->__size; i++) + a->__ptrstring[i] = NULL; + for (i = 0; i < a->__size; i++) + { soap_peek_element(soap); + if (soap->position) + { i = soap->positions[0]-j; + if (i < 0 || i >= a->__size) + { soap->error = SOAP_IOB; + return NULL; + } + } + if (!soap_in_string(soap, NULL, a->__ptrstring + i, "xsd:string")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + } + else + { if (soap_new_block(soap) == NULL) + return NULL; + for (a->__size = 0; ; a->__size++) + { p = (char **)soap_push_block(soap, NULL, sizeof(char *)); + if (!p) + return NULL; + *p = NULL; + if (!soap_in_string(soap, NULL, p, "xsd:string")) + { if (soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + break; + } + } + soap_pop_block(soap, NULL); + a->__ptrstring = (char **)soap_malloc(soap, soap->blist->size); + soap_save_block(soap, NULL, (char*)a->__ptrstring, 1); + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1AccessList *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1AccessList, 0, sizeof(struct cwmp1AccessList), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + a->Name = NULL; + soap_default_xsd__boolean(soap, &a->NotificationChange); + soap_default__cwmp1__SetParameterAttributesStruct_Notification(soap, &a->Notification); + soap_default_xsd__boolean(soap, &a->AccessListChange); + a->AccessList = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__SetParameterAttributesStruct(struct soap *soap, const struct cwmp1__SetParameterAttributesStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_PointerTostring(soap, &a->Name); + soap_serialize_PointerTocwmp1AccessList(soap, &a->AccessList); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__SetParameterAttributesStruct(struct soap *soap, const struct cwmp1__SetParameterAttributesStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__SetParameterAttributesStruct); + if (soap_out_cwmp1__SetParameterAttributesStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__SetParameterAttributesStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__SetParameterAttributesStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__SetParameterAttributesStruct), type)) + return soap->error; + if (soap_out_PointerTostring(soap, "Name", -1, &a->Name, "")) + return soap->error; + if (soap_out_xsd__boolean(soap, "NotificationChange", -1, &a->NotificationChange, "")) + return soap->error; + if (soap_out__cwmp1__SetParameterAttributesStruct_Notification(soap, "Notification", -1, &a->Notification, "")) + return soap->error; + if (soap_out_xsd__boolean(soap, "AccessListChange", -1, &a->AccessListChange, "")) + return soap->error; + if (soap_out_PointerTocwmp1AccessList(soap, "AccessList", -1, &a->AccessList, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct * SOAP_FMAC4 soap_get_cwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__SetParameterAttributesStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct * SOAP_FMAC4 soap_in_cwmp1__SetParameterAttributesStruct(struct soap *soap, const char *tag, struct cwmp1__SetParameterAttributesStruct *a, const char *type) +{ + size_t soap_flag_Name = 1; + size_t soap_flag_NotificationChange = 1; + size_t soap_flag_Notification = 1; + size_t soap_flag_AccessListChange = 1; + size_t soap_flag_AccessList = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__SetParameterAttributesStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__SetParameterAttributesStruct, sizeof(struct cwmp1__SetParameterAttributesStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__SetParameterAttributesStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Name && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTostring(soap, "Name", &a->Name, "xsd:string")) + { soap_flag_Name--; + continue; + } + if (soap_flag_NotificationChange && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_xsd__boolean(soap, "NotificationChange", &a->NotificationChange, "xsd:boolean")) + { soap_flag_NotificationChange--; + continue; + } + if (soap_flag_Notification && soap->error == SOAP_TAG_MISMATCH) + if (soap_in__cwmp1__SetParameterAttributesStruct_Notification(soap, "Notification", &a->Notification, "cwmp:SetParameterAttributesStruct-Notification")) + { soap_flag_Notification--; + continue; + } + if (soap_flag_AccessListChange && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_xsd__boolean(soap, "AccessListChange", &a->AccessListChange, "xsd:boolean")) + { soap_flag_AccessListChange--; + continue; + } + if (soap_flag_AccessList && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_PointerTocwmp1AccessList(soap, "AccessList", &a->AccessList, "xsd:string")) + { soap_flag_AccessList--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__SetParameterAttributesStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__SetParameterAttributesStruct, 0, sizeof(struct cwmp1__SetParameterAttributesStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_NotificationChange > 0 || soap_flag_Notification > 0 || soap_flag_AccessListChange > 0 || soap_flag_AccessList > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->Name); + soap_default_xsd__boolean(soap, &a->Writable); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterInfoStruct(struct soap *soap, const struct cwmp1__ParameterInfoStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->Name); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterInfoStruct(struct soap *soap, const struct cwmp1__ParameterInfoStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__ParameterInfoStruct); + if (soap_out_cwmp1__ParameterInfoStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterInfoStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__ParameterInfoStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__ParameterInfoStruct), type)) + return soap->error; + if (soap_out_string(soap, "Name", -1, &a->Name, "")) + return soap->error; + if (soap_out_xsd__boolean(soap, "Writable", -1, &a->Writable, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct * SOAP_FMAC4 soap_get_cwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__ParameterInfoStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct * SOAP_FMAC4 soap_in_cwmp1__ParameterInfoStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterInfoStruct *a, const char *type) +{ + size_t soap_flag_Name = 1; + size_t soap_flag_Writable = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__ParameterInfoStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__ParameterInfoStruct, sizeof(struct cwmp1__ParameterInfoStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__ParameterInfoStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Name && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Name", &a->Name, "xsd:string")) + { soap_flag_Name--; + continue; + } + if (soap_flag_Writable && soap->error == SOAP_TAG_MISMATCH) + if (soap_in_xsd__boolean(soap, "Writable", &a->Writable, "xsd:boolean")) + { soap_flag_Writable--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__ParameterInfoStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__ParameterInfoStruct, 0, sizeof(struct cwmp1__ParameterInfoStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Name > 0 || soap_flag_Writable > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->Name); + soap_default_xsd__anySimpleType(soap, &a->Value); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterValueStruct(struct soap *soap, const struct cwmp1__ParameterValueStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->Name); + soap_serialize_xsd__anySimpleType(soap, &a->Value); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterValueStruct(struct soap *soap, const struct cwmp1__ParameterValueStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__ParameterValueStruct); + if (soap_out_cwmp1__ParameterValueStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterValueStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__ParameterValueStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__ParameterValueStruct), type)) + return soap->error; + if (soap_out_string(soap, "Name", -1, &a->Name, "")) + return soap->error; + if (soap_out_xsd__anySimpleType(soap, "Value", -1, &a->Value, a->Type)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__ParameterValueStruct * SOAP_FMAC4 soap_get_cwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__ParameterValueStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterValueStruct * SOAP_FMAC4 soap_in_cwmp1__ParameterValueStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterValueStruct *a, const char *type) +{ + size_t soap_flag_Name = 1; + size_t soap_flag_Value = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__ParameterValueStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__ParameterValueStruct, sizeof(struct cwmp1__ParameterValueStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__ParameterValueStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Name && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Name", &a->Name, "xsd:string")) + { soap_flag_Name--; + continue; + } + if (soap_flag_Value && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_xsd__anySimpleType(soap, "Value", &a->Value, "xsd:anySimpleType")) + { soap_flag_Value--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__ParameterValueStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__ParameterValueStruct, 0, sizeof(struct cwmp1__ParameterValueStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Name > 0 || soap_flag_Value > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->EventCode); + soap_default_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__EventStruct(struct soap *soap, const struct cwmp1__EventStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->EventCode); + soap_serialize_cwmp1__CommandKeyType(soap, &a->CommandKey); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__EventStruct(struct soap *soap, const struct cwmp1__EventStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__EventStruct); + if (soap_out_cwmp1__EventStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__EventStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__EventStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__EventStruct), type)) + return soap->error; + if (soap_out_string(soap, "EventCode", -1, &a->EventCode, "")) + return soap->error; + if (soap_out_cwmp1__CommandKeyType(soap, "CommandKey", -1, &a->CommandKey, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__EventStruct * SOAP_FMAC4 soap_get_cwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__EventStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__EventStruct * SOAP_FMAC4 soap_in_cwmp1__EventStruct(struct soap *soap, const char *tag, struct cwmp1__EventStruct *a, const char *type) +{ + size_t soap_flag_EventCode = 1; + size_t soap_flag_CommandKey = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__EventStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__EventStruct, sizeof(struct cwmp1__EventStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__EventStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_EventCode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "EventCode", &a->EventCode, "xsd:string")) + { soap_flag_EventCode--; + continue; + } + if (soap_flag_CommandKey && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_cwmp1__CommandKeyType(soap, "CommandKey", &a->CommandKey, "cwmp:CommandKeyType")) + { soap_flag_CommandKey--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__EventStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__EventStruct, 0, sizeof(struct cwmp1__EventStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_EventCode > 0 || soap_flag_CommandKey > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__DeviceIdStruct(struct soap *soap, struct cwmp1__DeviceIdStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->Manufacturer); + soap_default_string(soap, &a->OUI); + soap_default_string(soap, &a->ProductClass); + soap_default_string(soap, &a->SerialNumber); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__DeviceIdStruct(struct soap *soap, const struct cwmp1__DeviceIdStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->Manufacturer); + soap_serialize_string(soap, &a->OUI); + soap_serialize_string(soap, &a->ProductClass); + soap_serialize_string(soap, &a->SerialNumber); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__DeviceIdStruct(struct soap *soap, const struct cwmp1__DeviceIdStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__DeviceIdStruct); + if (soap_out_cwmp1__DeviceIdStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__DeviceIdStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__DeviceIdStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__DeviceIdStruct), type)) + return soap->error; + if (soap_out_string(soap, "Manufacturer", -1, &a->Manufacturer, "")) + return soap->error; + if (soap_out_string(soap, "OUI", -1, &a->OUI, "")) + return soap->error; + if (soap_out_string(soap, "ProductClass", -1, &a->ProductClass, "")) + return soap->error; + if (soap_out_string(soap, "SerialNumber", -1, &a->SerialNumber, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__DeviceIdStruct * SOAP_FMAC4 soap_get_cwmp1__DeviceIdStruct(struct soap *soap, struct cwmp1__DeviceIdStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__DeviceIdStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__DeviceIdStruct * SOAP_FMAC4 soap_in_cwmp1__DeviceIdStruct(struct soap *soap, const char *tag, struct cwmp1__DeviceIdStruct *a, const char *type) +{ + size_t soap_flag_Manufacturer = 1; + size_t soap_flag_OUI = 1; + size_t soap_flag_ProductClass = 1; + size_t soap_flag_SerialNumber = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__DeviceIdStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__DeviceIdStruct, sizeof(struct cwmp1__DeviceIdStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__DeviceIdStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_Manufacturer && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "Manufacturer", &a->Manufacturer, "xsd:string")) + { soap_flag_Manufacturer--; + continue; + } + if (soap_flag_OUI && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "OUI", &a->OUI, "xsd:string")) + { soap_flag_OUI--; + continue; + } + if (soap_flag_ProductClass && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "ProductClass", &a->ProductClass, "xsd:string")) + { soap_flag_ProductClass--; + continue; + } + if (soap_flag_SerialNumber && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "SerialNumber", &a->SerialNumber, "xsd:string")) + { soap_flag_SerialNumber--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__DeviceIdStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__DeviceIdStruct, 0, sizeof(struct cwmp1__DeviceIdStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_Manufacturer > 0 || soap_flag_OUI > 0 || soap_flag_ProductClass > 0 || soap_flag_SerialNumber > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__FaultStruct(struct soap *soap, struct cwmp1__FaultStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_default_string(soap, &a->FaultCode); + soap_default_string(soap, &a->FaultString); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__FaultStruct(struct soap *soap, const struct cwmp1__FaultStruct *a) +{ + (void)soap; (void)a; /* appease -Wall -Werror */ + soap_serialize_string(soap, &a->FaultCode); + soap_serialize_string(soap, &a->FaultString); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__FaultStruct(struct soap *soap, const struct cwmp1__FaultStruct *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__FaultStruct); + if (soap_out_cwmp1__FaultStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__FaultStruct(struct soap *soap, const char *tag, int id, const struct cwmp1__FaultStruct *a, const char *type) +{ + if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_cwmp1__FaultStruct), type)) + return soap->error; + if (soap_out_string(soap, "FaultCode", -1, &a->FaultCode, "")) + return soap->error; + if (soap_out_string(soap, "FaultString", -1, &a->FaultString, "")) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct cwmp1__FaultStruct * SOAP_FMAC4 soap_get_cwmp1__FaultStruct(struct soap *soap, struct cwmp1__FaultStruct *p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__FaultStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__FaultStruct * SOAP_FMAC4 soap_in_cwmp1__FaultStruct(struct soap *soap, const char *tag, struct cwmp1__FaultStruct *a, const char *type) +{ + size_t soap_flag_FaultCode = 1; + size_t soap_flag_FaultString = 1; + if (soap_element_begin_in(soap, tag, 0, type)) + return NULL; + a = (struct cwmp1__FaultStruct *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_cwmp1__FaultStruct, sizeof(struct cwmp1__FaultStruct), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_cwmp1__FaultStruct(soap, a); + if (soap->body && !*soap->href) + { + for (;;) + { soap->error = SOAP_TAG_MISMATCH; + if (soap_flag_FaultCode && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FaultCode", &a->FaultCode, "xsd:string")) + { soap_flag_FaultCode--; + continue; + } + if (soap_flag_FaultString && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) + if (soap_in_string(soap, "FaultString", &a->FaultString, "xsd:string")) + { soap_flag_FaultString--; + continue; + } + if (soap->error == SOAP_TAG_MISMATCH) + soap->error = soap_ignore_element(soap); + if (soap->error == SOAP_NO_TAG) + break; + if (soap->error) + return NULL; + } + if (soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct cwmp1__FaultStruct *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_cwmp1__FaultStruct, 0, sizeof(struct cwmp1__FaultStruct), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_FaultCode > 0 || soap_flag_FaultString > 0)) + { soap->error = SOAP_OCCURS; + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_SOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 *a) +{ + a->__size = 0; + a->__ptr = NULL; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_SOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 const*a) +{ + if (a->__ptr) + soap_array_reference(soap, a, (struct soap_array*)&a->__ptr, 1, SOAP_TYPE_SOAP_ENC__base64); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENC__base64(struct soap *soap, const struct SOAP_ENC__base64 *a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, (struct soap_array*)&a->__ptr, 1, tag, SOAP_TYPE_SOAP_ENC__base64); + if (soap_out_SOAP_ENC__base64(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENC__base64(struct soap *soap, const char *tag, int id, const struct SOAP_ENC__base64 *a, const char *type) +{ + id = soap_element_id(soap, tag, id, a, (struct soap_array*)&a->__ptr, 1, type, SOAP_TYPE_SOAP_ENC__base64); + if (id < 0) + return soap->error; + if (soap_element_begin_out(soap, tag, id, type)) + return soap->error; + if (soap_putbase64(soap, a->__ptr, a->__size)) + return soap->error; + return soap_element_end_out(soap, tag); +} + +SOAP_FMAC3 struct SOAP_ENC__base64 * SOAP_FMAC4 soap_get_SOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 *p, const char *tag, const char *type) +{ + if ((p = soap_in_SOAP_ENC__base64(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENC__base64 * SOAP_FMAC4 soap_in_SOAP_ENC__base64(struct soap *soap, const char *tag, struct SOAP_ENC__base64 *a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, ":base64Binary") && soap_match_tag(soap, soap->type, ":base64")) + { soap->error = SOAP_TYPE; + return NULL; + } + a = (struct SOAP_ENC__base64 *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENC__base64, sizeof(struct SOAP_ENC__base64), 0, NULL, NULL, NULL); + if (!a) + return NULL; + soap_default_SOAP_ENC__base64(soap, a); + if (soap->body && !*soap->href) + { + a->__ptr = soap_getbase64(soap, &a->__size, 0); + if ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag)) + return NULL; + } + else + { a = (struct SOAP_ENC__base64 *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENC__base64, 0, sizeof(struct SOAP_ENC__base64), 0, NULL); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) + soap_serialize_SOAP_ENV__Reason(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Reason); + if (soap_out_PointerToSOAP_ENV__Reason(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Reason *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Reason); + if (id < 0) + return soap->error; + return soap_out_SOAP_ENV__Reason(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToSOAP_ENV__Reason(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Reason ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct SOAP_ENV__Reason **)soap_malloc(soap, sizeof(struct SOAP_ENV__Reason *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_SOAP_ENV__Reason(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct SOAP_ENV__Reason **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) + soap_serialize_SOAP_ENV__Detail(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Detail); + if (soap_out_PointerToSOAP_ENV__Detail(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Detail *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Detail); + if (id < 0) + return soap->error; + return soap_out_SOAP_ENV__Detail(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToSOAP_ENV__Detail(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Detail ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct SOAP_ENV__Detail **)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_SOAP_ENV__Detail(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct SOAP_ENV__Detail **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +#ifndef WITH_NOGLOBAL + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) + soap_serialize_SOAP_ENV__Code(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENV__Code); + if (soap_out_PointerToSOAP_ENV__Code(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, int id, struct SOAP_ENV__Code *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code); + if (id < 0) + return soap->error; + return soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_get_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToSOAP_ENV__Code(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENV__Code ** SOAP_FMAC4 soap_in_PointerToSOAP_ENV__Code(struct soap *soap, const char *tag, struct SOAP_ENV__Code **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct SOAP_ENV__Code **)soap_malloc(soap, sizeof(struct SOAP_ENV__Code *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_SOAP_ENV__Code(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct SOAP_ENV__Code **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +#endif + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTounsignedInt(struct soap *soap, unsigned int *const*a) +{ + soap_reference(soap, *a, SOAP_TYPE_unsignedInt); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTounsignedInt(struct soap *soap, unsigned int *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTounsignedInt); + if (soap_out_PointerTounsignedInt(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTounsignedInt(struct soap *soap, const char *tag, int id, unsigned int *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_unsignedInt); + if (id < 0) + return soap->error; + return soap_out_unsignedInt(soap, tag, id, *a, type); +} + +SOAP_FMAC3 unsigned int ** SOAP_FMAC4 soap_get_PointerTounsignedInt(struct soap *soap, unsigned int **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTounsignedInt(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 unsigned int ** SOAP_FMAC4 soap_in_PointerTounsignedInt(struct soap *soap, const char *tag, unsigned int **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (unsigned int **)soap_malloc(soap, sizeof(unsigned int *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_unsignedInt(soap, tag, *a, type))) + return NULL; + } + else + { a = (unsigned int **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_unsignedInt, sizeof(unsigned int), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__ArgStruct)) + soap_serialize_PointerTocwmp1__ArgStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__ArgStruct); + if (soap_out_PointerToPointerTocwmp1__ArgStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ArgStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ArgStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__ArgStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__ArgStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ArgStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__ArgStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ArgStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ArgStruct(struct soap *soap, const char *tag, struct cwmp1__ArgStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ArgStruct ***)soap_malloc(soap, sizeof(struct cwmp1__ArgStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__ArgStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ArgStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__ArgStruct, sizeof(struct cwmp1__ArgStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__ArgStruct)) + soap_serialize_cwmp1__ArgStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__ArgStruct); + if (soap_out_PointerTocwmp1__ArgStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ArgStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ArgStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__ArgStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__ArgStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ArgStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ArgStruct(struct soap *soap, struct cwmp1__ArgStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__ArgStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ArgStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ArgStruct(struct soap *soap, const char *tag, struct cwmp1__ArgStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ArgStruct **)soap_malloc(soap, sizeof(struct cwmp1__ArgStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__ArgStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ArgStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__ArgStruct, sizeof(struct cwmp1__ArgStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__OptionStruct)) + soap_serialize_PointerTocwmp1__OptionStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__OptionStruct); + if (soap_out_PointerToPointerTocwmp1__OptionStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__OptionStruct(struct soap *soap, const char *tag, int id, struct cwmp1__OptionStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__OptionStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__OptionStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__OptionStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__OptionStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__OptionStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__OptionStruct(struct soap *soap, const char *tag, struct cwmp1__OptionStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__OptionStruct ***)soap_malloc(soap, sizeof(struct cwmp1__OptionStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__OptionStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__OptionStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__OptionStruct, sizeof(struct cwmp1__OptionStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__OptionStruct)) + soap_serialize_cwmp1__OptionStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__OptionStruct); + if (soap_out_PointerTocwmp1__OptionStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__OptionStruct(struct soap *soap, const char *tag, int id, struct cwmp1__OptionStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__OptionStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__OptionStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__OptionStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__OptionStruct(struct soap *soap, struct cwmp1__OptionStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__OptionStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__OptionStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__OptionStruct(struct soap *soap, const char *tag, struct cwmp1__OptionStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__OptionStruct **)soap_malloc(soap, sizeof(struct cwmp1__OptionStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__OptionStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__OptionStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__OptionStruct, sizeof(struct cwmp1__OptionStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerToSOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerToSOAP_ENC__base64)) + soap_serialize_PointerToSOAP_ENC__base64(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerToSOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerToSOAP_ENC__base64); + if (soap_out_PointerToPointerToSOAP_ENC__base64(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerToSOAP_ENC__base64(struct soap *soap, const char *tag, int id, struct SOAP_ENC__base64 **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerToSOAP_ENC__base64); + if (id < 0) + return soap->error; + return soap_out_PointerToSOAP_ENC__base64(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct SOAP_ENC__base64 *** SOAP_FMAC4 soap_get_PointerToPointerToSOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerToSOAP_ENC__base64(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENC__base64 *** SOAP_FMAC4 soap_in_PointerToPointerToSOAP_ENC__base64(struct soap *soap, const char *tag, struct SOAP_ENC__base64 ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct SOAP_ENC__base64 ***)soap_malloc(soap, sizeof(struct SOAP_ENC__base64 **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerToSOAP_ENC__base64(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct SOAP_ENC__base64 ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerToSOAP_ENC__base64, sizeof(struct SOAP_ENC__base64 *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 *const*a) +{ + if (*a) + soap_serialize_SOAP_ENC__base64(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToSOAP_ENC__base64); + if (soap_out_PointerToSOAP_ENC__base64(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToSOAP_ENC__base64(struct soap *soap, const char *tag, int id, struct SOAP_ENC__base64 *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptr, 1, type, SOAP_TYPE_SOAP_ENC__base64); + if (id < 0) + return soap->error; + return soap_out_SOAP_ENC__base64(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct SOAP_ENC__base64 ** SOAP_FMAC4 soap_get_PointerToSOAP_ENC__base64(struct soap *soap, struct SOAP_ENC__base64 **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToSOAP_ENC__base64(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct SOAP_ENC__base64 ** SOAP_FMAC4 soap_in_PointerToSOAP_ENC__base64(struct soap *soap, const char *tag, struct SOAP_ENC__base64 **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct SOAP_ENC__base64 **)soap_malloc(soap, sizeof(struct SOAP_ENC__base64 *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_SOAP_ENC__base64(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct SOAP_ENC__base64 **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_SOAP_ENC__base64, sizeof(struct SOAP_ENC__base64), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct)) + soap_serialize_PointerTocwmp1__AllQueuedTransferStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__AllQueuedTransferStruct); + if (soap_out_PointerToPointerTocwmp1__AllQueuedTransferStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, const char *tag, int id, struct cwmp1__AllQueuedTransferStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__AllQueuedTransferStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__AllQueuedTransferStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, const char *tag, struct cwmp1__AllQueuedTransferStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__AllQueuedTransferStruct ***)soap_malloc(soap, sizeof(struct cwmp1__AllQueuedTransferStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__AllQueuedTransferStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__AllQueuedTransferStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct, sizeof(struct cwmp1__AllQueuedTransferStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__AllQueuedTransferStruct)) + soap_serialize_cwmp1__AllQueuedTransferStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__AllQueuedTransferStruct); + if (soap_out_PointerTocwmp1__AllQueuedTransferStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, const char *tag, int id, struct cwmp1__AllQueuedTransferStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__AllQueuedTransferStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__AllQueuedTransferStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, struct cwmp1__AllQueuedTransferStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__AllQueuedTransferStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__AllQueuedTransferStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__AllQueuedTransferStruct(struct soap *soap, const char *tag, struct cwmp1__AllQueuedTransferStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__AllQueuedTransferStruct **)soap_malloc(soap, sizeof(struct cwmp1__AllQueuedTransferStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__AllQueuedTransferStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__AllQueuedTransferStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__AllQueuedTransferStruct, sizeof(struct cwmp1__AllQueuedTransferStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct)) + soap_serialize_PointerTocwmp1__QueuedTransferStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__QueuedTransferStruct); + if (soap_out_PointerToPointerTocwmp1__QueuedTransferStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap *soap, const char *tag, int id, struct cwmp1__QueuedTransferStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__QueuedTransferStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__QueuedTransferStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__QueuedTransferStruct(struct soap *soap, const char *tag, struct cwmp1__QueuedTransferStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__QueuedTransferStruct ***)soap_malloc(soap, sizeof(struct cwmp1__QueuedTransferStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__QueuedTransferStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__QueuedTransferStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct, sizeof(struct cwmp1__QueuedTransferStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__QueuedTransferStruct)) + soap_serialize_cwmp1__QueuedTransferStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__QueuedTransferStruct); + if (soap_out_PointerTocwmp1__QueuedTransferStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__QueuedTransferStruct(struct soap *soap, const char *tag, int id, struct cwmp1__QueuedTransferStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__QueuedTransferStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__QueuedTransferStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__QueuedTransferStruct(struct soap *soap, struct cwmp1__QueuedTransferStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__QueuedTransferStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__QueuedTransferStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__QueuedTransferStruct(struct soap *soap, const char *tag, struct cwmp1__QueuedTransferStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__QueuedTransferStruct **)soap_malloc(soap, sizeof(struct cwmp1__QueuedTransferStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__QueuedTransferStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__QueuedTransferStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__QueuedTransferStruct, sizeof(struct cwmp1__QueuedTransferStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct)) + soap_serialize_PointerTocwmp1__ParameterAttributeStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__ParameterAttributeStruct); + if (soap_out_PointerToPointerTocwmp1__ParameterAttributeStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ParameterAttributeStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__ParameterAttributeStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__ParameterAttributeStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ParameterAttributeStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterAttributeStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ParameterAttributeStruct ***)soap_malloc(soap, sizeof(struct cwmp1__ParameterAttributeStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__ParameterAttributeStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ParameterAttributeStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct, sizeof(struct cwmp1__ParameterAttributeStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__ParameterAttributeStruct)) + soap_serialize_cwmp1__ParameterAttributeStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__ParameterAttributeStruct); + if (soap_out_PointerTocwmp1__ParameterAttributeStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ParameterAttributeStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ParameterAttributeStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__ParameterAttributeStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__ParameterAttributeStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ParameterAttributeStruct(struct soap *soap, struct cwmp1__ParameterAttributeStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__ParameterAttributeStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterAttributeStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ParameterAttributeStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterAttributeStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ParameterAttributeStruct **)soap_malloc(soap, sizeof(struct cwmp1__ParameterAttributeStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__ParameterAttributeStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ParameterAttributeStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__ParameterAttributeStruct, sizeof(struct cwmp1__ParameterAttributeStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct)) + soap_serialize_PointerTocwmp1__SetParameterAttributesStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__SetParameterAttributesStruct); + if (soap_out_PointerToPointerTocwmp1__SetParameterAttributesStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, const char *tag, int id, struct cwmp1__SetParameterAttributesStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__SetParameterAttributesStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__SetParameterAttributesStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, const char *tag, struct cwmp1__SetParameterAttributesStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__SetParameterAttributesStruct ***)soap_malloc(soap, sizeof(struct cwmp1__SetParameterAttributesStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__SetParameterAttributesStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__SetParameterAttributesStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct, sizeof(struct cwmp1__SetParameterAttributesStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__SetParameterAttributesStruct)) + soap_serialize_cwmp1__SetParameterAttributesStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__SetParameterAttributesStruct); + if (soap_out_PointerTocwmp1__SetParameterAttributesStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, const char *tag, int id, struct cwmp1__SetParameterAttributesStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__SetParameterAttributesStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__SetParameterAttributesStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, struct cwmp1__SetParameterAttributesStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__SetParameterAttributesStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__SetParameterAttributesStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__SetParameterAttributesStruct(struct soap *soap, const char *tag, struct cwmp1__SetParameterAttributesStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__SetParameterAttributesStruct **)soap_malloc(soap, sizeof(struct cwmp1__SetParameterAttributesStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__SetParameterAttributesStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__SetParameterAttributesStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__SetParameterAttributesStruct, sizeof(struct cwmp1__SetParameterAttributesStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct)) + soap_serialize_PointerTocwmp1__ParameterInfoStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__ParameterInfoStruct); + if (soap_out_PointerToPointerTocwmp1__ParameterInfoStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ParameterInfoStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__ParameterInfoStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__ParameterInfoStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ParameterInfoStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterInfoStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ParameterInfoStruct ***)soap_malloc(soap, sizeof(struct cwmp1__ParameterInfoStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__ParameterInfoStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ParameterInfoStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct, sizeof(struct cwmp1__ParameterInfoStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__ParameterInfoStruct)) + soap_serialize_cwmp1__ParameterInfoStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__ParameterInfoStruct); + if (soap_out_PointerTocwmp1__ParameterInfoStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ParameterInfoStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ParameterInfoStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__ParameterInfoStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__ParameterInfoStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ParameterInfoStruct(struct soap *soap, struct cwmp1__ParameterInfoStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__ParameterInfoStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterInfoStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ParameterInfoStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterInfoStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ParameterInfoStruct **)soap_malloc(soap, sizeof(struct cwmp1__ParameterInfoStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__ParameterInfoStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ParameterInfoStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__ParameterInfoStruct, sizeof(struct cwmp1__ParameterInfoStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__ParameterValueStruct)) + soap_serialize_PointerTocwmp1__ParameterValueStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__ParameterValueStruct); + if (soap_out_PointerToPointerTocwmp1__ParameterValueStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__ParameterValueStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ParameterValueStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__ParameterValueStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__ParameterValueStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ParameterValueStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__ParameterValueStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterValueStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__ParameterValueStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterValueStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ParameterValueStruct ***)soap_malloc(soap, sizeof(struct cwmp1__ParameterValueStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__ParameterValueStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ParameterValueStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__ParameterValueStruct, sizeof(struct cwmp1__ParameterValueStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__ParameterValueStruct)) + soap_serialize_cwmp1__ParameterValueStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__ParameterValueStruct); + if (soap_out_PointerTocwmp1__ParameterValueStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__ParameterValueStruct(struct soap *soap, const char *tag, int id, struct cwmp1__ParameterValueStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__ParameterValueStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__ParameterValueStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__ParameterValueStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__ParameterValueStruct(struct soap *soap, struct cwmp1__ParameterValueStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__ParameterValueStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__ParameterValueStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__ParameterValueStruct(struct soap *soap, const char *tag, struct cwmp1__ParameterValueStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__ParameterValueStruct **)soap_malloc(soap, sizeof(struct cwmp1__ParameterValueStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__ParameterValueStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__ParameterValueStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__ParameterValueStruct, sizeof(struct cwmp1__ParameterValueStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToPointerTocwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_PointerTocwmp1__EventStruct)) + soap_serialize_PointerTocwmp1__EventStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToPointerTocwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerToPointerTocwmp1__EventStruct); + if (soap_out_PointerToPointerTocwmp1__EventStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerToPointerTocwmp1__EventStruct(struct soap *soap, const char *tag, int id, struct cwmp1__EventStruct **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_PointerTocwmp1__EventStruct); + if (id < 0) + return soap->error; + return soap_out_PointerTocwmp1__EventStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__EventStruct *** SOAP_FMAC4 soap_get_PointerToPointerTocwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerToPointerTocwmp1__EventStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__EventStruct *** SOAP_FMAC4 soap_in_PointerToPointerTocwmp1__EventStruct(struct soap *soap, const char *tag, struct cwmp1__EventStruct ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__EventStruct ***)soap_malloc(soap, sizeof(struct cwmp1__EventStruct **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_PointerTocwmp1__EventStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__EventStruct ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_PointerTocwmp1__EventStruct, sizeof(struct cwmp1__EventStruct *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__EventStruct)) + soap_serialize_cwmp1__EventStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__EventStruct); + if (soap_out_PointerTocwmp1__EventStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__EventStruct(struct soap *soap, const char *tag, int id, struct cwmp1__EventStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__EventStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__EventStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__EventStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__EventStruct(struct soap *soap, struct cwmp1__EventStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__EventStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__EventStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__EventStruct(struct soap *soap, const char *tag, struct cwmp1__EventStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__EventStruct **)soap_malloc(soap, sizeof(struct cwmp1__EventStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__EventStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__EventStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__EventStruct, sizeof(struct cwmp1__EventStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1FileTypeArg(struct soap *soap, struct cwmp1FileTypeArg *const*a) +{ + if (*a) + soap_serialize_cwmp1FileTypeArg(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1FileTypeArg(struct soap *soap, struct cwmp1FileTypeArg *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1FileTypeArg); + if (soap_out_PointerTocwmp1FileTypeArg(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1FileTypeArg(struct soap *soap, const char *tag, int id, struct cwmp1FileTypeArg *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrArgStruct, 1, type, SOAP_TYPE_cwmp1FileTypeArg); + if (id < 0) + return soap->error; + return soap_out_cwmp1FileTypeArg(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1FileTypeArg ** SOAP_FMAC4 soap_get_PointerTocwmp1FileTypeArg(struct soap *soap, struct cwmp1FileTypeArg **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1FileTypeArg(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1FileTypeArg ** SOAP_FMAC4 soap_in_PointerTocwmp1FileTypeArg(struct soap *soap, const char *tag, struct cwmp1FileTypeArg **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1FileTypeArg **)soap_malloc(soap, sizeof(struct cwmp1FileTypeArg *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1FileTypeArg(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1FileTypeArg **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1FileTypeArg, sizeof(struct cwmp1FileTypeArg), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__FaultStruct(struct soap *soap, struct cwmp1__FaultStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__FaultStruct)) + soap_serialize_cwmp1__FaultStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__FaultStruct(struct soap *soap, struct cwmp1__FaultStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__FaultStruct); + if (soap_out_PointerTocwmp1__FaultStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__FaultStruct(struct soap *soap, const char *tag, int id, struct cwmp1__FaultStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__FaultStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__FaultStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__FaultStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__FaultStruct(struct soap *soap, struct cwmp1__FaultStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__FaultStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__FaultStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__FaultStruct(struct soap *soap, const char *tag, struct cwmp1__FaultStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__FaultStruct **)soap_malloc(soap, sizeof(struct cwmp1__FaultStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__FaultStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__FaultStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__FaultStruct, sizeof(struct cwmp1__FaultStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1EventList(struct soap *soap, struct cwmp1EventList *const*a) +{ + if (*a) + soap_serialize_cwmp1EventList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1EventList(struct soap *soap, struct cwmp1EventList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1EventList); + if (soap_out_PointerTocwmp1EventList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1EventList(struct soap *soap, const char *tag, int id, struct cwmp1EventList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrEventStruct, 1, type, SOAP_TYPE_cwmp1EventList); + if (id < 0) + return soap->error; + return soap_out_cwmp1EventList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1EventList ** SOAP_FMAC4 soap_get_PointerTocwmp1EventList(struct soap *soap, struct cwmp1EventList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1EventList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1EventList ** SOAP_FMAC4 soap_in_PointerTocwmp1EventList(struct soap *soap, const char *tag, struct cwmp1EventList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1EventList **)soap_malloc(soap, sizeof(struct cwmp1EventList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1EventList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1EventList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1EventList, sizeof(struct cwmp1EventList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1__DeviceIdStruct(struct soap *soap, struct cwmp1__DeviceIdStruct *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_cwmp1__DeviceIdStruct)) + soap_serialize_cwmp1__DeviceIdStruct(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1__DeviceIdStruct(struct soap *soap, struct cwmp1__DeviceIdStruct *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1__DeviceIdStruct); + if (soap_out_PointerTocwmp1__DeviceIdStruct(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1__DeviceIdStruct(struct soap *soap, const char *tag, int id, struct cwmp1__DeviceIdStruct *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_cwmp1__DeviceIdStruct); + if (id < 0) + return soap->error; + return soap_out_cwmp1__DeviceIdStruct(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1__DeviceIdStruct ** SOAP_FMAC4 soap_get_PointerTocwmp1__DeviceIdStruct(struct soap *soap, struct cwmp1__DeviceIdStruct **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1__DeviceIdStruct(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1__DeviceIdStruct ** SOAP_FMAC4 soap_in_PointerTocwmp1__DeviceIdStruct(struct soap *soap, const char *tag, struct cwmp1__DeviceIdStruct **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1__DeviceIdStruct **)soap_malloc(soap, sizeof(struct cwmp1__DeviceIdStruct *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1__DeviceIdStruct(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1__DeviceIdStruct **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1__DeviceIdStruct, sizeof(struct cwmp1__DeviceIdStruct), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1AllTransferList(struct soap *soap, struct cwmp1AllTransferList *const*a) +{ + if (*a) + soap_serialize_cwmp1AllTransferList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1AllTransferList(struct soap *soap, struct cwmp1AllTransferList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1AllTransferList); + if (soap_out_PointerTocwmp1AllTransferList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1AllTransferList(struct soap *soap, const char *tag, int id, struct cwmp1AllTransferList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrAllQueuedTransferStruct, 1, type, SOAP_TYPE_cwmp1AllTransferList); + if (id < 0) + return soap->error; + return soap_out_cwmp1AllTransferList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1AllTransferList ** SOAP_FMAC4 soap_get_PointerTocwmp1AllTransferList(struct soap *soap, struct cwmp1AllTransferList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1AllTransferList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1AllTransferList ** SOAP_FMAC4 soap_in_PointerTocwmp1AllTransferList(struct soap *soap, const char *tag, struct cwmp1AllTransferList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1AllTransferList **)soap_malloc(soap, sizeof(struct cwmp1AllTransferList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1AllTransferList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1AllTransferList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1AllTransferList, sizeof(struct cwmp1AllTransferList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1OptionList(struct soap *soap, struct cwmp1OptionList *const*a) +{ + if (*a) + soap_serialize_cwmp1OptionList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1OptionList(struct soap *soap, struct cwmp1OptionList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1OptionList); + if (soap_out_PointerTocwmp1OptionList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1OptionList(struct soap *soap, const char *tag, int id, struct cwmp1OptionList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrOptionStruct, 1, type, SOAP_TYPE_cwmp1OptionList); + if (id < 0) + return soap->error; + return soap_out_cwmp1OptionList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1OptionList ** SOAP_FMAC4 soap_get_PointerTocwmp1OptionList(struct soap *soap, struct cwmp1OptionList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1OptionList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1OptionList ** SOAP_FMAC4 soap_in_PointerTocwmp1OptionList(struct soap *soap, const char *tag, struct cwmp1OptionList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1OptionList **)soap_malloc(soap, sizeof(struct cwmp1OptionList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1OptionList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1OptionList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1OptionList, sizeof(struct cwmp1OptionList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1VoucherList(struct soap *soap, struct cwmp1VoucherList *const*a) +{ + if (*a) + soap_serialize_cwmp1VoucherList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1VoucherList(struct soap *soap, struct cwmp1VoucherList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1VoucherList); + if (soap_out_PointerTocwmp1VoucherList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1VoucherList(struct soap *soap, const char *tag, int id, struct cwmp1VoucherList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrbase64, 1, type, SOAP_TYPE_cwmp1VoucherList); + if (id < 0) + return soap->error; + return soap_out_cwmp1VoucherList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1VoucherList ** SOAP_FMAC4 soap_get_PointerTocwmp1VoucherList(struct soap *soap, struct cwmp1VoucherList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1VoucherList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1VoucherList ** SOAP_FMAC4 soap_in_PointerTocwmp1VoucherList(struct soap *soap, const char *tag, struct cwmp1VoucherList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1VoucherList **)soap_malloc(soap, sizeof(struct cwmp1VoucherList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1VoucherList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1VoucherList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1VoucherList, sizeof(struct cwmp1VoucherList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1TransferList(struct soap *soap, struct cwmp1TransferList *const*a) +{ + if (*a) + soap_serialize_cwmp1TransferList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1TransferList(struct soap *soap, struct cwmp1TransferList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1TransferList); + if (soap_out_PointerTocwmp1TransferList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1TransferList(struct soap *soap, const char *tag, int id, struct cwmp1TransferList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrQueuedTransferStruct, 1, type, SOAP_TYPE_cwmp1TransferList); + if (id < 0) + return soap->error; + return soap_out_cwmp1TransferList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1TransferList ** SOAP_FMAC4 soap_get_PointerTocwmp1TransferList(struct soap *soap, struct cwmp1TransferList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1TransferList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1TransferList ** SOAP_FMAC4 soap_in_PointerTocwmp1TransferList(struct soap *soap, const char *tag, struct cwmp1TransferList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1TransferList **)soap_malloc(soap, sizeof(struct cwmp1TransferList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1TransferList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1TransferList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1TransferList, sizeof(struct cwmp1TransferList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterAttributeList(struct soap *soap, struct cwmp1ParameterAttributeList *const*a) +{ + if (*a) + soap_serialize_cwmp1ParameterAttributeList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterAttributeList(struct soap *soap, struct cwmp1ParameterAttributeList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1ParameterAttributeList); + if (soap_out_PointerTocwmp1ParameterAttributeList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterAttributeList(struct soap *soap, const char *tag, int id, struct cwmp1ParameterAttributeList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrParameterAttributeStruct, 1, type, SOAP_TYPE_cwmp1ParameterAttributeList); + if (id < 0) + return soap->error; + return soap_out_cwmp1ParameterAttributeList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1ParameterAttributeList ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterAttributeList(struct soap *soap, struct cwmp1ParameterAttributeList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1ParameterAttributeList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterAttributeList ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterAttributeList(struct soap *soap, const char *tag, struct cwmp1ParameterAttributeList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1ParameterAttributeList **)soap_malloc(soap, sizeof(struct cwmp1ParameterAttributeList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1ParameterAttributeList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1ParameterAttributeList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1ParameterAttributeList, sizeof(struct cwmp1ParameterAttributeList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1SetParameterAttributesList(struct soap *soap, struct cwmp1SetParameterAttributesList *const*a) +{ + if (*a) + soap_serialize_cwmp1SetParameterAttributesList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1SetParameterAttributesList(struct soap *soap, struct cwmp1SetParameterAttributesList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1SetParameterAttributesList); + if (soap_out_PointerTocwmp1SetParameterAttributesList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1SetParameterAttributesList(struct soap *soap, const char *tag, int id, struct cwmp1SetParameterAttributesList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrSetParameterAttributesStruct, 1, type, SOAP_TYPE_cwmp1SetParameterAttributesList); + if (id < 0) + return soap->error; + return soap_out_cwmp1SetParameterAttributesList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1SetParameterAttributesList ** SOAP_FMAC4 soap_get_PointerTocwmp1SetParameterAttributesList(struct soap *soap, struct cwmp1SetParameterAttributesList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1SetParameterAttributesList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1SetParameterAttributesList ** SOAP_FMAC4 soap_in_PointerTocwmp1SetParameterAttributesList(struct soap *soap, const char *tag, struct cwmp1SetParameterAttributesList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1SetParameterAttributesList **)soap_malloc(soap, sizeof(struct cwmp1SetParameterAttributesList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1SetParameterAttributesList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1SetParameterAttributesList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1SetParameterAttributesList, sizeof(struct cwmp1SetParameterAttributesList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterInfoList(struct soap *soap, struct cwmp1ParameterInfoList *const*a) +{ + if (*a) + soap_serialize_cwmp1ParameterInfoList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterInfoList(struct soap *soap, struct cwmp1ParameterInfoList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1ParameterInfoList); + if (soap_out_PointerTocwmp1ParameterInfoList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterInfoList(struct soap *soap, const char *tag, int id, struct cwmp1ParameterInfoList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrParameterInfoStruct, 1, type, SOAP_TYPE_cwmp1ParameterInfoList); + if (id < 0) + return soap->error; + return soap_out_cwmp1ParameterInfoList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1ParameterInfoList ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterInfoList(struct soap *soap, struct cwmp1ParameterInfoList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1ParameterInfoList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterInfoList ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterInfoList(struct soap *soap, const char *tag, struct cwmp1ParameterInfoList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1ParameterInfoList **)soap_malloc(soap, sizeof(struct cwmp1ParameterInfoList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1ParameterInfoList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1ParameterInfoList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1ParameterInfoList, sizeof(struct cwmp1ParameterInfoList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterNames(struct soap *soap, struct cwmp1ParameterNames *const*a) +{ + if (*a) + soap_serialize_cwmp1ParameterNames(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterNames(struct soap *soap, struct cwmp1ParameterNames *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1ParameterNames); + if (soap_out_PointerTocwmp1ParameterNames(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterNames(struct soap *soap, const char *tag, int id, struct cwmp1ParameterNames *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrstring, 1, type, SOAP_TYPE_cwmp1ParameterNames); + if (id < 0) + return soap->error; + return soap_out_cwmp1ParameterNames(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1ParameterNames ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterNames(struct soap *soap, struct cwmp1ParameterNames **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1ParameterNames(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterNames ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterNames(struct soap *soap, const char *tag, struct cwmp1ParameterNames **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1ParameterNames **)soap_malloc(soap, sizeof(struct cwmp1ParameterNames *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1ParameterNames(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1ParameterNames **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1ParameterNames, sizeof(struct cwmp1ParameterNames), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1ParameterValueList(struct soap *soap, struct cwmp1ParameterValueList *const*a) +{ + if (*a) + soap_serialize_cwmp1ParameterValueList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1ParameterValueList(struct soap *soap, struct cwmp1ParameterValueList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1ParameterValueList); + if (soap_out_PointerTocwmp1ParameterValueList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1ParameterValueList(struct soap *soap, const char *tag, int id, struct cwmp1ParameterValueList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrParameterValueStruct, 1, type, SOAP_TYPE_cwmp1ParameterValueList); + if (id < 0) + return soap->error; + return soap_out_cwmp1ParameterValueList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1ParameterValueList ** SOAP_FMAC4 soap_get_PointerTocwmp1ParameterValueList(struct soap *soap, struct cwmp1ParameterValueList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1ParameterValueList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1ParameterValueList ** SOAP_FMAC4 soap_in_PointerTocwmp1ParameterValueList(struct soap *soap, const char *tag, struct cwmp1ParameterValueList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1ParameterValueList **)soap_malloc(soap, sizeof(struct cwmp1ParameterValueList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1ParameterValueList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1ParameterValueList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1ParameterValueList, sizeof(struct cwmp1ParameterValueList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1MethodList(struct soap *soap, struct cwmp1MethodList *const*a) +{ + if (*a) + soap_serialize_cwmp1MethodList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1MethodList(struct soap *soap, struct cwmp1MethodList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1MethodList); + if (soap_out_PointerTocwmp1MethodList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1MethodList(struct soap *soap, const char *tag, int id, struct cwmp1MethodList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrstring, 1, type, SOAP_TYPE_cwmp1MethodList); + if (id < 0) + return soap->error; + return soap_out_cwmp1MethodList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1MethodList ** SOAP_FMAC4 soap_get_PointerTocwmp1MethodList(struct soap *soap, struct cwmp1MethodList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1MethodList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1MethodList ** SOAP_FMAC4 soap_in_PointerTocwmp1MethodList(struct soap *soap, const char *tag, struct cwmp1MethodList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1MethodList **)soap_malloc(soap, sizeof(struct cwmp1MethodList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1MethodList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1MethodList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1MethodList, sizeof(struct cwmp1MethodList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap *soap, struct _cwmp1__Fault_SetParameterValuesFault *const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault)) + soap_serialize__cwmp1__Fault_SetParameterValuesFault(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap *soap, struct _cwmp1__Fault_SetParameterValuesFault *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTo_cwmp1__Fault_SetParameterValuesFault); + if (soap_out_PointerTo_cwmp1__Fault_SetParameterValuesFault(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap *soap, const char *tag, int id, struct _cwmp1__Fault_SetParameterValuesFault *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault); + if (id < 0) + return soap->error; + return soap_out__cwmp1__Fault_SetParameterValuesFault(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault ** SOAP_FMAC4 soap_get_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap *soap, struct _cwmp1__Fault_SetParameterValuesFault **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTo_cwmp1__Fault_SetParameterValuesFault(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct _cwmp1__Fault_SetParameterValuesFault ** SOAP_FMAC4 soap_in_PointerTo_cwmp1__Fault_SetParameterValuesFault(struct soap *soap, const char *tag, struct _cwmp1__Fault_SetParameterValuesFault **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct _cwmp1__Fault_SetParameterValuesFault **)soap_malloc(soap, sizeof(struct _cwmp1__Fault_SetParameterValuesFault *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in__cwmp1__Fault_SetParameterValuesFault(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct _cwmp1__Fault_SetParameterValuesFault **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE__cwmp1__Fault_SetParameterValuesFault, sizeof(struct _cwmp1__Fault_SetParameterValuesFault), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTotime(struct soap *soap, time_t *const*a) +{ + soap_reference(soap, *a, SOAP_TYPE_time); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTotime(struct soap *soap, time_t *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTotime); + if (soap_out_PointerTotime(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTotime(struct soap *soap, const char *tag, int id, time_t *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_time); + if (id < 0) + return soap->error; + return soap_out_time(soap, tag, id, *a, type); +} + +SOAP_FMAC3 time_t ** SOAP_FMAC4 soap_get_PointerTotime(struct soap *soap, time_t **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTotime(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 time_t ** SOAP_FMAC4 soap_in_PointerTotime(struct soap *soap, const char *tag, time_t **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (time_t **)soap_malloc(soap, sizeof(time_t *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_time(soap, tag, *a, type))) + return NULL; + } + else + { a = (time_t **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_time, sizeof(time_t), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTocwmp1AccessList(struct soap *soap, struct cwmp1AccessList *const*a) +{ + if (*a) + soap_serialize_cwmp1AccessList(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTocwmp1AccessList(struct soap *soap, struct cwmp1AccessList *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTocwmp1AccessList); + if (soap_out_PointerTocwmp1AccessList(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTocwmp1AccessList(struct soap *soap, const char *tag, int id, struct cwmp1AccessList *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, (struct soap_array*)&(*a)->__ptrstring, 1, type, SOAP_TYPE_cwmp1AccessList); + if (id < 0) + return soap->error; + return soap_out_cwmp1AccessList(soap, tag, id, *a, type); +} + +SOAP_FMAC3 struct cwmp1AccessList ** SOAP_FMAC4 soap_get_PointerTocwmp1AccessList(struct soap *soap, struct cwmp1AccessList **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTocwmp1AccessList(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 struct cwmp1AccessList ** SOAP_FMAC4 soap_in_PointerTocwmp1AccessList(struct soap *soap, const char *tag, struct cwmp1AccessList **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (struct cwmp1AccessList **)soap_malloc(soap, sizeof(struct cwmp1AccessList *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_cwmp1AccessList(soap, tag, *a, type))) + return NULL; + } + else + { a = (struct cwmp1AccessList **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_cwmp1AccessList, sizeof(struct cwmp1AccessList), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTostring(struct soap *soap, char **const*a) +{ + if (!soap_reference(soap, *a, SOAP_TYPE_string)) + soap_serialize_string(soap, *a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTostring(struct soap *soap, char **const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTostring); + if (soap_out_PointerTostring(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTostring(struct soap *soap, const char *tag, int id, char **const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_string); + if (id < 0) + return soap->error; + return soap_out_string(soap, tag, id, *a, type); +} + +SOAP_FMAC3 char *** SOAP_FMAC4 soap_get_PointerTostring(struct soap *soap, char ***p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTostring(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char *** SOAP_FMAC4 soap_in_PointerTostring(struct soap *soap, const char *tag, char ***a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (char ***)soap_malloc(soap, sizeof(char **)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_string(soap, tag, *a, type))) + return NULL; + } + else + { a = (char ***)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_string, sizeof(char *), 1); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ObjectNameType(struct soap *soap, char **a) +{ soap_default_string(soap, a); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ObjectNameType(struct soap *soap, char *const*a) +{ soap_serialize_string(soap, a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ObjectNameType(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__ObjectNameType); + if (soap_out_cwmp1__ObjectNameType(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ObjectNameType(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_cwmp1__ObjectNameType); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__ObjectNameType(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__ObjectNameType(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__ObjectNameType(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE_cwmp1__ObjectNameType, 1, -1, 256); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__CommandKeyType(struct soap *soap, char **a) +{ soap_default_string(soap, a); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__CommandKeyType(struct soap *soap, char *const*a) +{ soap_serialize_string(soap, a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__CommandKeyType(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__CommandKeyType); + if (soap_out_cwmp1__CommandKeyType(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__CommandKeyType(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_cwmp1__CommandKeyType); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__CommandKeyType(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__CommandKeyType(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__CommandKeyType(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE_cwmp1__CommandKeyType, 1, -1, 32); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__ParameterKeyType(struct soap *soap, char **a) +{ soap_default_string(soap, a); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__ParameterKeyType(struct soap *soap, char *const*a) +{ soap_serialize_string(soap, a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__ParameterKeyType(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__ParameterKeyType); + if (soap_out_cwmp1__ParameterKeyType(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__ParameterKeyType(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_cwmp1__ParameterKeyType); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__ParameterKeyType(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__ParameterKeyType(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__ParameterKeyType(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE_cwmp1__ParameterKeyType, 1, -1, 32); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_cwmp1__FaultCodeType(struct soap *soap, char **a) +{ soap_default_string(soap, a); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_cwmp1__FaultCodeType(struct soap *soap, char *const*a) +{ soap_serialize_string(soap, a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_cwmp1__FaultCodeType(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_cwmp1__FaultCodeType); + if (soap_out_cwmp1__FaultCodeType(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_cwmp1__FaultCodeType(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_cwmp1__FaultCodeType); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_cwmp1__FaultCodeType(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in_cwmp1__FaultCodeType(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_cwmp1__FaultCodeType(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE_cwmp1__FaultCodeType, 1, -1, -1); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__anySimpleType(struct soap *soap, char **a) +{ soap_default_string(soap, a); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anySimpleType(struct soap *soap, char *const*a) +{ soap_serialize_string(soap, a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anySimpleType(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_xsd__anySimpleType); + if (soap_out_xsd__anySimpleType(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__anySimpleType(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_xsd__anySimpleType); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_xsd__anySimpleType(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in_xsd__anySimpleType(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_xsd__anySimpleType(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE_xsd__anySimpleType, 1, -1, -1); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTounsignedByte(struct soap *soap, unsigned char *const*a) +{ + soap_reference(soap, *a, SOAP_TYPE_unsignedByte); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTounsignedByte(struct soap *soap, unsigned char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_PointerTounsignedByte); + if (soap_out_PointerTounsignedByte(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTounsignedByte(struct soap *soap, const char *tag, int id, unsigned char *const*a, const char *type) +{ + id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_unsignedByte); + if (id < 0) + return soap->error; + return soap_out_unsignedByte(soap, tag, id, *a, type); +} + +SOAP_FMAC3 unsigned char ** SOAP_FMAC4 soap_get_PointerTounsignedByte(struct soap *soap, unsigned char **p, const char *tag, const char *type) +{ + if ((p = soap_in_PointerTounsignedByte(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 unsigned char ** SOAP_FMAC4 soap_in_PointerTounsignedByte(struct soap *soap, const char *tag, unsigned char **a, const char *type) +{ + if (soap_element_begin_in(soap, tag, 1, NULL)) + return NULL; + if (!a) + if (!(a = (unsigned char **)soap_malloc(soap, sizeof(unsigned char *)))) + return NULL; + *a = NULL; + if (!soap->null && *soap->href != '#') + { soap_revert(soap); + if (!(*a = soap_in_unsignedByte(soap, tag, *a, type))) + return NULL; + } + else + { a = (unsigned char **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_unsignedByte, sizeof(unsigned char), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + } + return a; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default__QName(struct soap *soap, char **a) +{ soap_default_string(soap, a); +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap *soap, char *const*a) +{ soap_serialize_string(soap, a); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE__QName); + if (soap_out__QName(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE__QName); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in__QName(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, -1, -1); + return p; +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_default_string(struct soap *soap, char **a) +{ (void)soap; /* appease -Wall -Werror */ +#ifdef SOAP_DEFAULT_string + *a = SOAP_DEFAULT_string; +#else + *a = (char *)0; +#endif +} + +SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) +{ + soap_reference(soap, *a, SOAP_TYPE_string); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) +{ + register int id = soap_embed(soap, (void*)a, NULL, 0, tag, SOAP_TYPE_string); + if (soap_out_string(soap, tag, id, a, type)) + return soap->error; + return soap_putindependent(soap); +} + +SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap *soap, const char *tag, int id, char *const*a, const char *type) +{ + return soap_outstring(soap, tag, id, a, type, SOAP_TYPE_string); +} + +SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap *soap, char **p, const char *tag, const char *type) +{ + if ((p = soap_in_string(soap, tag, p, type))) + if (soap_getindependent(soap)) + return NULL; + return p; +} + +SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap *soap, const char *tag, char **a, const char *type) +{ char **p; + p = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, -1, -1); + return p; +} + +#ifdef __cplusplus +} +#endif + +/* End of soapC.c */ diff --git a/src/soapClient.c b/src/soapClient.c new file mode 100644 index 0000000..1257897 --- /dev/null +++ b/src/soapClient.c @@ -0,0 +1,566 @@ +/* + soapClient.c + + cwmp service client in C + +-------------------------------------------------------------------------------- +cwmp service client +Copyright (C) 2011-2012, Inteno, Inc. All Rights Reserved. + +Any distribution, dissemination, modification, conversion, integral or partial +reproduction, can not be made without the prior written permission of Inteno. +-------------------------------------------------------------------------------- +Author contact information: + +-------------------------------------------------------------------------------- +*/ +#include "soapH.h" +#include "cwmp.h" +#include "cwmpBinding.nsmap" +#include "httpda.h" +#ifdef __cplusplus +extern "C" { +#endif + +SOAP_SOURCE_STAMP("@(#) soapClient.c ver 2.7.12 2011-10-17 13:06:56 GMT") + +static struct http_da_info http_da_info; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_getRPCMethods (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_reboot (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_download (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterValues (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_setParameterValues (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterNames (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_factoryReset (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_scheduleInform (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_getParameterAttributes (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_setParameterAttributes (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_addObject (struct session *session); +struct rpc_cpe *cwmp_add_session_rpc_cpe_deleteObject (struct session *session); + +const struct CPE_METHOD_CONSTRUCTORS CPE_METHOD_CONSTRUCTORS_ARRAY [] = { + {"GetRPCMethods", cwmp_add_session_rpc_cpe_getRPCMethods}, + {"SetParameterValues", cwmp_add_session_rpc_cpe_setParameterValues}, + {"GetParameterValues", cwmp_add_session_rpc_cpe_getParameterValues}, + {"GetParameterNames", cwmp_add_session_rpc_cpe_getParameterNames}, + {"SetParameterAttributes", cwmp_add_session_rpc_cpe_setParameterAttributes}, + {"GetParameterAttributes", cwmp_add_session_rpc_cpe_getParameterAttributes}, + {"AddObject", cwmp_add_session_rpc_cpe_addObject}, + {"DeleteObject", cwmp_add_session_rpc_cpe_deleteObject}, + {"Reboot", cwmp_add_session_rpc_cpe_reboot}, + {"Download", cwmp_add_session_rpc_cpe_download}, + {"Upload", NULL}, + {"FactoryReset", cwmp_add_session_rpc_cpe_factoryReset}, + {"GetQueuedTransfers", NULL}, + {"GetAllQueuedTransfers", NULL}, + {"ScheduleInform", cwmp_add_session_rpc_cpe_scheduleInform}, + {"SetVouchers", NULL}, + {"GetOptions", NULL} +}; + +struct rpc_cpe *cwmp_add_session_rpc_cpe_Fault (struct session *session, int idx); + +void cwmp_session_soap_init (struct session *session) +{ + soap_init2(&session->soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE); + soap_set_omode(&session->soap, SOAP_XML_INDENT); + session->soap.recv_timeout = SOAP_TIMEOUT; + session->soap.send_timeout = SOAP_TIMEOUT; + session->soap.connect_timeout = SOAP_TIMEOUT; + session->soap.accept_timeout = SOAP_TIMEOUT; + if (soap_register_plugin(&session->soap, http_da)) + { + CWMP_LOG (ERROR,"Failed to register HTTP authentication plugin"); + } + CWMP_LOG (INFO,"Open session"); + CWMP_LOG (INFO,"ACS URL: %s",session->acs_url); +} + +void cwmp_session_done (struct session *session) +{ + soap_done(&session->soap); + http_da_release(&session->soap, &http_da_info); + CWMP_LOG (INFO,"Close session"); +} + +void cwmp_session_soap_destroy_end (struct session *session) +{ + soap_destroy(&session->soap); + soap_end(&session->soap); + if (session->digest_auth == TRUE) + { + http_da_restore(&session->soap, &http_da_info); + } +} + +int cwmp_soap_set_header_rpc_acs (struct soap *soap) +{ + static int id=MIN_INT_ID; + static char buf_id[16]; + static struct SOAP_ENV__Header soap_header; + memset(&soap_header, 0, sizeof(struct SOAP_ENV__Header)); + if(id>=MAX_INT_ID) + { + id=MIN_INT_ID; + } + id++; + sprintf(buf_id,"%d",id); + soap_header.ID.__item = buf_id; + soap_header.ID.SOAP_ENV__mustUnderstand = "1"; + soap->header = &soap_header; + return CWMP_OK; +} + +int cwmp_soap_get_header_rpc_cpe (struct soap *soap) +{ + static struct SOAP_ENV__Header soap_header; + static char *buf_id=NULL; + + if (soap->header == NULL) + { + soap->header = &soap_header; + return CWMP_OK; + } + + memset(&soap_header, 0, sizeof(struct SOAP_ENV__Header)); + if (buf_id!=NULL) + { + free(buf_id); + buf_id = NULL; + } + buf_id = strdup(soap->header->ID.__item); + soap_header.ID.__item = buf_id; + soap_header.ID.SOAP_ENV__mustUnderstand = "1"; + soap->header = NULL; + return CWMP_OK; +} + +SOAP_FMAC3 char * SOAP_FMAC4 soap_get_fault_code(struct soap *soap) +{ + struct SOAP_ENV__Fault *soap_fault; + struct _cwmp1__Fault *fault=NULL; + struct SOAP_ENV__Detail *detail=NULL; + + soap_fault = soap->fault; + + if (soap_fault == NULL) + { + return NULL; + } + + if (soap_fault->detail!=NULL) + { + detail = soap_fault->detail; + } + else + { + detail = soap_fault->SOAP_ENV__Detail; + } + if (detail!=NULL) + { + fault = (struct _cwmp1__Fault *) detail->fault; + if (fault!=NULL) + { + if (fault->FaultCode!=NULL) + { + return fault->FaultCode; + } + } + } + return NULL; +} + +SOAP_FMAC5 int SOAP_FMAC6 cwmp_soap_call_rpc_acs + ( + struct cwmp *cwmp, + struct session *session, + struct rpc_acs *rpc_acs + ) +{ + struct soap *soap; + struct soap_cwmp1_methods__rpc *soap_methods; + char *soap_fault_code; + int u=0,r=0; + + soap_methods = &(rpc_acs->soap_methods); + soap = &(session->soap); + soap->encodingStyle = ENCODING_STYLE_URL; + + while (1) + { + session->error = CWMP_OK; + cwmp_soap_set_header_rpc_acs(soap); + soap_begin(soap); + cwmp_soap_send_rpc_acs (cwmp, session, rpc_acs, soap, soap_methods); + if (rpc_acs->error != CWMP_SUCCESS_RPC) + { + session->error = CWMP_RETRY_SESSION; + break; + } + if (soap_begin_recv(soap) || + cwmp_soap_receive_rpc_acs_response (cwmp, session, rpc_acs, soap, soap_methods)) + { + if (soap->error == 401) // challenge: HTTP authentication required + { + CWMP_LOG(INFO,"Receive http 401: need authentication"); + if(u>0) + { + session->error = CWMP_RETRY_SESSION; + break; + } + u++; + // to store userid and passwd + http_da_save(soap, &http_da_info, soap->authrealm, cwmp->conf.acs_userid, cwmp->conf.acs_passwd); // set userid and passwd for this realm + session->digest_auth = TRUE; + cwmp_session_soap_destroy_end(session); + } + else if ((soap_fault_code = soap_get_fault_code(soap))!=NULL) + { + + if (strcmp(soap_fault_code,"8005") == 0) + { + CWMP_LOG(INFO,"Receive soap 8005: need to re-send"); + if (r>5) + { + session->error = CWMP_RETRY_SESSION; + break; + } + r++; + cwmp_session_soap_destroy_end(session); + } + else if (rpc_acs->type != RPC_ACS_INFORM_IDX) + { + rpc_acs->error = CWMP_SUCCESS_RPC; + session->error = CWMP_CONTINUE_SESSION; + break; + } + else + { + session->error = CWMP_RETRY_SESSION; + break; + } + } + else + { + session->error = CWMP_RETRY_SESSION; + break; + } + } + else + { + break; + } + } + return rpc_acs->error; +} + +SOAP_FMAC5 int SOAP_FMAC6 cwmp_soap_send_rpc_acs + ( + struct cwmp *cwmp, + struct session *session, + struct rpc_acs *rpc_acs, + struct soap *soap, + struct soap_cwmp1_methods__rpc *soap_methods + ) +{ + char *soap_endpoint; + char *soap_action = ""; + + soap_endpoint = session->acs_url; + + soap_serializeheader(soap); + soap_methods->soap_serialize_cwmp1__send_data (soap, rpc_acs->method_data); + if (soap_begin_count(soap)) + { + rpc_acs->error = CWMP_FAIL_RPC; + return soap->error; + } + if (soap->mode & SOAP_IO_LENGTH) + { if (soap_envelope_begin_out(soap) + || soap_putheader(soap) + || soap_body_begin_out(soap) + || soap_methods->soap_put_cwmp1__send_data(soap, rpc_acs->method_data, soap_methods->envelope,"") + || soap_body_end_out(soap) + || soap_envelope_end_out(soap)) + { + rpc_acs->error = CWMP_FAIL_RPC; + return soap->error; + } + } + if (soap_end_count(soap)) + { + rpc_acs->error = CWMP_FAIL_RPC; + return soap->error; + } + + if (soap_connect(soap, soap_endpoint, soap_action)) + { + rpc_acs->error = CWMP_RETRY_RPC; + return soap->error; + } + if (soap_envelope_begin_out(soap) + || soap_putheader(soap) + || soap_body_begin_out(soap) + || soap_methods->soap_put_cwmp1__send_data(soap, rpc_acs->method_data, soap_methods->envelope,"") + || soap_body_end_out(soap) + || soap_envelope_end_out(soap)) + { + rpc_acs->error = CWMP_FAIL_RPC; + return soap->error; + } + + if (soap_end_send(soap)) + { + rpc_acs->error = CWMP_RETRY_RPC; + CWMP_LOG (ERROR,"Problem when trying to send SOAP RPC to the ACS"); + return soap->error; + } + CWMP_LOG (INFO,"Send SOAP RPC to the ACS"); + rpc_acs->error = CWMP_SUCCESS_RPC; + return soap->error; +} +SOAP_FMAC5 int SOAP_FMAC6 cwmp_soap_receive_rpc_acs_response + ( + struct cwmp *cwmp, + struct session *session, + struct rpc_acs *rpc_acs, + struct soap *soap, + struct soap_cwmp1_methods__rpc *soap_methods + ) +{ + + if (soap_envelope_begin_in(soap) + || soap_recv_header(soap) /* KMD IN */ + || soap_body_begin_in(soap)) + { + rpc_acs->error = CWMP_RETRY_RPC; + CWMP_LOG (ERROR,"Problem when receiving SOAP RPC response from the ACS"); + return soap->error; + } + soap_methods->soap_get_cwmp1__rpc_received_data (soap, rpc_acs->method_response_data, soap_methods->envelope_response,""); + CWMP_LOG (INFO,"Receive SOAP RPC response from the ACS"); + if (soap->error) + { + rpc_acs->error = CWMP_RETRY_RPC; + if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2) + return soap_recv_fault(soap); + return soap->error; + } + if (soap_body_end_in(soap) + || soap_envelope_end_in(soap) + || soap_end_recv(soap)) + { + return soap->error; + } + session->hold_request = (soap->header==NULL) ? FALSE : soap->header->HoldRequests.__item; + rpc_acs->error = CWMP_SUCCESS_RPC; + return soap->error; +} + +SOAP_FMAC5 int SOAP_FMAC6 cwmp_soap_send_http_empty (struct cwmp *cwmp, struct session *session) +{ + struct soap *soap; + char *soap_action = ""; + char *soap_endpoint; + + soap = &(session->soap); + soap_endpoint = session->acs_url; + soap_begin(soap); + + if (soap_connect(soap, soap_endpoint, soap_action) || + soap_send(soap, "") || + soap_end_send(soap)) + { + session->error = CWMP_RETRY_SESSION; + CWMP_LOG(ERROR,"Fail when trying to send HTTP empty"); + return soap->error; + } + + CWMP_LOG(INFO,"Send HTTP empty"); + return CWMP_OK; +} + +SOAP_FMAC5 int SOAP_FMAC6 cwmp_soap_recv_http_empty (struct cwmp *cwmp, struct session *session) +{ + struct soap *soap; + static int uc=0; + + soap = &(session->soap); + + soap_begin_recv(soap); + + if (soap->error == 401) // challenge: HTTP authentication required + { + if(uc>0) + { + session->error = CWMP_RETRY_SESSION; + uc = 0; + return CWMP_UNAUTHORIZED_401; + } + uc++; + // to store userid and passwd + http_da_save(soap, &http_da_info, soap->authrealm, cwmp->conf.acs_userid, cwmp->conf.acs_passwd); // set userid and passwd for this realm + session->digest_auth = TRUE; + return CWMP_UNAUTHORIZED_401; + } + uc = 0; + if (soap->status == 204) + { + CWMP_LOG (INFO,"Receive HTTP 204 No Content"); + session->error = CWMP_SUCCESS_SESSION; + session->hold_request = FALSE; + return CWMP_OK; + } + else if (soap->status == 200) + { + CWMP_LOG (INFO,"Receive HTTP 200 OK"); + session->error = CWMP_CONTINUE_SESSION; + return CWMP_OK; + } + + return CWMP_OK; +} + + +struct rpc_cpe *cwmp_soap_receive_rpc_cpe ( + struct cwmp *cwmp, + struct session *session + ) +{ + struct soap *soap; + int i; + struct rpc_cpe *rpc_cpe=NULL; + struct soap_cwmp1_methods__rpc *soap_methods; + char *method; + struct rpc_cpe *(*constructor)(struct session *session); + + soap = &(session->soap); + + if (soap_envelope_begin_in(soap)|| + soap_recv_header(soap) || + soap_body_begin_in(soap)) + { + CWMP_LOG (ERROR,"Problem when receiving SOAP RPC from ACS"); + return NULL; + } + soap_peek_element(soap); + cwmp_soap_get_header_rpc_cpe (soap); + CWMP_LOG (INFO,"Receive SOAP RPC from ACS: %s", soap->tag); + for (i=0;itag, method)) + { + if (constructor!=NULL) + { + rpc_cpe = constructor(session); + if (rpc_cpe == NULL) + { + return NULL; + } + CWMP_LOG (INFO,"%s RPC is supported",soap->tag); + } + break; + } + } + if (rpc_cpe == NULL) + { + CWMP_LOG (INFO,"%s RPC is not supported",soap->tag); + rpc_cpe = cwmp_add_session_rpc_cpe_Fault(session,FAULT_CPE_METHOD_NOT_SUPPORTED_IDX); + return rpc_cpe; + } + + soap_methods = &(rpc_cpe->soap_methods); + if (!soap_methods->soap_get_cwmp1__rpc_received_data(soap, rpc_cpe->method_data, soap_methods->envelope, NULL)) + { + /*error*/ + } + + if (soap_body_end_in(soap) + || soap_envelope_end_in(soap) + || soap_end_recv(soap)) + { + /*error*/ + } + + session->hold_request = (soap->header==NULL) ? FALSE : soap->header->HoldRequests.__item; + + return rpc_cpe; +} + +SOAP_FMAC5 int SOAP_FMAC6 cwmp_soap_send_rpc_cpe_response + ( + struct cwmp *cwmp, + struct session *session, + struct rpc_cpe *rpc_cpe + ) +{ + char *soap_endpoint; + char *soap_action = ""; + struct soap_cwmp1_methods__rpc *soap_methods; + struct soap *soap; + + soap_endpoint = session->acs_url; + soap_methods = &(rpc_cpe->soap_methods); + soap = &(session->soap); + + soap_begin(soap); + cwmp_soap_get_header_rpc_cpe (soap); + soap_serializeheader(soap); + soap_methods->soap_serialize_cwmp1__send_data (soap, rpc_cpe->method_response_data); + if (soap_begin_count(soap)) + { + rpc_cpe->error = CWMP_FAIL_RPC; + return soap->error; + } + if (soap->mode & SOAP_IO_LENGTH) + { if (soap_envelope_begin_out(soap) + || soap_putheader(soap) + || soap_body_begin_out(soap) + || soap_methods->soap_put_cwmp1__send_data(soap, rpc_cpe->method_response_data, soap_methods->envelope_response,"") + || soap_body_end_out(soap) + || soap_envelope_end_out(soap)) + { + rpc_cpe->error = CWMP_FAIL_RPC; + return soap->error; + } + } + if (soap_end_count(soap)) + { + rpc_cpe->error = CWMP_FAIL_RPC; + return soap->error; + } + + if (soap_connect(soap, soap_endpoint, soap_action)) + { + rpc_cpe->error = CWMP_RETRY_RPC; + return soap->error; + } + if (soap_envelope_begin_out(soap) + || soap_putheader(soap) + || soap_body_begin_out(soap) + || soap_methods->soap_put_cwmp1__send_data(soap, rpc_cpe->method_response_data, soap_methods->envelope_response,"") + || soap_body_end_out(soap) + || soap_envelope_end_out(soap)) + { + rpc_cpe->error = CWMP_FAIL_RPC; + return soap->error; + } + + if (soap_end_send(soap)) + { + CWMP_LOG (ERROR,"Problem when trying to send SOAP RPC response to the ACS"); + rpc_cpe->error = CWMP_RETRY_RPC; + return soap->error; + } + CWMP_LOG (INFO,"Send SOAP RPC response to the ACS"); + return CWMP_OK; +} + +#ifdef __cplusplus +} +#endif +/* End of soapClient.c */ + diff --git a/src/stdsoap2.c b/src/stdsoap2.c new file mode 100644 index 0000000..d397e9b --- /dev/null +++ b/src/stdsoap2.c @@ -0,0 +1,15170 @@ +/* + stdsoap2.c[pp] 2.7.12 + + gSOAP runtime engine + +gSOAP XML Web services tools +Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. +This part of the software is released under ONE of the following licenses: +GPL, or the gSOAP public license, or Genivia's license for commercial use. +-------------------------------------------------------------------------------- +Contributors: + +Wind River Systems Inc., for the following additions under gSOAP public license: + - vxWorks compatible +-------------------------------------------------------------------------------- +gSOAP public license. + +The contents of this file are subject to the gSOAP Public License Version 1.3 +(the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at +http://www.cs.fsu.edu/~engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Robert A. van Engelen. +Copyright (C) 2000-2008, Robert van Engelen, Genivia Inc., All Rights Reserved. +-------------------------------------------------------------------------------- +GPL license. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Author contact information: +engelen@genivia.com / engelen@acm.org + +This program is released under the GPL with the additional exemption that +compiling, linking, and/or using OpenSSL is allowed. +-------------------------------------------------------------------------------- +A commercial use license is available from Genivia, Inc., contact@genivia.com +-------------------------------------------------------------------------------- + +Installation note: + +Win32 build needs winsock.dll (Visual C++ "wsock32.lib") +To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link" +tab (the project file needs to be selected in the file view) and add +"wsock32.lib" to the "Object/library modules" entry + +On Mac OS X with gcc (GCC) 3.1 20020420 (prerelease) you MUST compile with +-fstack_check when using -O2 because gcc 3.1 has a bug that smashes the stack +when locally allocated data exceeds 64K. + +*/ + +#ifdef AS400 +# pragma convert(819) /* EBCDIC to ASCII */ +#endif + +#include "stdsoap2.h" + +#ifdef __BORLANDC__ +# pragma warn -8060 +#else +# ifdef WIN32 +# ifdef UNDER_CE +# pragma comment(lib, "winsock.lib") +# else +# pragma comment(lib, "wsock32.lib") +# endif +# pragma warning(disable : 4996) /* disable deprecation warnings */ +# endif +#endif + +#ifdef __cplusplus +SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.7.12 2008-10-01 00:00:00 GMT") +extern "C" { +#else +SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.12 2008-10-01 00:00:00 GMT") +#endif + +/* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale with multibyte support enabled) */ +#ifndef SOAP_UNKNOWN_CHAR +#define SOAP_UNKNOWN_CHAR (127) +#endif + +/* EOF=-1 */ +#define SOAP_LT (soap_wchar)(-2) /* XML character '<' */ +#define SOAP_TT (soap_wchar)(-3) /* XML character '' */ +#define SOAP_QT (soap_wchar)(-5) /* XML character '"' */ +#define SOAP_AP (soap_wchar)(-6) /* XML character ''' */ + +#define soap_blank(c) ((c) >= 0 && (c) <= 32) +#define soap_notblank(c) ((c) > 32) + +#if defined(WIN32) && !defined(UNDER_CE) +#define soap_hash_ptr(p) ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1)) +#else +#define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) +#endif + +#ifndef PALM_1 +static void soap_init_logs(struct soap*); +#endif +#ifdef SOAP_DEBUG +static void soap_close_logfile(struct soap*, int); +static void soap_set_logfile(struct soap*, int, const char*); +#endif + +#ifdef SOAP_MEM_DEBUG +static void soap_init_mht(struct soap*); +static void soap_free_mht(struct soap*); +static void soap_track_unlink(struct soap*, const void*); +#endif + +#ifndef PALM_2 +static int soap_set_error(struct soap*, const char*, const char*, const char*, const char*, int); +static int soap_copy_fault(struct soap*, const char*, const char*, const char*, const char*); +static int soap_getattrval(struct soap*, char*, size_t, soap_wchar); +#endif + +#ifndef PALM_1 +static void soap_free_ns(struct soap *soap); +static soap_wchar soap_char(struct soap*); +static soap_wchar soap_get_pi(struct soap*); +static int soap_isxdigit(int); +static void *fplugin(struct soap*, const char*); +static char *soap_get_http_body(struct soap*); +static size_t soap_count_attachments(struct soap *soap); +static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); +#ifndef WITH_NOIDREF +static void soap_update_ptrs(struct soap*, char*, char*, char*, char*); +static int soap_has_copies(struct soap*, const char*, const char*); +static void soap_init_iht(struct soap*); +static void soap_free_iht(struct soap*); +static void soap_init_pht(struct soap*); +static void soap_free_pht(struct soap*); +#endif +#endif + +#ifndef WITH_LEAN +static const char *soap_set_validation_fault(struct soap*, const char*, const char*); +static int soap_isnumeric(struct soap*, const char*); +static struct soap_nlist *soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized); +static void soap_pop_ns(struct soap *soap); +static void soap_utilize_ns(struct soap *soap, const char *tag, size_t n); +#endif + +#ifndef WITH_LEANER +#ifndef PALM_1 +static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t); +static int soap_putdimefield(struct soap*, const char*, size_t); +static char *soap_getdimefield(struct soap*, size_t); +static void soap_select_mime_boundary(struct soap*); +static int soap_valid_mime_boundary(struct soap*); +static void soap_resolve_attachment(struct soap*, struct soap_multipart*); +#endif +#endif + +#ifdef WITH_GZIP +static int soap_getgziphdr(struct soap*); +#endif + +#ifdef WITH_OPENSSL +int soap_ssl_init_done = 0; + +static int ssl_auth_init(struct soap*); +static int ssl_verify_callback(int, X509_STORE_CTX*); +static int ssl_verify_callback_allow_expired_certificate(int, X509_STORE_CTX*); +static int ssl_password(char*, int, int, void *); +/* The callback below is included for future references: +static DH *ssl_tmp_dh(SSL*, int, int); +*/ +#endif + +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#ifndef PALM_1 +static const char *soap_decode(char*, size_t, const char*, const char*); +#endif +#endif + +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static soap_wchar soap_getchunkchar(struct soap*); +static const char *http_error(struct soap*, int); +static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t); +static int http_get(struct soap*); +static int http_put(struct soap*); +static int http_del(struct soap*); +static int http_head(struct soap*); +static int http_send_header(struct soap*, const char*); +static int http_post_header(struct soap*, const char*, const char*); +static int http_response(struct soap*, int, size_t); +static int http_parse(struct soap*); +static int http_parse_header(struct soap*, const char*, const char*); +#endif +#endif + +#ifndef WITH_NOIO + +#ifndef PALM_1 +static int fsend(struct soap*, const char*, size_t); +static size_t frecv(struct soap*, char*, size_t); +static int tcp_init(struct soap*); +static const char *tcp_error(struct soap*); +#ifndef WITH_IPV6 +static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); +#endif +static SOAP_SOCKET tcp_connect(struct soap*, const char *endpoint, const char *host, int port); +static SOAP_SOCKET tcp_accept(struct soap*, SOAP_SOCKET, struct sockaddr*, int*); +static int tcp_disconnect(struct soap*); +static int tcp_closesocket(struct soap*, SOAP_SOCKET); +static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int); +static const char *soap_strerror(struct soap*); +#endif + +#if defined(WIN32) + #define SOAP_SOCKBLOCK(fd) \ + { u_long blocking = 0; \ + ioctlsocket(fd, FIONBIO, &blocking); \ + } + #define SOAP_SOCKNONBLOCK(fd) \ + { u_long nonblocking = 1; \ + ioctlsocket(fd, FIONBIO, &nonblocking); \ + } +#elif defined(VXWORKS) + #define SOAP_SOCKBLOCK(fd) \ + { u_long blocking = 0; \ + ioctl(fd, FIONBIO, (int)(&blocking)); \ + } + #define SOAP_SOCKNONBLOCK(fd) \ + { u_long nonblocking = 1; \ + ioctl(fd, FIONBIO, (int)(&nonblocking)); \ + } +#elif defined(PALM) + #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)&~O_NONBLOCK); + #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0)|O_NONBLOCK); +#elif defined(SYMBIAN) + #define SOAP_SOCKBLOCK(fd) \ + { long blocking = 0; \ + ioctl(fd, 0/*FIONBIO*/, &blocking); \ + } + #define SOAP_SOCKNONBLOCK(fd) \ + { long nonblocking = 1; \ + ioctl(fd, 0/*FIONBIO*/, &nonblocking); \ + } +#else + #define SOAP_SOCKBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)&~O_NONBLOCK); + #define SOAP_SOCKNONBLOCK(fd) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); +#endif + +#endif + +#if defined(PALM) && !defined(PALM_2) +unsigned short errno; +#endif + +#ifndef PALM_1 +static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/"; +static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/"; +static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope"; +static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding"; +static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc"; +#endif + +#ifndef PALM_1 +const struct soap_double_nan soap_double_nan = {0xFFFFFFFF, 0xFFFFFFFF}; +static const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static 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"; +#endif + +#ifndef WITH_LEAN +/*static const char soap_indent[11] = "\n\t\t\t\t\t\t\t\t\t"; + Alternative indentation form for SOAP_XML_INDENT:*/ +static const char soap_indent[21] = "\n "; + +#endif + +#ifndef SOAP_CANARY +# define SOAP_CANARY (0xC0DE) +#endif + +static const char soap_padding[4] = "\0\0\0"; +#define SOAP_STR_PADDING (soap_padding) +#define SOAP_STR_EOS (soap_padding) +#define SOAP_NON_NULL (soap_padding) + +#ifndef WITH_LEAN +static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */ +{ { 160, "nbsp" }, + { 161, "iexcl" }, + { 162, "cent" }, + { 163, "pound" }, + { 164, "curren" }, + { 165, "yen" }, + { 166, "brvbar" }, + { 167, "sect" }, + { 168, "uml" }, + { 169, "copy" }, + { 170, "ordf" }, + { 171, "laquo" }, + { 172, "not" }, + { 173, "shy" }, + { 174, "reg" }, + { 175, "macr" }, + { 176, "deg" }, + { 177, "plusmn" }, + { 178, "sup2" }, + { 179, "sup3" }, + { 180, "acute" }, + { 181, "micro" }, + { 182, "para" }, + { 183, "middot" }, + { 184, "cedil" }, + { 185, "sup1" }, + { 186, "ordm" }, + { 187, "raquo" }, + { 188, "frac14" }, + { 189, "frac12" }, + { 190, "frac34" }, + { 191, "iquest" }, + { 192, "Agrave" }, + { 193, "Aacute" }, + { 194, "Acirc" }, + { 195, "Atilde" }, + { 196, "Auml" }, + { 197, "Aring" }, + { 198, "AElig" }, + { 199, "Ccedil" }, + { 200, "Egrave" }, + { 201, "Eacute" }, + { 202, "Ecirc" }, + { 203, "Euml" }, + { 204, "Igrave" }, + { 205, "Iacute" }, + { 206, "Icirc" }, + { 207, "Iuml" }, + { 208, "ETH" }, + { 209, "Ntilde" }, + { 210, "Ograve" }, + { 211, "Oacute" }, + { 212, "Ocirc" }, + { 213, "Otilde" }, + { 214, "Ouml" }, + { 215, "times" }, + { 216, "Oslash" }, + { 217, "Ugrave" }, + { 218, "Uacute" }, + { 219, "Ucirc" }, + { 220, "Uuml" }, + { 221, "Yacute" }, + { 222, "THORN" }, + { 223, "szlig" }, + { 224, "agrave" }, + { 225, "aacute" }, + { 226, "acirc" }, + { 227, "atilde" }, + { 228, "auml" }, + { 229, "aring" }, + { 230, "aelig" }, + { 231, "ccedil" }, + { 232, "egrave" }, + { 233, "eacute" }, + { 234, "ecirc" }, + { 235, "euml" }, + { 236, "igrave" }, + { 237, "iacute" }, + { 238, "icirc" }, + { 239, "iuml" }, + { 240, "eth" }, + { 241, "ntilde" }, + { 242, "ograve" }, + { 243, "oacute" }, + { 244, "ocirc" }, + { 245, "otilde" }, + { 246, "ouml" }, + { 247, "divide" }, + { 248, "oslash" }, + { 249, "ugrave" }, + { 250, "uacute" }, + { 251, "ucirc" }, + { 252, "uuml" }, + { 253, "yacute" }, + { 254, "thorn" }, + { 255, "yuml" }, + { 0, NULL } +}; +#endif + +#ifndef WITH_NOIO +#ifndef WITH_LEAN +static const struct soap_code_map h_error_codes[] = +{ +#ifdef HOST_NOT_FOUND + { HOST_NOT_FOUND, "Host not found" }, +#endif +#ifdef TRY_AGAIN + { TRY_AGAIN, "Try Again" }, +#endif +#ifdef NO_RECOVERY + { NO_RECOVERY, "No Recovery" }, +#endif +#ifdef NO_DATA + { NO_DATA, "No Data" }, +#endif +#ifdef NO_ADDRESS + { NO_ADDRESS, "No Address" }, +#endif + { 0, NULL } +}; +#endif +#endif + +#ifndef WITH_NOHTTP +#ifndef WITH_LEAN +static const struct soap_code_map h_http_error_codes[] = +{ { 200, "OK" }, + { 201, "Created" }, + { 202, "Accepted" }, + { 203, "Non-Authoritative Information" }, + { 204, "No Content" }, + { 205, "Reset Content" }, + { 206, "Partial Content" }, + { 300, "Multiple Choices" }, + { 301, "Moved Permanently" }, + { 302, "Found" }, + { 303, "See Other" }, + { 304, "Not Modified" }, + { 305, "Use Proxy" }, + { 307, "Temporary Redirect" }, + { 400, "Bad Request" }, + { 401, "Unauthorized" }, + { 402, "Payment Required" }, + { 403, "Forbidden" }, + { 404, "Not Found" }, + { 405, "Method Not Allowed" }, + { 406, "Not Acceptable" }, + { 407, "Proxy Authentication Required" }, + { 408, "Request Time-out" }, + { 409, "Conflict" }, + { 410, "Gone" }, + { 411, "Length Required" }, + { 412, "Precondition Failed" }, + { 413, "Request Entity Too Large" }, + { 414, "Request-URI Too Large" }, + { 415, "Unsupported Media Type" }, + { 416, "Requested range not satisfiable" }, + { 417, "Expectation Failed" }, + { 500, "Internal Server Error" }, + { 501, "Not Implemented" }, + { 502, "Bad Gateway" }, + { 503, "Service Unavailable" }, + { 504, "Gateway Time-out" }, + { 505, "HTTP Version not supported" }, + { 0, NULL } +}; +#endif +#endif + +#ifdef WITH_OPENSSL +static const struct soap_code_map h_ssl_error_codes[] = +{ +#define _SSL_ERROR(e) { e, #e } + _SSL_ERROR(SSL_ERROR_SSL), + _SSL_ERROR(SSL_ERROR_ZERO_RETURN), + _SSL_ERROR(SSL_ERROR_WANT_READ), + _SSL_ERROR(SSL_ERROR_WANT_WRITE), + _SSL_ERROR(SSL_ERROR_WANT_CONNECT), + _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP), + _SSL_ERROR(SSL_ERROR_SYSCALL), + { 0, NULL } +}; +#endif + +#ifndef WITH_LEANER +static const struct soap_code_map mime_codes[] = +{ { SOAP_MIME_7BIT, "7bit" }, + { SOAP_MIME_8BIT, "8bit" }, + { SOAP_MIME_BINARY, "binary" }, + { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" }, + { SOAP_MIME_BASE64, "base64" }, + { SOAP_MIME_IETF_TOKEN, "ietf-token" }, + { SOAP_MIME_X_TOKEN, "x-token" }, + { 0, NULL } +}; +#endif + +#ifdef WIN32 +static int tcp_done = 0; +#endif + +#if defined(HP_UX) && defined(HAVE_GETHOSTBYNAME_R) +extern int h_errno; +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +fsend(struct soap *soap, const char *s, size_t n) +{ register int nwritten, err; +#if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) + if (soap->os) + { soap->os->write(s, (std::streamsize)n); + if (soap->os->good()) + return SOAP_OK; + soap->errnum = 0; + return SOAP_EOF; + } +#endif + while (n) + { if (soap_valid_socket(soap->socket)) + { +#ifndef WITH_LEAN + if (soap->send_timeout) + { +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + for (;;) + { struct timeval timeout; + fd_set fd; + register int r; + if (soap->send_timeout > 0) + { timeout.tv_sec = soap->send_timeout; + timeout.tv_usec = 0; + } + else + { timeout.tv_sec = -soap->send_timeout/1000000; + timeout.tv_usec = -soap->send_timeout%1000000; + } + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); +#ifdef WITH_OPENSSL + if (soap->ssl) + r = select((int)soap->socket + 1, &fd, &fd, &fd, &timeout); + else +#endif + r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout); + if (r > 0) + break; + if (!r) + { soap->errnum = 0; + return SOAP_EOF; + } + err = soap_socket_errno(soap->socket); + if (err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) + { soap->errnum = err; + return SOAP_EOF; + } + } + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + nwritten = SSL_write(soap->ssl, s, (int)n); + else if (soap->bio) + nwritten = BIO_write(soap->bio, s, (int)n); + else +#endif +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + { if (soap->peerlen) + nwritten = sendto(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); + else + nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags); + /* retry and back-off algorithm */ + /* TODO: this is not very clear from specs so verify and limit conditions under which we should loop (e.g. ENOBUFS) */ + if (nwritten < 0) + { struct timeval timeout; + fd_set fd; + int udp_repeat; + int udp_delay; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + if ((soap->connect_flags & SO_BROADCAST)) + udp_repeat = 3; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ + else + udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ + udp_delay = (soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ + do + { timeout.tv_sec = 0; + timeout.tv_usec = 1000 * udp_delay; /* ms */ + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); + select((int)soap->socket + 1, NULL, NULL, &fd, &timeout); + if (soap->peerlen) + nwritten = sendto(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); + else + nwritten = send(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags); + udp_delay <<= 1; + if (udp_delay > 500) /* UDP_UPPER_DELAY */ + udp_delay = 500; + } + while (nwritten < 0 && --udp_repeat > 0); + } + } + else +#endif +#if !defined(PALM) && !defined(AS400) + nwritten = send(soap->socket, s, (int)n, soap->socket_flags); +#else + nwritten = send(soap->socket, (void*)s, n, soap->socket_flags); +#endif + if (nwritten <= 0) + { +#if defined(WITH_OPENSSL) || !defined(WITH_LEAN) + register int r = 0; +#endif + err = soap_socket_errno(soap->socket); +#ifdef WITH_OPENSSL + if (soap->ssl && (r = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) + { soap->errnum = err; + return SOAP_EOF; + } +#endif + if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) + { +#ifndef WITH_LEAN + struct timeval timeout; + fd_set fd; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + if (soap->send_timeout > 0) + { timeout.tv_sec = soap->send_timeout; + timeout.tv_usec = 0; + } + else if (soap->send_timeout < 0) + { timeout.tv_sec = -soap->send_timeout/1000000; + timeout.tv_usec = -soap->send_timeout%1000000; + } + else + { timeout.tv_sec = 0; + timeout.tv_usec = 10000; + } + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); +#ifdef WITH_OPENSSL + if (soap->ssl && r == SSL_ERROR_WANT_READ) + r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout); + else + r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout); +#else + r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout); +#endif + if (!r && soap->send_timeout) + { soap->errnum = 0; + return SOAP_EOF; + } + if (r < 0 && (r = soap_socket_errno(soap->socket)) != SOAP_EINTR) + { soap->errnum = r; + return SOAP_EOF; + } +#endif + } + else if (err && err != SOAP_EINTR) + { soap->errnum = err; + return SOAP_EOF; + } + nwritten = 0; /* and call write() again */ + } + } + else + { +#ifdef WITH_FASTCGI + nwritten = fwrite((void*)s, 1, n, stdout); + fflush(stdout); +#else +#ifdef UNDER_CE + nwritten = fwrite(s, 1, n, soap->sendfd); +#else +#ifdef VXWORKS +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + nwritten = (httpBlockPut(soap->rpmreqid, s, n) == 0) ? n : -1; + else +#endif + nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w")); +#else +#ifdef WIN32 + nwritten = _write(soap->sendfd, s, (unsigned int)n); +#else + nwritten = write(soap->sendfd, s, (unsigned int)n); +#endif +#endif +#endif +#endif + if (nwritten <= 0) + { +#ifndef WITH_FASTCGI + err = soap_errno; +#else + err = EOF; +#endif + if (err && err != SOAP_EINTR && err != SOAP_EWOULDBLOCK && err != SOAP_EAGAIN) + { soap->errnum = err; + return SOAP_EOF; + } + nwritten = 0; /* and call write() again */ + } + } + n -= nwritten; + s += nwritten; + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send_raw(struct soap *soap, const char *s, size_t n) +{ if (!n) + return SOAP_OK; + if (soap->mode & SOAP_IO_LENGTH) + { soap->count += n; +#ifndef WITH_LEANER + if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->error = soap->fpreparesend(soap, s, n); +#endif + return SOAP_OK; + } + if (soap->mode & SOAP_IO) + { register size_t i = SOAP_BUFLEN - soap->bufidx; + while (n >= i) + { memcpy(soap->buf + soap->bufidx, s, i); + soap->bufidx = SOAP_BUFLEN; + if (soap_flush(soap)) + return soap->error; + s += i; + n -= i; + i = SOAP_BUFLEN; + } + memcpy(soap->buf + soap->bufidx, s, n); + soap->bufidx += n; + return SOAP_OK; + } + return soap_flush_raw(soap, s, n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_flush(struct soap *soap) +{ register size_t n = soap->bufidx; + if (n) + { soap->bufidx = 0; +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { soap->d_stream->next_in = (Byte*)soap->buf; + soap->d_stream->avail_in = (unsigned int)n; +#ifdef WITH_GZIP + soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)n); +#endif + do + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream->avail_in)); + if (deflate(soap->d_stream, Z_NO_FLUSH) != Z_OK) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS)); + return soap->error = SOAP_ZLIB_ERROR; + } + if (!soap->d_stream->avail_out) + { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN)) + return soap->error; + soap->d_stream->next_out = (Byte*)soap->z_buf; + soap->d_stream->avail_out = SOAP_BUFLEN; + } + } while (soap->d_stream->avail_in); + } + else +#endif + return soap_flush_raw(soap, soap->buf, n); + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_flush_raw(struct soap *soap, const char *s, size_t n) +{ if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) + { register char *t; + if (!(t = (char*)soap_push_block(soap, NULL, n))) + return soap->error = SOAP_EOM; + memcpy(t, s, n); +#ifndef WITH_LEANER + if (soap->fpreparesend) + return soap->error = soap->fpreparesend(soap, s, n); +#endif + return SOAP_OK; + } +#ifndef WITH_LEANER + if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) + { char t[16]; + sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n); + DBGMSG(SENT, t, strlen(t)); + if ((soap->error = soap->fsend(soap, t, strlen(t)))) + return soap->error; + soap->chunksize += n; + } + DBGMSG(SENT, s, n); +#endif + return soap->error = soap->fsend(soap, s, n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send(struct soap *soap, const char *s) +{ if (s) + return soap_send_raw(soap, s, strlen(s)); + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send2(struct soap *soap, const char *s1, const char *s2) +{ if (soap_send(soap, s1)) + return soap->error; + return soap_send(soap, s2); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3) +{ if (soap_send(soap, s1) + || soap_send(soap, s2)) + return soap->error; + return soap_send(soap, s3); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static size_t +frecv(struct soap *soap, char *s, size_t n) +{ register int r; +#ifndef WITH_LEAN + register int retries = 100; /* max 100 retries with non-blocking sockets */ +#endif + soap->errnum = 0; +#if defined(__cplusplus) && !defined(WITH_LEAN) && !defined(WITH_COMPAT) + if (soap->is) + { if (soap->is->good()) + return soap->is->read(s, (std::streamsize)n).gcount(); + return 0; + } +#endif + if (soap_valid_socket(soap->socket)) + { for (;;) + { +#ifdef WITH_OPENSSL + register int err = 0; +#endif +#ifndef WITH_LEAN +#ifdef WITH_OPENSSL + if (soap->recv_timeout && !soap->ssl) /* SSL: sockets are nonblocking */ +#else + if (soap->recv_timeout) +#endif + { +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return 0; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + for (;;) + { struct timeval timeout; + fd_set fd; + if (soap->recv_timeout > 0) + { timeout.tv_sec = soap->recv_timeout; + timeout.tv_usec = 0; + } + else + { timeout.tv_sec = -soap->recv_timeout/1000000; + timeout.tv_usec = -soap->recv_timeout%1000000; + } + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); + r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout); + if (r > 0) + break; + if (!r) + { soap->errnum = 0; + return 0; + } + r = soap_socket_errno(soap->socket); + if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) + { soap->errnum = r; + return 0; + } + } + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + { r = SSL_read(soap->ssl, s, (int)n); + if (r > 0) + return (size_t)r; + err = SSL_get_error(soap->ssl, r); + if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) + return 0; + } + else if (soap->bio) + { r = BIO_read(soap->bio, s, (int)n); + if (r > 0) + return (size_t)r; + return 0; + } + else +#endif + { +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + { SOAP_SOCKLEN_T k = (SOAP_SOCKLEN_T)sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + r = recvfrom(soap->socket, s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ + soap->peerlen = (size_t)k; +#ifndef WITH_IPV6 + soap->ip = ntohl(soap->peer.sin_addr.s_addr); +#endif + } + else +#endif + r = recv(soap->socket, s, (int)n, soap->socket_flags); +#ifdef PALM + /* CycleSyncDisplay(curStatusMsg); */ +#endif + if (r >= 0) + return (size_t)r; + r = soap_socket_errno(soap->socket); + if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) + { soap->errnum = r; + return 0; + } + } +#ifndef WITH_LEAN + { struct timeval timeout; + fd_set fd; + if (soap->recv_timeout > 0) + { timeout.tv_sec = soap->recv_timeout; + timeout.tv_usec = 0; + } + else if (soap->recv_timeout < 0) + { timeout.tv_sec = -soap->recv_timeout/1000000; + timeout.tv_usec = -soap->recv_timeout%1000000; + } + else + { timeout.tv_sec = 5; + timeout.tv_usec = 0; + } +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return 0; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); +#ifdef WITH_OPENSSL + if (soap->ssl && err == SSL_ERROR_WANT_WRITE) + r = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout); + else + r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout); +#else + r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout); +#endif + if (!r && soap->recv_timeout) + { soap->errnum = 0; + return 0; + } + if (r < 0) + { r = soap_socket_errno(soap->socket); + if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) + { soap->errnum = r; + return 0; + } + } + if (retries-- <= 0) + { soap->errnum = soap_socket_errno(soap->socket); + return 0; + } + } +#endif +#ifdef PALM + r = soap_socket_errno(soap->socket); + if (r != SOAP_EINTR && retries-- <= 0) + { soap->errnum = r; + return 0; + } +#endif + } + } +#ifdef WITH_FASTCGI + return fread(s, 1, n, stdin); +#else +#ifdef UNDER_CE + return fread(s, 1, n, soap->recvfd); +#else +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + r = httpBlockRead(soap->rpmreqid, s, n); + else +#endif +#ifdef WIN32 + r = _read(soap->recvfd, s, (unsigned int)n); +#else + r = read(soap->recvfd, s, (unsigned int)n); +#endif + if (r >= 0) + return (size_t)r; + soap->errnum = soap_errno; + return 0; +#endif +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static soap_wchar +soap_getchunkchar(struct soap *soap) +{ if (soap->bufidx < soap->buflen) + return soap->buf[soap->bufidx++]; + soap->bufidx = 0; + soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)soap->buflen, soap->socket)); + DBGMSG(RECV, soap->buf, soap->buflen); + if (soap->buflen) + return soap->buf[soap->bufidx++]; + return EOF; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +soap_isxdigit(int c) +{ return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_raw(struct soap *soap) +{ register size_t ret; +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { if (soap->d_stream->next_out == Z_NULL) + return EOF; + if (soap->d_stream->avail_in || !soap->d_stream->avail_out) + { register int r; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); + soap->d_stream->next_out = (Byte*)soap->buf; + soap->d_stream->avail_out = SOAP_BUFLEN; + r = inflate(soap->d_stream, Z_NO_FLUSH); + if (r == Z_OK || r == Z_STREAM_END) + { soap->bufidx = 0; + ret = soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out; + if (soap->zlib_in == SOAP_ZLIB_GZIP) + soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)ret); + if (r == Z_STREAM_END) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); + soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; + soap->d_stream->next_out = Z_NULL; + } + if (ret) + { soap->count += ret; + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); + DBGMSG(RECV, soap->buf, ret); + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); + return SOAP_OK; + } + } + else if (r != Z_BUF_ERROR) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS)); + soap->d_stream->next_out = Z_NULL; + soap->error = SOAP_ZLIB_ERROR; + return EOF; + } + } +zlib_again: + if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) + { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN); + soap->buflen = soap->z_buflen; + } + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- compressed ----\n")); + } +#endif +#ifndef WITH_NOHTTP + if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */ + { for (;;) + { register soap_wchar c; + char *t, tmp[8]; + if (soap->chunksize) + { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); + DBGMSG(RECV, soap->buf, ret); + soap->bufidx = 0; + soap->chunksize -= ret; + break; + } + t = tmp; + if (!soap->chunkbuflen) + { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + soap->bufidx = 0; + if (!ret) + return soap->ahead = EOF; + } + else + soap->bufidx = soap->buflen; + soap->buflen = soap->chunkbuflen; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (idx=%u len=%u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen)); + while (!soap_isxdigit((int)(c = soap_getchunkchar(soap)))) + { if ((int)c == EOF) + return soap->ahead = EOF; + } + do + *t++ = (char)c; + while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7); + while ((int)c != EOF && c != '\n') + c = soap_getchunkchar(soap); + if ((int)c == EOF) + return soap->ahead = EOF; + *t = '\0'; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); + soap->chunksize = soap_strtoul(tmp, &t, 16); + if (!soap->chunksize) + { soap->chunkbuflen = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); + while ((int)c != EOF && c != '\n') + c = soap_getchunkchar(soap); + ret = 0; + soap->ahead = EOF; + break; + } + soap->buflen = soap->bufidx + soap->chunksize; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to idx=%u len=%u (%s)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen, tmp)); + if (soap->buflen > soap->chunkbuflen) + { soap->buflen = soap->chunkbuflen; + soap->chunksize -= soap->buflen - soap->bufidx; + soap->chunkbuflen = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%u bytes left)\n", (unsigned int)(soap->buflen - soap->bufidx))); + } + else if (soap->chunkbuflen) + soap->chunksize = 0; + ret = soap->buflen - soap->bufidx; + if (ret) + break; + } + } + else +#endif + { soap->bufidx = 0; + soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket %d\n", (unsigned int)ret, soap->socket)); + DBGMSG(RECV, soap->buf, ret); + } +#ifndef WITH_LEANER + if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret))) + return soap->error; +#endif +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { register int r; + memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); + soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); + soap->d_stream->avail_in = (unsigned int)ret; + soap->d_stream->next_out = (Byte*)soap->buf; + soap->d_stream->avail_out = SOAP_BUFLEN; + r = inflate(soap->d_stream, Z_NO_FLUSH); + if (r == Z_OK || r == Z_STREAM_END) + { soap->bufidx = 0; + soap->z_buflen = soap->buflen; + soap->buflen = SOAP_BUFLEN - soap->d_stream->avail_out; + if (soap->zlib_in == SOAP_ZLIB_GZIP) + soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)soap->buflen)); + if (ret && !soap->buflen) + goto zlib_again; + ret = soap->buflen; + if (r == Z_STREAM_END) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); + soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; + soap->d_stream->next_out = Z_NULL; + } + DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); + DBGMSG(RECV, soap->buf, ret); + } + else + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS)); + soap->d_stream->next_out = Z_NULL; + soap->error = SOAP_ZLIB_ERROR; + return EOF; + } + } +#endif + soap->count += ret; + return !ret; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv(struct soap *soap) +{ +#ifndef WITH_LEANER + if (soap->mode & SOAP_ENC_DIME) + { if (soap->dime.buflen) + { char *s; + int i; + unsigned char tmp[12]; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n")); + soap->count += soap->dime.buflen - soap->buflen; + soap->buflen = soap->dime.buflen; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3)); + for (i = -(long)soap->dime.size&3; i > 0; i--) + { soap->bufidx++; + if (soap->bufidx >= soap->buflen) + if (soap_recv_raw(soap)) + return EOF; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n")); + s = (char*)tmp; + for (i = 12; i > 0; i--) + { *s++ = soap->buf[soap->bufidx++]; + if (soap->bufidx >= soap->buflen) + if (soap_recv_raw(soap)) + return EOF; + } + soap->dime.flags = tmp[0] & 0x7; + soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); + if (soap->dime.flags & SOAP_DIME_CF) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n")); + soap->dime.chunksize = soap->dime.size; + if (soap->buflen - soap->bufidx >= soap->dime.size) + { soap->dime.buflen = soap->buflen; + soap->buflen = soap->bufidx + soap->dime.chunksize; + } + else + soap->dime.chunksize -= soap->buflen - soap->bufidx; + } + else + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n")); + soap->dime.buflen = 0; + soap->dime.chunksize = 0; + } + soap->count = soap->buflen - soap->bufidx; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count)); + return SOAP_OK; + } + if (soap->dime.chunksize) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize)); + if (soap_recv_raw(soap)) + return EOF; + if (soap->buflen - soap->bufidx >= soap->dime.chunksize) + { soap->dime.buflen = soap->buflen; + soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize; + soap->buflen = soap->bufidx + soap->dime.chunksize; + } + else + soap->dime.chunksize -= soap->buflen - soap->bufidx; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%u\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned int)soap->count)); + return SOAP_OK; + } + } +#endif + return soap_recv_raw(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +soap_wchar +SOAP_FMAC2 +soap_getchar(struct soap *soap) +{ register soap_wchar c; + c = soap->ahead; + if (c) + { if (c != EOF) + soap->ahead = 0; + return c; + } + return soap_get1(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const struct soap_code_map* +SOAP_FMAC2 +soap_code(const struct soap_code_map *code_map, const char *str) +{ if (code_map && str) + { while (code_map->string) + { if (!strcmp(str, code_map->string)) /* case sensitive */ + return code_map; + code_map++; + } + } + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +long +SOAP_FMAC2 +soap_code_int(const struct soap_code_map *code_map, const char *str, long other) +{ if (code_map) + { while (code_map->string) + { if (!soap_tag_cmp(str, code_map->string)) /* case insensitive */ + return code_map->code; + code_map++; + } + } + return other; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_code_str(const struct soap_code_map *code_map, long code) +{ if (!code_map) + return NULL; + while (code_map->code != code && code_map->string) + code_map++; + return code_map->string; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +long +SOAP_FMAC2 +soap_code_bits(const struct soap_code_map *code_map, const char *str) +{ register long bits = 0; + if (code_map) + { while (str && *str) + { const struct soap_code_map *p; + for (p = code_map; p->string; p++) + { register size_t n = strlen(p->string); + if (!strncmp(p->string, str, n) && soap_blank(str[n])) + { bits |= p->code; + str += n; + while (*str > 0 && *str <= 32) + str++; + break; + } + } + if (!p->string) + return 0; + } + } + return bits; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) +{ register char *t = soap->tmpbuf; + if (code_map) + { while (code_map->string) + { if (code_map->code & code) + { register const char *s = code_map->string; + if (t != soap->tmpbuf) + *t++ = ' '; + while (*s && t < soap->tmpbuf + sizeof(soap->tmpbuf) - 1) + *t++ = *s++; + if (t == soap->tmpbuf + sizeof(soap->tmpbuf) - 1) + break; + } + code_map++; + } + } + *t = '\0'; + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static soap_wchar +soap_char(struct soap *soap) +{ char tmp[8]; + register int i; + register soap_wchar c; + register char *s = tmp; + for (i = 0; i < 7; i++) + { c = soap_get1(soap); + if (c == ';' || (int)c == EOF) + break; + *s++ = (char)c; + } + *s = '\0'; + if (*tmp == '#') + { if (tmp[1] == 'x' || tmp[1] == 'X') + return soap_strtol(tmp + 2, NULL, 16); + return atol(tmp + 1); + } + if (!strcmp(tmp, "lt")) + return '<'; + if (!strcmp(tmp, "gt")) + return '>'; + if (!strcmp(tmp, "amp")) + return '&'; + if (!strcmp(tmp, "quot")) + return '"'; + if (!strcmp(tmp, "apos")) + return '\''; +#ifndef WITH_LEAN + return (soap_wchar)soap_code_int(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR); +#else + return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ +#endif +} +#endif + +/******************************************************************************/ +#ifdef WITH_LEAN +#ifndef PALM_1 +soap_wchar +soap_get0(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx]; +} +#endif +#endif + +/******************************************************************************/ +#ifdef WITH_LEAN +#ifndef PALM_1 +soap_wchar +soap_get1(struct soap *soap) +{ if (soap->bufidx >= soap->buflen && soap_recv(soap)) + return EOF; + return (unsigned char)soap->buf[soap->bufidx++]; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +soap_wchar +SOAP_FMAC2 +soap_get(struct soap *soap) +{ register soap_wchar c; + c = soap->ahead; + if (c) + { if ((int)c != EOF) + soap->ahead = 0; + } + else + c = soap_get1(soap); + while ((int)c != EOF) + { if (soap->cdata) + { if (c == ']') + { c = soap_get1(soap); + if (c == ']') + { c = soap_get0(soap); + if (c == '>') + { soap->cdata = 0; + soap_get1(soap); + c = soap_get1(soap); + } + else + { soap_unget(soap, ']'); + return ']'; + } + } + else + { soap_revget1(soap); + return ']'; + } + } + else + return c; + } + switch (c) + { case '<': + do c = soap_get1(soap); + while (soap_blank(c)); + if (c == '!' || c == '?' || c == '%') + { register int k = 1; + if (c == '!') + { c = soap_get1(soap); + if (c == '[') + { do c = soap_get1(soap); + while ((int)c != EOF && c != '['); + if ((int)c == EOF) + break; + soap->cdata = 1; + c = soap_get1(soap); + continue; + } + if (c == '-' && (c = soap_get1(soap)) == '-') + { do + { c = soap_get1(soap); + if (c == '-' && (c = soap_get1(soap)) == '-') + break; + } while ((int)c != EOF); + } + } + else if (c == '?') + c = soap_get_pi(soap); + while ((int)c != EOF) + { if (c == '<') + k++; + else if (c == '>') + { if (--k <= 0) + break; + } + c = soap_get1(soap); + } + if ((int)c == EOF) + break; + c = soap_get1(soap); + continue; + } + if (c == '/') + return SOAP_TT; + soap_revget1(soap); + return SOAP_LT; + case '>': + return SOAP_GT; + case '"': + return SOAP_QT; + case '\'': + return SOAP_AP; + case '&': + return soap_char(soap) | 0x80000000; + } + break; + } + return c; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static soap_wchar +soap_get_pi(struct soap *soap) +{ char buf[64]; + register char *s = buf; + register int i = sizeof(buf); + register soap_wchar c = soap_getchar(soap); + /* This is a quick way to parse XML PI and we could use a callback instead to + * enable applications to intercept processing instructions */ + while ((int)c != EOF && c != '?') + { if (--i > 0) + { if (soap_blank(c)) + c = ' '; + *s++ = (char)c; + } + c = soap_getchar(soap); + } + *s = '\0'; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI \n", buf)); + if (!strncmp(buf, "xml ", 4)) + { s = strstr(buf, " encoding="); + if (s && s[10]) + { if (!soap_tag_cmp(s + 11, "iso-8859-1*") + || !soap_tag_cmp(s + 11, "latin1*")) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to latin1 encoding\n")); + soap->mode |= SOAP_ENC_LATIN; + } + else if (!soap_tag_cmp(s + 11, "utf-8*")) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Switching to utf-8 encoding\n")); + soap->mode &= ~SOAP_ENC_LATIN; + } + } + } + if ((int)c != EOF) + c = soap_getchar(soap); + return c; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_move(struct soap *soap, long n) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n)); + for (; n > 0; n--) + if ((int)soap_getchar(soap) == EOF) + return SOAP_EOF; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +size_t +SOAP_FMAC2 +soap_tell(struct soap *soap) +{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_pututf8(struct soap *soap, register unsigned long c) +{ char tmp[16]; + if (c < 0x80 && c > 0) + { *tmp = (char)c; + return soap_send_raw(soap, tmp, 1); + } +#ifndef WITH_LEAN + if (c >= 0x80) + { register char *t = tmp; + if (c < 0x0800) + *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); + else + { if (c < 0x010000) + *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); + else + { if (c < 0x200000) + *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); + else + { if (c < 0x04000000) + *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); + else + { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); + *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); + } + *t++ = (char)(0x80 | (c & 0x3F)); + *t = '\0'; + } +#else + sprintf(tmp, "&#%lu;", c); +#endif + return soap_send(soap, tmp); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +soap_wchar +SOAP_FMAC2 +soap_getutf8(struct soap *soap) +{ register soap_wchar c, c1, c2, c3, c4; + c = soap->ahead; + if (c > 0xFF) + { soap->ahead = 0; + return c; + } +again: + c = soap_get(soap); + if (c < 0x80 || (soap->mode & SOAP_ENC_LATIN)) + return c; + c1 = soap_get1(soap); + if (c1 < 0x80) + { soap_revget1(soap); /* doesn't look like this is UTF8 */ + return c; + } + c1 &= 0x3F; + if (c < 0xE0) + return ((soap_wchar)(c & 0x1F) << 6) | c1; + c2 = (soap_wchar)soap_get1(soap) & 0x3F; + if (c == 0xEF && c1 == 0x3B && c2 == 0x3F) /* ignore UTF-8 BOM */ + goto again; + if (c < 0xF0) + return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2; + c3 = (soap_wchar)soap_get1(soap) & 0x3F; + if (c < 0xF8) + return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; + c4 = (soap_wchar)soap_get1(soap) & 0x3F; + if (c < 0xFC) + return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; + return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_puthex(struct soap *soap, const unsigned char *s, int n) +{ char d[2]; + register int i; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!(soap->dom->data = soap_s2hex(soap, s, NULL, n))) + return soap->error; + return SOAP_OK; + } +#endif + for (i = 0; i < n; i++) + { register int m = *s++; + d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); + m &= 0x0F; + d[1] = (char)(m + (m > 9 ? '7' : '0')); + if (soap_send_raw(soap, d, 2)) + return soap->error; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +unsigned char* +SOAP_FMAC2 +soap_gethex(struct soap *soap, int *n) +{ +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_string_in(soap, 0, -1, -1); + return (unsigned char*)soap_hex2s(soap, soap->dom->data, NULL, 0, n); + } +#endif +#ifdef WITH_FAST + soap->labidx = 0; + for (;;) + { register char *s; + register size_t i, k; + if (soap_append_lab(soap, NULL, 0)) + return NULL; + s = soap->labbuf + soap->labidx; + k = soap->lablen - soap->labidx; + soap->labidx = soap->lablen; + for (i = 0; i < k; i++) + { register char d1, d2; + register soap_wchar c; + c = soap_get(soap); + if (soap_isxdigit(c)) + { d1 = (char)c; + c = soap_get(soap); + if (soap_isxdigit(c)) + d2 = (char)c; + else + { soap->error = SOAP_TYPE; + return NULL; + } + } + else + { unsigned char *p; + soap_unget(soap, c); + if (n) + *n = (int)(soap->lablen + i - k); + p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k); + if (p) + memcpy(p, soap->labbuf, soap->lablen + i - k); + return p; + } + *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); + } + } +#else + if (soap_new_block(soap) == NULL) + return NULL; + for (;;) + { register int i; + register char *s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); + if (!s) + { soap_end_block(soap, NULL); + return NULL; + } + for (i = 0; i < SOAP_BLKLEN; i++) + { register char d1, d2; + register soap_wchar c = soap_get(soap); + if (soap_isxdigit(c)) + { d1 = (char)c; + c = soap_get(soap); + if (soap_isxdigit(c)) + d2 = (char)c; + else + { soap_end_block(soap, NULL); + soap->error = SOAP_TYPE; + return NULL; + } + } + else + { unsigned char *p; + soap_unget(soap, c); + if (n) + *n = (int)soap_size_block(soap, NULL, i); + p = (unsigned char*)soap_save_block(soap, NULL, 0); + return p; + } + *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); + } + } +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putbase64(struct soap *soap, const unsigned char *s, int n) +{ register int i; + register unsigned long m; + char d[4]; + if (!s) + return SOAP_OK; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!(soap->dom->data = soap_s2base64(soap, s, NULL, n))) + return soap->error; + return SOAP_OK; + } +#endif + for (; n > 2; n -= 3, s += 3) + { m = s[0]; + m = (m << 8) | s[1]; + m = (m << 8) | s[2]; + for (i = 4; i > 0; m >>= 6) + d[--i] = soap_base64o[m & 0x3F]; + if (soap_send_raw(soap, d, 4)) + return soap->error; + } + if (n > 0) + { m = 0; + for (i = 0; i < n; i++) + m = (m << 8) | *s++; + for (; i < 3; i++) + m <<= 8; + for (i++; i > 0; m >>= 6) + d[--i] = soap_base64o[m & 0x3F]; + for (i = 3; i > n; i--) + d[i] = '='; + if (soap_send_raw(soap, d, 4)) + return soap->error; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +unsigned char* +SOAP_FMAC2 +soap_getbase64(struct soap *soap, int *n, int malloc_flag) +{ +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_string_in(soap, 0, -1, -1); + return (unsigned char*)soap_base642s(soap, soap->dom->data, NULL, 0, n); + } +#endif +#ifdef WITH_FAST + soap->labidx = 0; + for (;;) + { register size_t i, k; + register char *s; + if (soap_append_lab(soap, NULL, 2)) + return NULL; + s = soap->labbuf + soap->labidx; + k = soap->lablen - soap->labidx; + soap->labidx = 3 * (soap->lablen / 3); + if (!s) + return NULL; + if (k > 2) + { for (i = 0; i < k - 2; i += 3) + { register unsigned long m = 0; + register int j = 0; + do + { register soap_wchar c = soap_get(soap); + if (c == '=' || c < 0) + { unsigned char *p; + switch (j) + { case 2: + *s++ = (char)((m >> 4) & 0xFF); + i++; + break; + case 3: + *s++ = (char)((m >> 10) & 0xFF); + *s++ = (char)((m >> 2) & 0xFF); + i += 2; + } + if (n) + *n = (int)(soap->lablen + i - k); + p = (unsigned char*)soap_malloc(soap, soap->lablen + i - k); + if (p) + memcpy(p, soap->labbuf, soap->lablen + i - k); + if (c >= 0) + { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) + ; + } + soap_unget(soap, c); + return p; + } + c -= '+'; + if (c >= 0 && c <= 79) + { register int b = soap_base64i[c]; + if (b >= 64) + { soap->error = SOAP_TYPE; + return NULL; + } + m = (m << 6) + b; + j++; + } + else if (!soap_blank(c + '+')) + { soap->error = SOAP_TYPE; + return NULL; + } + } while (j < 4); + *s++ = (char)((m >> 16) & 0xFF); + *s++ = (char)((m >> 8) & 0xFF); + *s++ = (char)(m & 0xFF); + } + } + } +#else + if (soap_new_block(soap) == NULL) + return NULL; + for (;;) + { register int i; + register char *s = (char*)soap_push_block(soap, NULL, 3 * SOAP_BLKLEN); /* must be multiple of 3 */ + if (!s) + { soap_end_block(soap, NULL); + return NULL; + } + for (i = 0; i < SOAP_BLKLEN; i++) + { register unsigned long m = 0; + register int j = 0; + do + { register soap_wchar c = soap_get(soap); + if (c == '=' || c < 0) + { unsigned char *p; + i *= 3; + switch (j) + { case 2: + *s++ = (char)((m >> 4) & 0xFF); + i++; + break; + case 3: + *s++ = (char)((m >> 10) & 0xFF); + *s++ = (char)((m >> 2) & 0xFF); + i += 2; + } + if (n) + *n = (int)soap_size_block(soap, NULL, i); + p = (unsigned char*)soap_save_block(soap, NULL, 0); + if (c >= 0) + { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) + ; + } + soap_unget(soap, c); + return p; + } + c -= '+'; + if (c >= 0 && c <= 79) + { int b = soap_base64i[c]; + if (b >= 64) + { soap->error = SOAP_TYPE; + return NULL; + } + m = (m << 6) + b; + j++; + } + else if (!soap_blank(c)) + { soap->error = SOAP_TYPE; + return NULL; + } + } while (j < 4); + *s++ = (char)((m >> 16) & 0xFF); + *s++ = (char)((m >> 8) & 0xFF); + *s++ = (char)(m & 0xFF); + } + } +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_xop_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) +{ /* Check MTOM xop:Include element (within hex/base64Binary) */ + /* TODO: this code to be obsoleted with new import/xop.h conventions */ + int body = soap->body; /* should save type too? */ + if (!soap_peek_element(soap)) + { if (!soap_element_begin_in(soap, "xop:Include", 0, NULL) && *soap->href) + { if (soap_dime_forward(soap, ptr, size, id, type, options)) + return soap->error; + } + if (soap->body && soap_element_end_in(soap, NULL)) + return soap->error; + } + soap->body = body; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_dime_forward(struct soap *soap, unsigned char **ptr, int *size, char **id, char **type, char **options) +{ struct soap_xlist *xp; + *ptr = NULL; + *size = 0; + *id = NULL; + *type = NULL; + *options = NULL; + if (!*soap->href) + return SOAP_OK; + *id = soap_strdup(soap, soap->href); + xp = (struct soap_xlist*)SOAP_MALLOC(soap, sizeof(struct soap_xlist)); + if (!xp) + return soap->error = SOAP_EOM; + xp->next = soap->xlist; + xp->ptr = ptr; + xp->size = size; + xp->id = *id; + xp->type = type; + xp->options = options; + soap->xlist = xp; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_strdup(struct soap *soap, const char *s) +{ char *t = NULL; + if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1))) + strcpy(t, s); + return t; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +wchar_t * +SOAP_FMAC2 +soap_wstrdup(struct soap *soap, const wchar_t *s) +{ wchar_t *t = NULL; + if (s) + { size_t n = 0; + while (s[n]) + n++; + if ((t = (wchar_t*)soap_malloc(soap, sizeof(wchar_t)*(n+1)))) + memcpy(t, s, sizeof(wchar_t)*(n+1)); + } + return t; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap_blist* +SOAP_FMAC2 +soap_new_block(struct soap *soap) +{ struct soap_blist *p; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist)); + if (!(p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)))) + { soap->error = SOAP_EOM; + return NULL; + } + p->next = soap->blist; + p->ptr = NULL; + p->size = 0; + soap->blist = p; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) +{ char *p; + if (!b) + b = soap->blist; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)b->size + (unsigned int)n)); + if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(char*) + sizeof(size_t)))) + { soap->error = SOAP_EOM; + return NULL; + } + *(char**)p = b->ptr; + *(size_t*)(p + sizeof(char*)) = n; + b->ptr = p; + b->size += n; + return p + sizeof(char*) + sizeof(size_t); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_pop_block(struct soap *soap, struct soap_blist *b) +{ char *p; + if (!b) + b = soap->blist; + if (!b->ptr) + return; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n")); + p = b->ptr; + b->size -= *(size_t*)(p + sizeof(char*)); + b->ptr = *(char**)p; + SOAP_FREE(soap, p); +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_update_ptrs(struct soap *soap, char *start, char *end, char *p1, char *p2) +{ int i; + register struct soap_ilist *ip = NULL; + register struct soap_flist *fp = NULL; +#ifndef WITH_LEANER + register struct soap_xlist *xp = NULL; +#endif + register void *p, **q; + for (i = 0; i < SOAP_IDHASH; i++) + { for (ip = soap->iht[i]; ip; ip = ip->next) + { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + (p1-p2))); + ip->ptr = (char*)ip->ptr + (p1-p2); + } + for (q = &ip->link; q; q = (void**)p) + { p = *q; + if (p && (char*)p >= start && (char*)p < end) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p)); + *q = (char*)p + (p1-p2); + } + } + for (q = &ip->copy; q; q = (void**)p) + { p = *q; + if (p && (char*)p >= start && (char*)p < end) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p)); + *q = (char*)p + (p1-p2); + } + } + for (fp = ip->flist; fp; fp = fp->next) + { if ((char*)fp->ptr >= start && (char*)fp->ptr < end) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp)); + fp->ptr = (char*)fp->ptr + (p1-p2); + } + } + } + } +#ifndef WITH_LEANER + for (xp = soap->xlist; xp; xp = xp->next) + { if (xp->ptr && (char*)xp->ptr >= start && (char*)xp->ptr < end) + { 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))); + xp->ptr = (unsigned char**)((char*)xp->ptr + (p1-p2)); + xp->size = (int*)((char*)xp->size + (p1-p2)); + xp->type = (char**)((char*)xp->type + (p1-p2)); + xp->options = (char**)((char*)xp->options + (p1-p2)); + } + } +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static int +soap_has_copies(struct soap *soap, register const char *start, register const char *end) +{ register int i; + register struct soap_ilist *ip = NULL; + register struct soap_flist *fp = NULL; + register const char *p; + for (i = 0; i < SOAP_IDHASH; i++) + { for (ip = soap->iht[i]; ip; ip = ip->next) + { for (p = (const char*)ip->copy; p; p = *(const char**)p) + if (p >= start && p < end) + return SOAP_ERR; + for (fp = ip->flist; fp; fp = fp->next) + if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end) + return SOAP_ERR; + } + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_resolve(struct soap *soap) +{ register int i; + register struct soap_ilist *ip = NULL; + register struct soap_flist *fp = NULL; + short flag; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n")); + for (i = 0; i < SOAP_IDHASH; i++) + { for (ip = soap->iht[i]; ip; ip = ip->next) + { if (ip->ptr) + { register void *p, **q, *r; + q = (void**)ip->link; + ip->link = NULL; + r = ip->ptr; + DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s'\n", ip->id)); + while (q) + { p = *q; + *q = r; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, r)); + q = (void**)p; + } + } + else if (*ip->id == '#') + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing data for id='%s'\n", ip->id)); + strcpy(soap->id, ip->id + 1); + return soap->error = SOAP_MISSING_ID; + } + } + } + do + { flag = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); + for (i = 0; i < SOAP_IDHASH; i++) + { for (ip = soap->iht[i]; ip; ip = ip->next) + { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) + { if (ip->copy) + { register void *p, **q = (void**)ip->copy; + DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id)); + ip->copy = NULL; + do + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size)); + p = *q; + memcpy(q, ip->ptr, ip->size); + q = (void**)p; + } while (q); + flag = 1; + } + for (fp = ip->flist; fp; fp = ip->flist) + { register unsigned int k = fp->level; + register void *p = ip->ptr; + 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)); + while (ip->level < k) + { register void **q = (void**)soap_malloc(soap, sizeof(void*)); + if (!q) + return soap->error; + *q = p; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q)); + p = (void*)q; + k--; + } + if (fp->fcopy) + fp->fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); + else + soap_fcopy(soap, ip->type, fp->type, fp->ptr, fp->len, p, ip->size); + ip->flist = fp->next; + SOAP_FREE(soap, fp); + flag = 1; + } + } + } + } + } while (flag); +#ifdef SOAP_DEBUG + for (i = 0; i < SOAP_IDHASH; i++) + { for (ip = soap->iht[i]; ip; ip = ip->next) + { if (ip->copy || ip->flist) + { 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)); + } + } + } +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +size_t +SOAP_FMAC2 +soap_size_block(struct soap *soap, struct soap_blist *b, size_t n) +{ if (!b) + b = soap->blist; + if (b->ptr) + { b->size -= *(size_t*)(b->ptr + sizeof(char*)) - n; + *(size_t*)(b->ptr + sizeof(char*)) = n; + } + return b->size; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_first_block(struct soap *soap, struct soap_blist *b) +{ char *p, *q, *r; + if (!b) + b = soap->blist; + p = b->ptr; + if (!p) + return NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n")); + r = NULL; + do + { q = *(char**)p; + *(char**)p = r; + r = p; + p = q; + } while (p); + b->ptr = r; + return r + sizeof(char*) + sizeof(size_t); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_next_block(struct soap *soap, struct soap_blist *b) +{ char *p; + if (!b) + b = soap->blist; + p = b->ptr; + if (p) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n")); + b->ptr = *(char**)p; + SOAP_FREE(soap, p); + if (b->ptr) + return b->ptr + sizeof(char*) + sizeof(size_t); + } + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +size_t +SOAP_FMAC2 +soap_block_size(struct soap *soap, struct soap_blist *b) +{ if (!b) + b = soap->blist; + return *(size_t*)(b->ptr + sizeof(char*)); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_end_block(struct soap *soap, struct soap_blist *b) +{ char *p, *q; + if (!b) + b = soap->blist; + if (b) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n")); + for (p = b->ptr; p; p = q) + { q = *(char**)p; + SOAP_FREE(soap, p); + } + if (soap->blist == b) + soap->blist = b->next; + else + { struct soap_blist *bp; + for (bp = soap->blist; bp; bp = bp->next) + { if (bp->next == b) + { bp->next = b->next; + break; + } + } + } + SOAP_FREE(soap, b); + } + DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n")); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) +{ register size_t n; + register char *q, *s; + if (!b) + b = soap->blist; + 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)); + if (b->size) + { if (!p) + p = (char*)soap_malloc(soap, b->size); + if (p) + { for (s = p, q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) + { n = soap_block_size(soap, b); +#ifndef WITH_NOIDREF + if (flag) + soap_update_ptrs(soap, q, q + n, s, q); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s)); + memcpy(s, q, n); + s += n; + } + } + else + soap->error = SOAP_EOM; + } + soap_end_block(soap, b); + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_putsize(struct soap *soap, const char *type, int size) +{ return soap_putsizes(soap, type, &size, 1); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_putsizes(struct soap *soap, const char *type, const int *size, int dim) +{ return soap_putsizesoffsets(soap, type, size, NULL, dim); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) +{ int i; + if (!type) + return NULL; + if (soap->version == 2) + { sprintf(soap->type, "%s[%d", type, size[0]); + for (i = 1; i < dim; i++) + sprintf(soap->type + strlen(soap->type), " %d", size[i]); + } + else + { if (offset) + { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]); + for (i = 1; i < dim; i++) + sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]); + } + else + { sprintf(soap->type, "%s[%d", type, size[0]); + for (i = 1; i < dim; i++) + sprintf(soap->type + strlen(soap->type), ",%d", size[i]); + } + strcat(soap->type, "]"); + } + return soap->type; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_putoffset(struct soap *soap, int offset) +{ return soap_putoffsets(soap, &offset, 1); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_putoffsets(struct soap *soap, const int *offset, int dim) +{ register int i; + sprintf(soap->arrayOffset, "[%d", offset[0]); + for (i = 1; i < dim; i++) + sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]); + strcat(soap->arrayOffset, "]"); + return soap->arrayOffset; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_size(const int *size, int dim) +{ register int i, n = size[0]; + for (i = 1; i < dim; i++) + n *= size[i]; + return n; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getoffsets(const char *attr, const int *size, int *offset, int dim) +{ register int i, j = 0; + if (offset) + for (i = 0; i < dim && attr && *attr; i++) + { attr++; + j *= size[i]; + j += offset[i] = (int)atol(attr); + attr = strchr(attr, ','); + } + else + for (i = 0; i < dim && attr && *attr; i++) + { attr++; + j *= size[i]; + j += (int)atol(attr); + attr = strchr(attr, ','); + } + return j; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getsize(const char *attr1, const char *attr2, int *j) +{ register int n, k; + char *s; + *j = 0; + if (!*attr1) + return -1; + if (*attr1 == '[') + attr1++; + n = 1; + for (;;) + { k = (int)soap_strtol(attr1, &s, 10); + n *= k; + if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1) + return -1; + attr1 = strchr(s, ','); + if (!attr1) + attr1 = strchr(s, ' '); + if (attr2 && *attr2) + { attr2++; + *j *= k; + k = (int)soap_strtol(attr2, &s, 10); + *j += k; + if (k < 0) + return -1; + attr2 = s; + } + if (!attr1) + break; + attr1++; + } + return n - *j; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getsizes(const char *attr, int *size, int dim) +{ register int i, k, n; + if (!*attr) + return -1; + i = (int)strlen(attr); + n = 1; + do + { for (i = i-1; i >= 0; i--) + if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ') + break; + k = (int)atol(attr + i + 1); + n *= size[--dim] = k; + if (k < 0 || n > SOAP_MAXARRAYSIZE) + return -1; + } while (i >= 0 && attr[i] != '['); + return n; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getposition(const char *attr, int *pos) +{ register int i, n; + if (!*attr) + return -1; + n = 0; + i = 1; + do + { pos[n++] = (int)atol(attr + i); + while (attr[i] && attr[i] != ',' && attr[i] != ']') + i++; + if (attr[i] == ',') + i++; + } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); + return n; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_push_namespace(struct soap *soap, const char *id, const char *ns) +{ register struct soap_nlist *np; + register struct Namespace *p; + register short i = -1; + register size_t n, k; + n = strlen(id); + k = strlen(ns) + 1; + /* KMD Support both spec versions urn:dslforum-org:cwmp-1-0 and urn:dslforum-org:cwmp-1-1*/ + p = soap->local_namespaces; + if (p) + { for (i = 0; p->id; p++, i++) + { if (p->ns && !strcmp(ns, p->ns)) + { if (p->out) + { SOAP_FREE(soap, p->out); + p->out = NULL; + } + break; + } + if (p->out) + { if (!strcmp(ns, p->out)) + break; + } + else if (p->in) + { if (!soap_tag_cmp(ns, p->in)) + { if ((p->out = (char*)SOAP_MALLOC(soap, k))) + strcpy(p->out, ns); + break; + } + } + } + if (!p || !p->id) + i = -1; + } + if (i >= 0) + k = 0; + np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); + if (!np) + return soap->error = SOAP_EOM; + np->next = soap->nlist; + soap->nlist = np; + np->level = soap->level; + np->index = i; + strcpy(np->id, id); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns)); + if (i < 0) + { np->ns = np->id + n + 1; + strcpy(np->ns, ns); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns)); + } + else + { np->ns = NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id)); + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_pop_namespace(struct soap *soap) +{ register struct soap_nlist *np, *nq; + for (np = soap->nlist; np && np->level >= soap->level; np = nq) + { nq = np->next; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop namespace binding (level=%u) '%s'\n", soap->level, np->id)); + SOAP_FREE(soap, np); + } + soap->nlist = np; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) +{ register struct soap_nlist *np = soap->nlist; + while (np && (strncmp(np->id, id1, n1) || np->id[n1])) + np = np->next; + if (np) + { if (np->index < 0 + || (soap->local_namespaces[np->index].id + && (strncmp(soap->local_namespaces[np->index].id, id2, n2) + || soap->local_namespaces[np->index].id[n2]))) + return SOAP_NAMESPACE; + return SOAP_OK; + } + if (n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) + return SOAP_OK; + return soap->error = SOAP_SYNTAX_ERROR; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_current_namespace(struct soap *soap, const char *tag) +{ register struct soap_nlist *np; + register const char *s; + if (!tag || !strncmp(tag, "xml", 3)) + return NULL; + np = soap->nlist; + if (!(s = strchr(tag, ':'))) + { while (np && *np->id) /* find default namespace, if present */ + np = np->next; + } + else + { while (np && (strncmp(np->id, tag, s - tag) || np->id[s - tag])) + np = np->next; + if (!np) + soap->error = SOAP_NAMESPACE; + } + if (np) + { if (np->index >= 0) + return soap->namespaces[np->index].ns; + if (np->ns) + return soap_strdup(soap, np->ns); + } + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_tag_cmp(const char *s, const char *t) +{ for (;;) + { register int c1 = *s; + register int c2 = *t; + if (!c1 || c1 == '"') + break; + if (c2 != '-') + { if (c1 != c2) + { if (c1 >= 'A' && c1 <= 'Z') + c1 += 'a' - 'A'; + if (c2 >= 'A' && c2 <= 'Z') + c2 += 'a' - 'A'; + } + if (c1 != c2) + { if (c2 != '*') + return 1; + c2 = *++t; + if (!c2) + return 0; + if (c2 >= 'A' && c2 <= 'Z') + c2 += 'a' - 'A'; + for (;;) + { c1 = *s; + if (!c1 || c1 == '"') + break; + if (c1 >= 'A' && c1 <= 'Z') + c1 += 'a' - 'A'; + if (c1 == c2 && !soap_tag_cmp(s + 1, t + 1)) + return 0; + s++; + } + break; + } + } + s++; + t++; + } + if (*t == '*' && !t[1]) + return 0; + return *t; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) +{ register const char *s, *t; + register int err; + if (!tag1 || !tag2 || !*tag2) + return SOAP_OK; + s = strchr(tag1, ':'); + t = strchr(tag2, ':'); + if (t) + { if (s) + { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) + return SOAP_TAG_MISMATCH; + /* KMD Support both spec versions urn:dslforum-org:cwmp-1-0 and urn:dslforum-org:cwmp-1-1*/ + if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); + if (err == SOAP_NAMESPACE) + return SOAP_TAG_MISMATCH; + return err; + } + } + else if (SOAP_STRCMP(tag1, t + 1)) + { return SOAP_TAG_MISMATCH; + } + else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2)); + if (err == SOAP_NAMESPACE) + return SOAP_TAG_MISMATCH; + return err; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); + return SOAP_OK; + } + if (s) + { if (SOAP_STRCMP(s + 1, tag2)) + return SOAP_TAG_MISMATCH; + } + else if (SOAP_STRCMP(tag1, tag2)) + return SOAP_TAG_MISMATCH; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_match_array(struct soap *soap, const char *type) +{ if (*soap->arrayType) + if (soap_match_tag(soap, soap->arrayType, type) + && soap_match_tag(soap, soap->arrayType, "xsd:anyType") + && soap_match_tag(soap, soap->arrayType, "xsd:ur-type") + ) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type)); + return SOAP_TAG_MISMATCH; + } + return SOAP_OK; +} +#endif + +/******************************************************************************\ + * + * SSL + * +\******************************************************************************/ + +#ifdef WITH_OPENSSL +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_rand() +{ unsigned char buf[4]; + if (!soap_ssl_init_done) + soap_ssl_init(); + RAND_pseudo_bytes(buf, 4); + return *(int*)buf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +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) +{ int err; + soap->keyfile = keyfile; + soap->password = password; + soap->cafile = cafile; + soap->capath = capath; + soap->dhfile = dhfile; + soap->randfile = randfile; + soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); + if (!(err = soap->fsslauth(soap))) + { if (sid) + SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); + } + return err; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +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) +{ soap->keyfile = keyfile; + soap->password = password; + soap->cafile = cafile; + soap->capath = capath; + soap->dhfile = NULL; + soap->ssl_flags = flags; + soap->randfile = randfile; + soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; + return soap->fsslauth(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_ssl_init() +{ /* Note: for MT systems, the main program MUST call soap_ssl_init() before any threads are started */ + if (!soap_ssl_init_done) + { soap_ssl_init_done = 1; + SSL_library_init(); +#ifndef WITH_LEAN + SSL_load_error_strings(); +#endif + if (!RAND_load_file("/dev/urandom", 1024)) + { char buf[1024]; + RAND_seed(buf, sizeof(buf)); + while (!RAND_status()) + { int r = rand(); + RAND_seed(&r, sizeof(int)); + } + } + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_ssl_error(struct soap *soap, int ret) +{ int err = SSL_get_error(soap->ssl, ret); + const char *msg = soap_code_str(h_ssl_error_codes, err); + if (msg) + strcpy(soap->msgbuf, msg); + else + return ERR_error_string(err, soap->msgbuf); + if (ERR_peek_error()) + { unsigned long r; + strcat(soap->msgbuf, "\n"); + while ((r = ERR_get_error())) + ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf)); + } + else + { switch (ret) + { case 0: + strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information."); + break; + case -1: + sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno)); + break; + } + } + return soap->msgbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +ssl_password(char *buf, int num, int rwflag, void *userdata) +{ if (num < (int)strlen((char*)userdata) + 1) + return 0; + return (int)strlen(strcpy(buf, (char*)userdata)); +} +#endif + +/******************************************************************************/ +/* This callback is included for future references. It should not be deleted +#ifndef PALM_2 +static DH * +ssl_tmp_dh(SSL *ssl, int is_export, int keylength) +{ static DH *dh512 = NULL; + static DH *dh1024 = NULL; + DH *dh; + switch (keylength) + { case 512: + if (!dh512) + { BIO *bio = BIO_new_file("dh512.pem", "r"); + if (bio) + { dh512 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); + BIO_free(bio); + return dh512; + } + } + else + return dh512; + default: + if (!dh1024) + { BIO *bio = BIO_new_file("dh1024.pem", "r"); + if (bio) + { dh1024 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); + BIO_free(bio); + } + } + dh = dh1024; + } + return dh; +} +#endif +*/ + +/******************************************************************************/ +#ifndef PALM_1 +static int +ssl_auth_init(struct soap *soap) +{ long flags; + int mode; + if (!soap_ssl_init_done) + soap_ssl_init(); + ERR_clear_error(); + if (!soap->ctx) + { if (!(soap->ctx = SSL_CTX_new(SSLv23_method()))) + return soap_set_receiver_error(soap, "SSL error", "Can't setup context", SOAP_SSL_ERROR); + /* Alters the behavior of SSL read/write: + SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); + */ + } + if (soap->randfile) + { if (!RAND_load_file(soap->randfile, -1)) + return soap_set_receiver_error(soap, "SSL error", "Can't load randomness", SOAP_SSL_ERROR); + } + if (soap->cafile || soap->capath) + { if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath)) + return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and directory", SOAP_SSL_ERROR); + if (soap->cafile && (soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) + SSL_CTX_set_client_CA_list(soap->ctx, SSL_load_client_CA_file(soap->cafile)); + } + if (!(soap->ssl_flags & SOAP_SSL_NO_DEFAULT_CA_PATH)) + { if (!SSL_CTX_set_default_verify_paths(soap->ctx)) + return soap_set_receiver_error(soap, "SSL error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR); + } +/* This code assumes a typical scenario, see alternative code below */ + if (soap->keyfile) + { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) + return soap_set_receiver_error(soap, "SSL error", "Can't read certificate key file", SOAP_SSL_ERROR); + if (soap->password) + { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); + SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); + } + if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) + return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR); + } +/* Suggested alternative approach to check the key file for certs (cafile=NULL): + if (soap->password) + { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password); + SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password); + } + if (!soap->cafile || !SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) + { if (soap->keyfile) + { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) + return soap_set_receiver_error(soap, "SSL error", "Can't read certificate or key file", SOAP_SSL_ERROR); + if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) + return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR); + } + } +*/ + if ((soap->ssl_flags & SOAP_SSL_RSA)) + { RSA *rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL); + if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) + { if (rsa) + RSA_free(rsa); + return soap_set_receiver_error(soap, "SSL error", "Can't set RSA key", SOAP_SSL_ERROR); + } + RSA_free(rsa); + } + else if (soap->dhfile) + { DH *dh = 0; + BIO *bio; + bio = BIO_new_file(soap->dhfile, "r"); + if (!bio) + return soap_set_receiver_error(soap, "SSL error", "Can't read DH file", SOAP_SSL_ERROR); + dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); + BIO_free(bio); + if (SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) + { if (dh) + DH_free(dh); + return soap_set_receiver_error(soap, "SSL error", "Can't set DH parameters", SOAP_SSL_ERROR); + } + DH_free(dh); + } + flags = (SSL_OP_ALL | SSL_OP_NO_SSLv2); + if ((soap->ssl_flags & SOAP_SSLv3)) + flags |= SSL_OP_NO_TLSv1; + if ((soap->ssl_flags & SOAP_TLSv1)) + flags |= SSL_OP_NO_SSLv3; + SSL_CTX_set_options(soap->ctx, flags); + if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) + mode = (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT); + else if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) + mode = SSL_VERIFY_PEER; + else + mode = SSL_VERIFY_NONE; + SSL_CTX_set_verify(soap->ctx, mode, soap->fsslverify); +#if (OPENSSL_VERSION_NUMBER < 0x00905100L) + SSL_CTX_set_verify_depth(soap->ctx, 1); +#else + SSL_CTX_set_verify_depth(soap->ctx, 9); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +ssl_verify_callback(int ok, X509_STORE_CTX *store) +{ +#ifdef SOAP_DEBUG + if (!ok) + { char data[256]; + X509 *cert = X509_STORE_CTX_get_current_cert(store); + 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(X509_STORE_CTX_get_error(store))); + X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data)); + fprintf(stderr, "certificate issuer %s\n", data); + X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data)); + fprintf(stderr, "certificate subject %s\n", data); + } +#endif + /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ + return ok; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) +{ ok = ssl_verify_callback(ok, store); + if (ok == 0 && X509_STORE_CTX_get_error(store) == X509_V_ERR_CERT_HAS_EXPIRED) + { +#ifdef SOAP_DEBUG + fprintf(stderr, "ignoring certificate expiration\n"); +#endif + X509_STORE_CTX_set_error(store, X509_V_OK); + ok = 1; + } + /* Note: return 1 to continue, but unsafe progress will be terminated by SSL */ + return ok; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_ssl_accept(struct soap *soap) +{ BIO *bio; + int retries, r, s; + if (!soap_valid_socket(soap->socket)) + return soap_set_receiver_error(soap, "SSL error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); + if (!soap->ctx && (soap->error = soap->fsslauth(soap))) + return SOAP_SSL_ERROR; + if (!soap->ssl) + { soap->ssl = SSL_new(soap->ctx); + if (!soap->ssl) + return soap_set_receiver_error(soap, "SSL error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); + } + else + SSL_clear(soap->ssl); + soap->imode |= SOAP_ENC_SSL; + soap->omode |= SOAP_ENC_SSL; + /* Set SSL sockets to non-blocking */ + SOAP_SOCKNONBLOCK(soap->socket) + bio = BIO_new_socket((int)soap->socket, BIO_NOCLOSE); + SSL_set_bio(soap->ssl, bio, bio); + retries = 100; /* 10 sec retries, 100 times 0.1 sec */ + while ((r = SSL_accept(soap->ssl)) <= 0) + { int err = SSL_get_error(soap->ssl, r); + if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) + { struct timeval timeout; + fd_set fd; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + timeout.tv_sec = 0; + timeout.tv_usec = 100000; + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); + if (err == SSL_ERROR_WANT_READ) + s = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout); + else + s = select((int)soap->socket + 1, NULL, &fd, &fd, &timeout); + if (s < 0 && (s = soap_socket_errno(soap->socket)) != SOAP_EINTR) + { soap->errnum = s; + break; + } + } + else + { soap->errnum = err; + break; + } + if (retries-- <= 0) + break; + } + if (r <= 0) + { soap_set_receiver_error(soap, soap_ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); + soap_closesock(soap); + return SOAP_SSL_ERROR; + } + if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) + { X509 *peer; + int err; + if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) + { soap_closesock(soap); + 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); + } + peer = SSL_get_peer_certificate(soap->ssl); + if (!peer) + { soap_closesock(soap); + return soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); + } + X509_free(peer); + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#endif /* WITH_OPENSSL */ + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_init(struct soap *soap) +{ soap->errmode = 1; +#ifdef WIN32 + if (tcp_done) + return 0; + else + { WSADATA w; + if (WSAStartup(MAKEWORD(1, 1), &w)) + return -1; + tcp_done = 1; + } +#endif + return 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_done(struct soap *soap) +{ +#ifdef SOAP_DEBUG + int i; +#endif + if (soap_check_state(soap)) + return; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Done with context\n")); + soap_free_temp(soap); + while (soap->clist) + { struct soap_clist *p = soap->clist->next; + SOAP_FREE(soap, soap->clist); + soap->clist = p; + } + soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ + soap->keep_alive = 0; /* to force close the socket */ + soap_closesock(soap); +#ifdef WITH_COOKIES + soap_free_cookies(soap); +#endif + while (soap->plugins) + { register struct soap_plugin *p = soap->plugins->next; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id)); + if (soap->plugins->fcopy || soap->state == SOAP_INIT) + soap->plugins->fdelete(soap, soap->plugins); + SOAP_FREE(soap, soap->plugins); + soap->plugins = p; + } + soap->fplugin = fplugin; + soap->fmalloc = NULL; +#ifndef WITH_NOHTTP + soap->fpost = http_post; + soap->fget = http_get; + soap->fput = http_put; + soap->fdel = http_del; + soap->fhead = http_head; + soap->fform = NULL; + soap->fposthdr = http_post_header; + soap->fresponse = http_response; + soap->fparse = http_parse; + soap->fparsehdr = http_parse_header; +#endif + soap->fheader = NULL; +#ifndef WITH_NOIO +#ifndef WITH_IPV6 + soap->fresolve = tcp_gethost; +#else + soap->fresolve = NULL; +#endif + soap->faccept = tcp_accept; + soap->fopen = tcp_connect; + soap->fclose = tcp_disconnect; + soap->fclosesocket = tcp_closesocket; + soap->fshutdownsocket = tcp_shutdownsocket; + soap->fsend = fsend; + soap->frecv = frecv; + soap->fpoll = soap_poll; +#else + soap->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; + soap->fpreparefinal = NULL; +#endif + soap->fseterror = NULL; + soap->fignore = NULL; + soap->fserveloop = NULL; +#ifdef WITH_OPENSSL + if (soap->session) + { SSL_SESSION_free(soap->session); + soap->session = NULL; + } +#endif + if (soap->state == SOAP_INIT) + { if (soap_valid_socket(soap->master)) + { soap->fclosesocket(soap, soap->master); + soap->master = SOAP_INVALID_SOCKET; + } + } +#ifdef WITH_OPENSSL + if (soap->ssl) + { SSL_free(soap->ssl); + soap->ssl = NULL; + } + if (soap->state == SOAP_INIT) + { if (soap->ctx) + { SSL_CTX_free(soap->ctx); + soap->ctx = NULL; + } + } +#endif +#ifdef WITH_OPENSSL + ERR_remove_state(0); +#endif +#ifdef WITH_C_LOCALE + freelocale(soap->c_locale); +#endif +#ifdef WITH_ZLIB + if (soap->d_stream) + { SOAP_FREE(soap, (void*)soap->d_stream); + soap->d_stream = NULL; + } + if (soap->z_buf) + { SOAP_FREE(soap, (void*)soap->z_buf); + soap->z_buf = NULL; + } +#endif +#ifdef SOAP_DEBUG + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free logfiles\n")); + for (i = 0; i < SOAP_MAXLOGS; i++) + { if (soap->logfile[i]) + { SOAP_FREE(soap, (void*)soap->logfile[i]); + soap->logfile[i] = NULL; + } + soap_close_logfile(soap, i); + } + soap->state = SOAP_NONE; +#endif +#ifdef SOAP_MEM_DEBUG + soap_free_mht(soap); +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_cleanup(struct soap *soap) +{ soap_done(soap); +#ifdef WIN32 + if (!tcp_done) + return; + tcp_done = 0; + WSACleanup(); +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static const char* +tcp_error(struct soap *soap) +{ register const char *msg = NULL; + switch (soap->errmode) + { case 0: + msg = soap_strerror(soap); + break; + case 1: + msg = "WSAStartup failed"; + break; + case 2: + { +#ifndef WITH_LEAN + msg = soap_code_str(h_error_codes, soap->errnum); + if (!msg) +#endif + { sprintf(soap->msgbuf, "TCP/UDP IP error %d", soap->errnum); + msg = soap->msgbuf; + } + } + } + return msg; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static const char* +http_error(struct soap *soap, int status) +{ register const char *msg = SOAP_STR_EOS; +#ifndef WITH_LEAN + msg = soap_code_str(h_http_error_codes, status); + if (!msg) + msg = SOAP_STR_EOS; +#endif + return msg; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_IPV6 +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) +{ soap_int32 iadd = -1; + struct hostent hostent, *host = &hostent; +#ifdef VXWORKS + int hostint; + /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */ + iadd = inet_addr((char*)addr); +#else +#if defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) + struct hostent_data ht_data; +#endif +#ifdef AS400 + iadd = inet_addr((void*)addr); +#else + iadd = inet_addr(addr); +#endif +#endif + if (iadd != -1) + { memcpy(inaddr, &iadd, sizeof(iadd)); + return SOAP_OK; + } +#if defined(__GLIBC__) || (defined(HAVE_GETHOSTBYNAME_R) && (defined(FREEBSD) || defined(__FreeBSD__))) + if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0) + host = NULL; +#elif defined(_AIX43) || ((defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R)) + memset((void*)&ht_data, 0, sizeof(ht_data)); + if (gethostbyname_r(addr, &hostent, &ht_data) < 0) + { host = NULL; + soap->errnum = h_errno; + } +#elif defined(HAVE_GETHOSTBYNAME_R) + host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum); +#elif defined(VXWORKS) + /* If the DNS resolver library resolvLib has been configured in the vxWorks + * image, a query for the host IP address is sent to the DNS server, if the + * name was not found in the local host table. */ + hostint = hostGetByName((char*)addr); + if (hostint == ERROR) + { host = NULL; + soap->errnum = soap_errno; + } +#else +#ifdef AS400 + if (!(host = gethostbyname((void*)addr))) + soap->errnum = h_errno; +#else + if (!(host = gethostbyname(addr))) + soap->errnum = h_errno; +#endif +#endif + if (!host) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); + return SOAP_ERR; + } +#ifdef VXWORKS + inaddr->s_addr = hostint; +#else + memcpy(inaddr, host->h_addr, host->h_length); +#endif + return SOAP_OK; +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static SOAP_SOCKET +tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port) +{ +#ifdef WITH_IPV6 + struct addrinfo hints, *res, *ressave; +#endif + SOAP_SOCKET fd; + int err = 0; +#ifndef WITH_LEAN + int retry = 10; + int len = SOAP_BUFLEN; + int set = 1; +#endif + if (soap_valid_socket(soap->socket)) + soap->fclosesocket(soap, soap->socket); + soap->socket = SOAP_INVALID_SOCKET; + if (tcp_init(soap)) + { soap->errnum = 0; + soap_set_sender_error(soap, tcp_error(soap), "TCP init failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + soap->errmode = 0; +#ifdef WITH_IPV6 + memset((void*)&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + hints.ai_socktype = SOCK_DGRAM; + else +#endif + hints.ai_socktype = SOCK_STREAM; + soap->errmode = 2; + if (soap->proxy_host) + err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &res); + else + err = getaddrinfo(host, soap_int2s(soap, port), &hints, &res); + if (err) + { soap_set_sender_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + ressave = res; +again: + fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + soap->errmode = 0; +#else +#ifndef WITH_LEAN +again: +#endif +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + fd = socket(AF_INET, SOCK_DGRAM, 0); + else +#endif + fd = socket(AF_INET, SOCK_STREAM, 0); +#endif + if (!soap_valid_socket(fd)) + { +#ifdef WITH_IPV6 + if (res->ai_next) + { res = res->ai_next; + goto again; + } +#endif + soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#ifdef SOCKET_CLOSE_ON_EXEC +#ifdef WIN32 +#ifndef UNDER_CE + SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0); +#endif +#else + fcntl(fd, F_SETFD, 1); +#endif +#endif +#ifndef WITH_LEAN + if (soap->connect_flags == SO_LINGER) + { struct linger linger; + memset((void*)&linger, 0, sizeof(linger)); + linger.l_onoff = 1; + linger.l_linger = soap->linger_time; + if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + } + else if (soap->connect_flags && setsockopt(fd, SOL_SOCKET, soap->connect_flags, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_KEEPIDLE + if (soap->tcp_keep_idle && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#endif +#ifdef TCP_KEEPINTVL + if (soap->tcp_keep_intvl && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#endif +#ifdef TCP_KEEPCNT + if (soap->tcp_keep_cnt && setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, (SOAP_SOCKET)fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#endif +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#endif +#ifdef WITH_IPV6 + if ((soap->omode & SOAP_IO_UDP) && soap->ipv6_multicast_if) + { struct sockaddr_in6 *in6addr = (struct sockaddr_in6*)res->ai_addr; + in6addr->sin6_scope_id = soap->ipv6_multicast_if; + } +#elif defined(IP_MULTICAST_TTL) + if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if) + { if (soap->ipv4_multicast_ttl > 0) + { char ttl = (char)(soap->ipv4_multicast_ttl); + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + } +#ifndef WINDOWS + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } +#else +#ifndef IP_MULTICAST_IF +#define IP_MULTICAST_IF 2 +#endif + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) + { soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } +#endif + } +#endif +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Opening socket %d to host='%s' port=%d\n", fd, host, port)); +#ifndef WITH_IPV6 + soap->peerlen = sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->peer.sin_family = AF_INET; + soap->errmode = 2; + if (soap->proxy_host) + { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.sin_addr)) + { soap_set_sender_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + soap->peer.sin_port = htons((short)soap->proxy_port); + } + else + { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) + { soap_set_sender_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + soap->peer.sin_port = htons((short)port); + } + soap->errmode = 0; +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + { +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return fd; + } +#endif +#endif +#ifndef WITH_LEAN + if (soap->connect_timeout) + SOAP_SOCKNONBLOCK(fd) + else + SOAP_SOCKBLOCK(fd) +#endif + for (;;) + { +#ifdef WITH_IPV6 + if (connect(fd, res->ai_addr, (int)res->ai_addrlen)) +#else + if (connect(fd, (struct sockaddr*)&soap->peer, sizeof(soap->peer))) +#endif + { err = soap_socket_errno(fd); +#ifndef WITH_LEAN + if (err == SOAP_EADDRINUSE) + { soap->fclosesocket(soap, fd); + if (retry-- > 0) + goto again; + } + else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) + { + SOAP_SOCKLEN_T k; +#ifndef WIN32 + if ((int)fd >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + for (;;) + { struct timeval timeout; + fd_set fds; + register int r; + if (soap->connect_timeout > 0) + { timeout.tv_sec = soap->connect_timeout; + timeout.tv_usec = 0; + } + else + { timeout.tv_sec = -soap->connect_timeout/1000000; + timeout.tv_usec = -soap->connect_timeout%1000000; + } + FD_ZERO(&fds); + FD_SET(fd, &fds); + r = select((int)fd + 1, NULL, &fds, NULL, &timeout); + if (r > 0) + break; + if (!r) + { soap->errnum = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); + soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + r = soap_socket_errno(fd); + if (r != SOAP_EINTR) + { soap->errnum = r; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + } + k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); + if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &k) && !soap->errnum) /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ + break; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + if (!soap->errnum) + soap->errnum = soap_socket_errno(fd); + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } +#endif +#ifdef WITH_IPV6 + if (res->ai_next) + { res = res->ai_next; + soap->fclosesocket(soap, fd); + goto again; + } +#endif + if (err && err != SOAP_EINTR) + { soap->errnum = err; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); + soap_set_sender_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); +#ifdef WITH_IPV6 + freeaddrinfo(ressave); +#endif + return SOAP_INVALID_SOCKET; + } + } + else + break; + } +#ifdef WITH_IPV6 + soap->peerlen = 0; /* IPv6: already connected so use send() */ + freeaddrinfo(ressave); +#endif +#ifndef WITH_LEAN + if (soap->recv_timeout || soap->send_timeout) + SOAP_SOCKNONBLOCK(fd) + else + SOAP_SOCKBLOCK(fd) +#endif + soap->socket = fd; + soap->imode &= ~SOAP_ENC_SSL; + soap->omode &= ~SOAP_ENC_SSL; + if (!soap_tag_cmp(endpoint, "https:*")) + { +#ifdef WITH_OPENSSL + BIO *bio; + int r; + if (soap->proxy_host) + { soap_mode m = soap->omode; /* make sure we only parse HTTP */ + size_t n = soap->count; /* save the content length */ + char *userid, *passwd; + soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ + soap->omode |= SOAP_IO_BUFFER; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server\n", soap->proxy_http_version)); + sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->proxy_http_version); + if (soap_begin_send(soap) + || (soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL))) + { soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } +#ifndef WITH_LEAN + if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761) + { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd); + strcpy(soap->tmpbuf, "Basic "); + soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); + if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) + { soap->fclosesocket(soap, fd); + return soap->error; + } + } +#endif + if ((soap->error = soap->fposthdr(soap, NULL, NULL)) + || soap_flush(soap)) + { soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + soap->omode = m; + m = soap->imode; + soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ + userid = soap->userid; /* preserve */ + passwd = soap->passwd; /* preserve */ + if ((soap->error = soap->fparse(soap))) + { soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + soap->userid = userid; /* restore */ + soap->passwd = passwd; /* restore */ + soap->imode = m; /* restore */ + soap->count = n; /* restore */ + if (soap_begin_send(soap)) + { soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + if (endpoint) + strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint)-1); /* restore */ + } + if (!soap->ctx && (soap->error = soap->fsslauth(soap))) + { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + if (!soap->ssl) + { soap->ssl = SSL_new(soap->ctx); + if (!soap->ssl) + { soap->fclosesocket(soap, fd); + soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; + } + } + else + SSL_clear(soap->ssl); + if (soap->session) + { if (!strcmp(soap->session_host, host) && soap->session_port == port) + SSL_set_session(soap->ssl, soap->session); + SSL_SESSION_free(soap->session); + soap->session = NULL; + } + soap->imode |= SOAP_ENC_SSL; + soap->omode |= SOAP_ENC_SSL; + bio = BIO_new_socket((int)fd, BIO_NOCLOSE); + SSL_set_bio(soap->ssl, bio, bio); +#ifndef WITH_LEAN + /* Connect timeout: set SSL sockets to non-blocking */ + if (soap->connect_timeout) + SOAP_SOCKNONBLOCK(fd) + else + SOAP_SOCKBLOCK(fd) + /* Try connecting until success or timeout */ + do + { if ((r = SSL_connect(soap->ssl)) <= 0) + { int err = SSL_get_error(soap->ssl, r); + if (err != SSL_ERROR_WANT_CONNECT && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) + { soap_set_sender_error(soap, soap_ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + if (soap->connect_timeout) + { struct timeval timeout; + fd_set fds; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + if (soap->connect_timeout > 0) + { timeout.tv_sec = soap->connect_timeout; + timeout.tv_usec = 0; + } + else + { timeout.tv_sec = -soap->connect_timeout/1000000; + timeout.tv_usec = -soap->connect_timeout%1000000; + } + FD_ZERO(&fds); + FD_SET(fd, &fds); + if (err == SSL_ERROR_WANT_READ) + r = select((int)fd + 1, &fds, NULL, NULL, &timeout); + else + r = select((int)fd + 1, NULL, &fds, NULL, &timeout); + if (r < 0) + { soap->errnum = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); + soap_set_sender_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + } + } + } while (!SSL_is_init_finished(soap->ssl)); + /* Set SSL sockets to nonblocking */ + SOAP_SOCKNONBLOCK(fd) +#endif + /* Check server credentials when required */ + if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) + { int err; + if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) + { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) + { X509_NAME *subj; + int ext_count; + int ok = 0; + X509 *peer; + peer = SSL_get_peer_certificate(soap->ssl); + if (!peer) + { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + ext_count = X509_get_ext_count(peer); + if (ext_count > 0) + { int i; + for (i = 0; i < ext_count; i++) + { X509_EXTENSION *ext = X509_get_ext(peer, i); + const char *ext_str = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext))); + if (ext_str && !strcmp(ext_str, "subjectAltName")) + { X509V3_EXT_METHOD *meth = X509V3_EXT_get(ext); + void *ext_data; +#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) + const unsigned char *data; +#else + unsigned char *data; +#endif + STACK_OF(CONF_VALUE) *val; + int j; + if (!meth) + break; + data = ext->value->data; +#if (OPENSSL_VERSION_NUMBER > 0x00907000L) + if (meth->it) + ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); + else + { /* OpenSSL not perfectly portable at this point (?): + Some compilers appear to prefer + meth->d2i(NULL, (const unsigned char**)&data, ... + or + meth->d2i(NULL, &data, ext->value->length); + */ + ext_data = meth->d2i(NULL, &data, ext->value->length); + } +#else + ext_data = meth->d2i(NULL, &data, ext->value->length); +#endif + val = meth->i2v(meth, ext_data, NULL); + for (j = 0; j < sk_CONF_VALUE_num(val); j++) + { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j); + if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host)) + { ok = 1; + break; + } + } + } + if (ok) + break; + } + } + if (!ok && (subj = X509_get_subject_name(peer))) + { int i = -1; + do + { ASN1_STRING *name; + i = X509_NAME_get_index_by_NID(subj, NID_commonName, i); + if (i == -1) + break; + name = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subj, i)); + if (name) + { if (!soap_tag_cmp(host, (const char*)name)) + ok = 1; + else + { unsigned char *tmp = NULL; + ASN1_STRING_to_UTF8(&tmp, name); + if (tmp) + { if (!soap_tag_cmp(host, (const char*)tmp)) + ok = 1; + OPENSSL_free(tmp); + } + } + } + } while (!ok); + } + X509_free(peer); + if (!ok) + { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); + soap->fclosesocket(soap, fd); + return SOAP_INVALID_SOCKET; + } + } + } +#else + soap->fclosesocket(soap, fd); + soap->error = SOAP_SSL_ERROR; + return SOAP_INVALID_SOCKET; +#endif + } + return fd; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +SOAP_SOCKET +SOAP_FMAC2 +soap_bind(struct soap *soap, const char *host, int port, int backlog) +{ +#ifdef WITH_IPV6 + struct addrinfo *addrinfo = NULL; + struct addrinfo hints; + struct addrinfo res; + int err; +#ifdef IPV6_V6ONLY + int unset = 0; +#ifdef SOL_IP + int level = SOL_IP; +#else + int level = IPPROTO_IPV6; +#endif +#endif +#endif +#ifndef WITH_LEAN + int len = SOAP_BUFLEN; + int set = 1; +#endif + if (soap_valid_socket(soap->master)) + { soap->fclosesocket(soap, soap->master); + soap->master = SOAP_INVALID_SOCKET; + } + soap->socket = SOAP_INVALID_SOCKET; + soap->errmode = 1; + if (tcp_init(soap)) + { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifdef WITH_IPV6 + memset((void*)&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + hints.ai_socktype = SOCK_DGRAM; + else +#endif + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + soap->errmode = 2; + err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo); + if (addrinfo) + { res = *addrinfo; + memcpy(&soap->peer, addrinfo->ai_addr, addrinfo->ai_addrlen); + soap->peerlen = addrinfo->ai_addrlen; + res.ai_addr = (struct sockaddr*)&soap->peer; + res.ai_addrlen = soap->peerlen; + freeaddrinfo(addrinfo); + } + if (err || !addrinfo) + { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol); +#else +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0); + else +#endif + soap->master = (int)socket(AF_INET, SOCK_STREAM, 0); +#endif + soap->errmode = 0; + if (!soap_valid_socket(soap->master)) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + soap->socket = soap->master; +#endif +#ifdef SOCKET_CLOSE_ON_EXEC +#ifdef WIN32 +#ifndef UNDER_CE + SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0); +#endif +#else + fcntl(soap->master, F_SETFD, 1); +#endif +#endif +#ifndef WITH_LEAN + if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif +#endif +#ifdef WITH_IPV6 +#ifdef IPV6_V6ONLY + if (setsockopt(soap->master, level, IPV6_V6ONLY, (char*)&unset, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->master); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif + soap->errmode = 0; + if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen)) + { soap->errnum = soap_socket_errno(soap->master); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); + soap_closesock(soap); + soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#else + soap->peerlen = sizeof(soap->peer); + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->peer.sin_family = AF_INET; + soap->errmode = 2; + if (host) + { if (soap->fresolve(soap, host, &soap->peer.sin_addr)) + { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } + else + soap->peer.sin_addr.s_addr = htonl(INADDR_ANY); + soap->peer.sin_port = htons((short)port); + soap->errmode = 0; + if (bind(soap->master, (struct sockaddr*)&soap->peer, (int)soap->peerlen)) + { soap->errnum = soap_socket_errno(soap->master); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); + soap_closesock(soap); + soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +#endif + if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog)) + { soap->errnum = soap_socket_errno(soap->master); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n")); + soap_closesock(soap); + soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + return soap->master; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_poll(struct soap *soap) +{ +#ifndef WITH_LEAN + struct timeval timeout; + fd_set rfd, sfd, xfd; + register int r; +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + return SOAP_FD_EXCEEDED; /* Hint: MUST increase FD_SETSIZE */ +#endif + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_ZERO(&xfd); + if (soap_valid_socket(soap->socket)) + { FD_SET(soap->socket, &rfd); + FD_SET(soap->socket, &sfd); + FD_SET(soap->socket, &xfd); + r = select((int)soap->socket + 1, &rfd, &sfd, &xfd, &timeout); + if (r > 0 && FD_ISSET(soap->socket, &xfd)) + r = -1; + } + else if (soap_valid_socket(soap->master)) + { FD_SET(soap->master, &sfd); + r = select((int)soap->master + 1, NULL, &sfd, NULL, &timeout); + } + else + return SOAP_OK; + if (r > 0) + { +#ifdef WITH_OPENSSL + if (soap->imode & SOAP_ENC_SSL) + { + if (soap_valid_socket(soap->socket) + && FD_ISSET(soap->socket, &sfd) + && (!FD_ISSET(soap->socket, &rfd) + || SSL_peek(soap->ssl, soap->tmpbuf, 1) > 0)) + return SOAP_OK; + } + else +#endif + if (soap_valid_socket(soap->socket) + && FD_ISSET(soap->socket, &sfd) + && (!FD_ISSET(soap->socket, &rfd) + || recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) > 0)) + return SOAP_OK; + } + else if (r < 0) + { soap->errnum = soap_socket_errno(soap->master); + if ((soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno(soap->master) != SOAP_EINTR) + { soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); + return soap->error = SOAP_TCP_ERROR; + } + } + else + soap->errnum = 0; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Polling: other end down on socket=%d select=%d\n", soap->socket, r)); + return SOAP_EOF; +#else + return SOAP_OK; +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static SOAP_SOCKET +tcp_accept(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n) +{ SOAP_SOCKET fd; + fd = accept(s, a, (SOAP_SOCKLEN_T*)n); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ +#ifdef SOCKET_CLOSE_ON_EXEC +#ifdef WIN32 +#ifndef UNDER_CE + SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0); +#endif +#else + fcntl(fd, F_SETFD, FD_CLOEXEC); +#endif +#endif + return fd; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +SOAP_FMAC1 +SOAP_SOCKET +SOAP_FMAC2 +soap_accept(struct soap *soap) +{ int n = (int)sizeof(soap->peer); +#ifndef WITH_LEAN + int len = SOAP_BUFLEN; + int set = 1; +#endif + soap->error = SOAP_OK; +#ifndef WITH_LEAN + if ((soap->omode & SOAP_IO_UDP)) + return soap->socket = soap->master; +#endif + memset((void*)&soap->peer, 0, sizeof(soap->peer)); + soap->socket = SOAP_INVALID_SOCKET; + soap->errmode = 0; + soap->keep_alive = 0; + if (soap_valid_socket(soap->master)) + { register int err; + for (;;) + { +#ifndef WITH_LEAN + if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) + { +#ifndef WIN32 + if ((int)soap->socket >= (int)FD_SETSIZE) + { soap->error = SOAP_FD_EXCEEDED; + return SOAP_INVALID_SOCKET; /* Hint: MUST increase FD_SETSIZE */ + } +#endif + for (;;) + { struct timeval timeout; + fd_set fd; + register int r; + if (soap->accept_timeout > 0) + { timeout.tv_sec = soap->accept_timeout; + timeout.tv_usec = 0; + } + else if (soap->accept_timeout < 0) + { timeout.tv_sec = -soap->accept_timeout/1000000; + timeout.tv_usec = -soap->accept_timeout%1000000; + } + else + { timeout.tv_sec = 60; + timeout.tv_usec = 0; + } + FD_ZERO(&fd); + FD_SET(soap->master, &fd); + r = select((int)soap->master + 1, &fd, &fd, &fd, &timeout); + if (r > 0) + break; + if (!r && soap->accept_timeout) + { soap->errnum = 0; + soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + if (r < 0) + { r = soap_socket_errno(soap->master); + if (r != SOAP_EINTR) + { soap->errnum = r; + soap_closesock(soap); + soap_set_sender_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } + } + } + } + if (soap->accept_timeout || soap->send_timeout || soap->recv_timeout) + SOAP_SOCKNONBLOCK(soap->master) + else + SOAP_SOCKBLOCK(soap->master) +#endif + soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&soap->peer, &n); + soap->peerlen = (size_t)n; + if (soap_valid_socket(soap->socket)) + { +#ifdef WITH_IPV6 +/* Use soap->host to store the numeric form of the remote host */ + getnameinfo((struct sockaddr*)&soap->peer, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d from %s\n", soap->socket, soap->host)); + soap->ip = 0; /* info stored in soap->peer and soap->host */ + soap->port = 0; /* info stored in soap->peer and soap->host */ +#else + soap->ip = ntohl(soap->peer.sin_addr.s_addr); + soap->port = (int)ntohs(soap->peer.sin_port); /* does not return port number on some systems */ + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d at port %d from IP %d.%d.%d.%d\n", soap->socket, soap->port, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF)); +#endif +#ifndef WITH_LEAN + if (soap->accept_flags == SO_LINGER) + { struct linger linger; + memset((void*)&linger, 0, sizeof(linger)); + linger.l_onoff = 1; + linger.l_linger = soap->linger_time; + if (setsockopt(soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + } + else if (soap->accept_flags && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + if (setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } +#ifdef TCP_NODELAY + if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { soap->errnum = soap_socket_errno(soap->socket); + soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } +#endif +#endif + soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); + return soap->socket; + } + err = soap_socket_errno(soap->socket); + if (err != 0 && err != SOAP_EINTR && err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept failed from %s\n", soap->host)); + soap->errnum = err; + soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); + soap_closesock(soap); + return SOAP_INVALID_SOCKET; + } + } + } + else + { soap->errnum = 0; + soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); + return SOAP_INVALID_SOCKET; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_disconnect(struct soap *soap) +{ +#ifdef WITH_OPENSSL + if (soap->ssl) + { int r, s = 0; + if (soap->session) + { SSL_SESSION_free(soap->session); + soap->session = NULL; + } + if (*soap->host) + { soap->session = SSL_get1_session(soap->ssl); + if (soap->session) + { strcpy(soap->session_host, soap->host); + soap->session_port = soap->port; + } + } + r = SSL_shutdown(soap->ssl); + if (r == 0) + { if (soap_valid_socket(soap->socket)) + { struct timeval timeout; + fd_set fd; + if (soap->fshutdownsocket(soap, soap->socket, 1)) + { /* + wait up to 10 seconds for close_notify to be sent by peer (if peer not + present, this avoids calling SSL_shutdown() which has a lengthy return + timeout) + */ +#ifndef WIN32 + if ((int)soap->socket < (int)FD_SETSIZE) + { +#endif + timeout.tv_sec = 10; + timeout.tv_usec = 0; + FD_ZERO(&fd); + FD_SET(soap->socket, &fd); + r = select((int)soap->socket + 1, &fd, NULL, &fd, &timeout); + if (r <= 0 && soap_socket_errno(soap->socket) != SOAP_EINTR) + { soap->errnum = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); + soap->fclosesocket(soap, soap->socket); + soap->socket = SOAP_INVALID_SOCKET; + ERR_remove_state(0); + return SOAP_OK; + } +#ifndef WIN32 + } +#endif + } + } + r = SSL_shutdown(soap->ssl); + } + if (r != 1) + { s = ERR_get_error(); + if (s) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r))); + if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) + { soap->fclosesocket(soap, soap->socket); + soap->socket = SOAP_INVALID_SOCKET; + } + } + } + SSL_free(soap->ssl); + soap->ssl = NULL; + if (s) + return SOAP_SSL_ERROR; + ERR_remove_state(0); + } +#endif + if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) + { soap->fshutdownsocket(soap, soap->socket, 2); + soap->fclosesocket(soap, soap->socket); + soap->socket = SOAP_INVALID_SOCKET; + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_closesocket(struct soap *soap, SOAP_SOCKET fd) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket %d\n", (int)fd)); + return soap_closesocket(fd); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static int +tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket %d how=%d\n", (int)fd, how)); + return shutdown(fd, how); +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_closesock(struct soap *soap) +{ register int status = soap->error; + if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) + { if (soap->fclose && (soap->error = soap->fclose(soap))) + return soap->error; + soap->keep_alive = 0; + } +#ifdef WITH_ZLIB + if (soap->zlib_state == SOAP_ZLIB_DEFLATE) + deflateEnd(soap->d_stream); + else if (soap->zlib_state == SOAP_ZLIB_INFLATE) + inflateEnd(soap->d_stream); + soap->zlib_state = SOAP_ZLIB_NONE; +#endif + return soap->error = status; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +size_t +SOAP_FMAC2 +soap_hash(register const char *s) +{ register size_t h = 0; + while (*s) + h = 65599*h + *s++; + return h % SOAP_IDHASH; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_init_pht(struct soap *soap) +{ register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n")); + soap->pblk = NULL; + soap->pidx = 0; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->pht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new1(soap_mode mode) +{ return soap_new2(mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new() +{ return soap_new2(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_new2(soap_mode imode, soap_mode omode) +{ struct soap *soap = (struct soap*)malloc(sizeof(struct soap)); + if (soap) + soap_init2(soap, imode, omode); + return soap; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_free(struct soap *soap) +{ soap_done(soap); + free(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_del(struct soap *soap) +{ free(soap); +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_free_pht(struct soap *soap) +{ register struct soap_pblk *pb, *next; + register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n")); + for (pb = soap->pblk; pb; pb = next) + { next = pb->next; + SOAP_FREE(soap, pb); + } + soap->pblk = NULL; + soap->pidx = 0; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->pht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type) +{ register int i; + struct soap_plist *pp; + if (soap->version != 1) + soap->encoding = 1; + if (a) + i = soap_array_pointer_lookup(soap, p, a, n, type, &pp); + else + i = soap_pointer_lookup(soap, p, type, &pp); + if (i) + { if (soap_is_embedded(soap, pp) + || soap_is_single(soap, pp)) + return 0; + soap_set_embedded(soap, pp); + } + return i; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) +{ register struct soap_plist *pp; + *ppp = NULL; + if (p) + { for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next) + { if (pp->ptr == p && pp->type == type) + { *ppp = pp; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id)); + return pp->id; + } + } + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type)); + return 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp) +{ register size_t h; + register struct soap_plist *pp; + if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) + { register struct soap_pblk *pb = (struct soap_pblk*)SOAP_MALLOC(soap, sizeof(struct soap_pblk)); + if (!pb) + { soap->error = SOAP_EOM; + return 0; + } + pb->next = soap->pblk; + soap->pblk = pb; + soap->pidx = 0; + } + *ppp = pp = &soap->pblk->plist[soap->pidx++]; + if (a) + h = soap_hash_ptr(a->__ptr); + else + h = soap_hash_ptr(p); + 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)); + pp->next = soap->pht[h]; + pp->type = type; + pp->mark1 = 0; + pp->mark2 = 0; + pp->ptr = p; + pp->array = a; + soap->pht[h] = pp; + pp->id = ++soap->idnum; + return pp->id; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp) +{ register struct soap_plist *pp; + *ppp = NULL; + if (!p || !a->__ptr) + return 0; + for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next) + { if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr) + { register int i; + for (i = 0; i < n; i++) + if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i]) + break; + if (i == n) + { *ppp = pp; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id)); + return pp->id; + } + } + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type)); + return 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_begin_count(struct soap *soap) +{ soap_free_ns(soap); +#ifndef WITH_LEANER + if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME)) + soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME; + else +#endif + { soap->mode = soap->omode; + if ((soap->mode & SOAP_IO) == SOAP_IO_STORE + || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) +#ifndef WITH_LEANER + && !soap->fpreparesend +#endif + )) + soap->mode &= ~SOAP_IO_LENGTH; + else + soap->mode |= SOAP_IO_LENGTH; + } +#ifdef WITH_ZLIB + if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) + { if (!(soap->mode & SOAP_ENC_DIME)) + soap->mode &= ~SOAP_IO_LENGTH; + if (soap->mode & SOAP_ENC_XML) + soap->mode |= SOAP_IO_BUFFER; + else + soap->mode |= SOAP_IO_STORE; + } +#endif + if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) + soap->mode |= SOAP_XML_TREE; +#ifndef WITH_LEANER + if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) + soap->mode |= SOAP_ENC_MIME; + else + soap->mode &= ~SOAP_ENC_MTOM; + if (soap->mode & SOAP_ENC_MIME) + soap_select_mime_boundary(soap); + soap->dime.list = soap->dime.last; /* keep track of last DIME attachment */ +#endif + soap->count = 0; + soap->ns = 0; + soap->null = 0; + soap->position = 0; + soap->mustUnderstand = 0; + soap->encoding = 0; + soap->part = SOAP_BEGIN; + soap->idnum = 0; + soap_clr_attr(soap); + soap_set_local_namespaces(soap); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); +#ifndef WITH_LEANER + soap->dime.count = 0; /* count # of attachments */ + soap->dime.size = 0; /* accumulate total size of attachments */ + if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE) + return soap->error = soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_end_count(struct soap *soap) +{ +#ifndef WITH_LEANER + if (soap->fpreparefinal) + return soap->error = soap->fpreparefinal(soap); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_begin_send(struct soap *soap) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output\n")); + soap_free_ns(soap); + soap->error = SOAP_OK; + soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); +#ifdef WITH_ZLIB + if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) + { if (soap->mode & SOAP_ENC_XML) + soap->mode |= SOAP_IO_BUFFER; + else + soap->mode |= SOAP_IO_STORE; + } +#endif +#ifndef WITH_LEAN + if ((soap->mode & SOAP_IO_UDP)) + { soap->mode |= SOAP_ENC_XML; + if (soap->count > SOAP_BUFLEN) + return soap->error = SOAP_UDP_ERROR; + } +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) + { if (soap->count || (soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_XML)) + soap->mode |= SOAP_IO_BUFFER; + else + soap->mode |= SOAP_IO_STORE; + } + soap->mode &= ~SOAP_IO_LENGTH; + if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) + if (soap_new_block(soap) == NULL) + return soap->error; + if (!(soap->mode & SOAP_IO_KEEPALIVE)) + soap->keep_alive = 0; + if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) + soap->mode |= SOAP_XML_TREE; +#ifndef WITH_LEANER + if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) + { soap->mode |= SOAP_ENC_MIME; + soap->mode &= ~SOAP_ENC_DIME; + } + else + soap->mode &= ~SOAP_ENC_MTOM; + if (soap->mode & SOAP_ENC_MIME) + soap_select_mime_boundary(soap); +#ifdef WIN32 +#ifndef UNDER_CE +#ifndef WITH_FASTCGI + if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ + _setmode(soap->sendfd, _O_BINARY); +#endif +#endif +#endif +#endif + if (soap->mode & SOAP_IO) + { soap->bufidx = 0; + soap->buflen = 0; + } + soap->chunksize = 0; + soap->ns = 0; + soap->null = 0; + soap->position = 0; + soap->mustUnderstand = 0; + soap->encoding = 0; + soap->idnum = 0; + soap->level = 0; + soap_clr_attr(soap); + soap_set_local_namespaces(soap); +#ifdef WITH_ZLIB + soap->z_ratio_out = 1.0; + if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE) + { if (!soap->z_buf) + soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); + soap->d_stream->next_out = (Byte*)soap->z_buf; + soap->d_stream->avail_out = SOAP_BUFLEN; +#ifdef WITH_GZIP + if (soap->zlib_out != SOAP_ZLIB_DEFLATE) + { memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10); + soap->d_stream->next_out = (Byte*)soap->z_buf + 10; + soap->d_stream->avail_out = SOAP_BUFLEN - 10; + soap->z_crc = crc32(0L, NULL, 0); + soap->zlib_out = SOAP_ZLIB_GZIP; + if (deflateInit2(soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + } + else +#endif + if (deflateInit(soap->d_stream, soap->z_level) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n")); + soap->zlib_state = SOAP_ZLIB_DEFLATE; + } +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + ERR_clear_error(); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=0x%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count)); + soap->part = SOAP_BEGIN; +#ifndef WITH_LEANER + if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE) + soap->fprepareinit(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_embedded(struct soap *soap, const void *p, int t) +{ struct soap_plist *pp; + if (soap_pointer_lookup(soap, p, t, &pp)) + { pp->mark1 = 1; + pp->mark2 = 1; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t)); + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_reference(struct soap *soap, const void *p, int t) +{ struct soap_plist *pp; + if (!p || (soap->mode & SOAP_XML_TREE)) + return 1; + if (soap_pointer_lookup(soap, p, t, &pp)) + { if (pp->mark1 == 0) + { pp->mark1 = 2; + pp->mark2 = 2; + } + } + else if (soap_pointer_enter(soap, p, NULL, 0, t, &pp)) + { pp->mark1 = 0; + pp->mark2 = 0; + } + else + return 1; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2)); + return pp->mark1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t) +{ register int i; + struct soap_plist *pp; + if (!p || !a->__ptr) + return 1; + i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); + if (i) + { if (pp->mark1 == 0) + { pp->mark1 = 2; + pp->mark2 = 2; + } + } + else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) + return 1; + else + { pp->mark1 = 0; + pp->mark2 = 0; + } + 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)); + return pp->mark1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_embedded_id(struct soap *soap, int id, const void *p, int t) +{ struct soap_plist *pp = NULL; + if (soap->mode & SOAP_XML_TREE) + return id; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); + if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) + { if (id < 0) + { id = soap_pointer_lookup(soap, p, t, &pp); + if (id) + { if (soap->mode & SOAP_IO_LENGTH) + pp->mark1 = 2; + else + pp->mark2 = 2; + 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)); + } + return -1; + } + return id; + } + if (id < 0) + id = soap_pointer_lookup(soap, p, t, &pp); + else if (id && !soap_pointer_lookup(soap, p, t, &pp)) + return 0; + if (id && pp) + { if (soap->mode & SOAP_IO_LENGTH) + pp->mark1 = 1; + else + pp->mark2 = 1; + 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)); + } + return id; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_is_embedded(struct soap *soap, struct soap_plist *pp) +{ if (!pp) + return 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2)); + if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER) + { if (soap->mode & SOAP_IO_LENGTH) + return pp->mark1 != 0; + return pp->mark2 != 0; + } + if (soap->mode & SOAP_IO_LENGTH) + return pp->mark1 == 1; + return pp->mark2 == 1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_is_single(struct soap *soap, struct soap_plist *pp) +{ if (soap->part == SOAP_IN_HEADER) + return 1; + if (!pp) + return 0; + if (soap->mode & SOAP_IO_LENGTH) + return pp->mark1 == 0; + return pp->mark2 == 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_embedded(struct soap *soap, struct soap_plist *pp) +{ if (!pp) + return; + if (soap->mode & SOAP_IO_LENGTH) + pp->mark1 = 1; + else + pp->mark2 = 1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +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) +{ +#ifndef WITH_NOIDREF + struct soap_plist *pp; + int i; + if (!p || !a->__ptr || (!aid && !atype)) + return soap_element_id(soap, tag, id, p, a, n, type, t); + 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)); + i = soap_array_pointer_lookup(soap, p, a, n, t, &pp); + if (!i) + { i = soap_pointer_enter(soap, p, a, n, t, &pp); + if (!i) + { soap->error = SOAP_EOM; + return -1; + } + } + if (id <= 0) + id = i; + if (!aid) + { sprintf(soap->tmpbuf, soap->dime_id_format, id); + aid = soap_strdup(soap, soap->tmpbuf); + } + /* Add MTOM xop:Include element when necessary */ + /* TODO: this code to be obsoleted with new import/xop.h conventions */ + if ((soap->mode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) + { if (soap_element_begin_out(soap, tag, 0, type) + || soap_element_href(soap, "xop:Include", 0, "href", aid) + || soap_element_end_out(soap, tag)) + return soap->error; + } + else if (soap_element_href(soap, tag, 0, "href", aid)) + return soap->error; + if (soap->mode & SOAP_IO_LENGTH) + { if (pp->mark1 != 3) + { struct soap_multipart *content; + if (soap->mode & SOAP_ENC_MTOM) + content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, (char*)a->__ptr, a->__size); + else + content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size); + if (!content) + { soap->error = SOAP_EOM; + return -1; + } + if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ + { if (soap->mode & SOAP_ENC_MTOM) + { char *s = (char*)soap_malloc(soap, strlen(aid) - 1); + if (s) + { *s = '<'; + strcpy(s + 1, aid + 4); + strcat(s, ">"); + content->id = s; + } + } + else + content->id = aid + 4; + } + else + content->id = aid; + content->type = atype; + content->options = aoptions; + content->encoding = SOAP_MIME_BINARY; + pp->mark1 = 3; + } + } + else + pp->mark2 = 3; +#endif + return -1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_init_iht(struct soap *soap) +{ register int i; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing ID hashtable\n")); + for (i = 0; i < SOAP_IDHASH; i++) + soap->iht[i] = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_1 +static void +soap_free_iht(struct soap *soap) +{ register int i; + register struct soap_ilist *ip = NULL, *p = NULL; + register struct soap_flist *fp = NULL, *fq = NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n")); + for (i = 0; i < SOAP_IDHASH; i++) + { for (ip = soap->iht[i]; ip; ip = p) + { for (fp = ip->flist; fp; fp = fq) + { fq = fp->next; + SOAP_FREE(soap, fp); + } + p = ip->next; + SOAP_FREE(soap, ip); + } + soap->iht[i] = NULL; + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +struct soap_ilist * +SOAP_FMAC2 +soap_lookup(struct soap *soap, const char *id) +{ register struct soap_ilist *ip = NULL; + for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next) + if (!strcmp(ip->id, id)) + return ip; + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +struct soap_ilist * +SOAP_FMAC2 +soap_enter(struct soap *soap, const char *id) +{ register size_t h; + register struct soap_ilist *ip; + ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + strlen(id)); + if (ip) + { h = soap_hash(id); + strcpy(ip->id, id); + ip->next = soap->iht[h]; + soap->iht[h] = ip; + } + return ip; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_malloc(struct soap *soap, size_t n) +{ register char *p; + if (!n) + return (void*)SOAP_NON_NULL; + if (!soap) + return SOAP_MALLOC(soap, n); + if (soap->fmalloc) + p = (char*)soap->fmalloc(soap, n); + else + { n += sizeof(short); + n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ + if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)))) + { soap->error = SOAP_EOM; + return NULL; + } + /* set the canary to detect corruption */ + *(short*)(p + n - sizeof(short)) = (short)SOAP_CANARY; + /* keep chain of alloced cells for destruction */ + *(void**)(p + n) = soap->alist; + *(size_t*)(p + n + sizeof(void*)) = n; + soap->alist = p + n; + } + soap->alloced = 1; + return p; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +static void +soap_init_mht(struct soap *soap) +{ register int i; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + soap->mht[i] = NULL; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +static void +soap_free_mht(struct soap *soap) +{ register int i; + register struct soap_mlist *mp, *mq; + for (i = 0; i < (int)SOAP_PTRHASH; i++) + { for (mp = soap->mht[i]; mp; mp = mq) + { mq = mp->next; + if (mp->live) + fprintf(stderr, "%s(%d): malloc() = %p not freed (memory leak or forgot to call soap_end()?)\n", mp->file, mp->line, mp->ptr); + free(mp); + } + soap->mht[i] = NULL; + } +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_track_malloc(struct soap *soap, const char *file, int line, size_t size) +{ register void *p = malloc(size); + if (soap) + { register size_t h = soap_hash_ptr(p); + register struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): malloc(%lu) = %p\n", file, line, (unsigned long)size, p)); + mp->next = soap->mht[h]; + mp->ptr = p; + mp->file = file; + mp->line = line; + mp->live = 1; + soap->mht[h] = mp; + } + return p; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_track_free(struct soap *soap, const char *file, int line, void *p) +{ register size_t h = soap_hash_ptr(p); + register struct soap_mlist *mp; + for (mp = soap->mht[h]; mp; mp = mp->next) + if (mp->ptr == p) + break; + if (mp) + { if (mp->live) + { free(p); + if (soap->fdebug[SOAP_INDEX_TEST]) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); + } + mp->live = 0; + } + else + fprintf(stderr, "%s(%d): free(%p) double free of pointer malloced at %s(%d)\n", file, line, p, mp->file, mp->line); + } + else + fprintf(stderr, "%s(%d): free(%p) pointer not malloced\n", file, line, p); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_MEM_DEBUG +static void +soap_track_unlink(struct soap *soap, const void *p) +{ register size_t h = soap_hash_ptr(p); + register struct soap_mlist *mp; + for (mp = soap->mht[h]; mp; mp = mp->next) + if (mp->ptr == p) + break; + if (mp) + mp->live = 0; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_dealloc(struct soap *soap, void *p) +{ if (soap_check_state(soap)) + return; + if (p) + { register char **q; + for (q = (char**)&soap->alist; *q; q = *(char***)q) + { + if (*(short*)(char*)(*q - sizeof(short)) != (short)SOAP_CANARY) + { +#ifdef SOAP_MEM_DEBUG + fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); + DBGHEX(TEST, *q - 200, 200); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); + soap->error = SOAP_MOE; + return; + } + if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) + { *q = **(char***)q; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p)); + SOAP_FREE(soap, p); + return; + } + } + soap_delete(soap, p); + } + else + { register char *q; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); + while (soap->alist) + { q = (char*)soap->alist; + if (*(short*)(char*)(q - sizeof(short)) != (short)SOAP_CANARY) + { +#ifdef SOAP_MEM_DEBUG + fprintf(stderr, "Data corruption in dynamic allocation (see logs)\n"); +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Data corruption:\n")); + DBGHEX(TEST, q - 200, 200); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); + soap->error = SOAP_MOE; + return; + } + soap->alist = *(void**)q; + q -= *(size_t*)(q + sizeof(void*)); + SOAP_FREE(soap, q); + } + /* we must assume these were deallocated: */ + soap->action = NULL; + soap->fault = NULL; + soap->header = NULL; + soap->userid = NULL; + soap->passwd = NULL; + soap->authrealm = NULL; + soap->http_content = NULL; +#ifndef WITH_LEANER + soap_clr_mime(soap); +#endif + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_delete(struct soap *soap, void *p) +{ register struct soap_clist **cp; + if (soap_check_state(soap)) + return; + cp = &soap->clist; + if (p) + { while (*cp) + { if (p == (*cp)->ptr) + { register struct soap_clist *q = *cp; + *cp = q->next; + if (q->fdelete(q)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); +#ifdef SOAP_MEM_DEBUG + fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); +#endif + } + SOAP_FREE(soap, q); + return; + } + cp = &(*cp)->next; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p)); + } + else + { while (*cp) + { register struct soap_clist *q = *cp; + *cp = q->next; + if (q->fdelete(q)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: deletion callback failed for object type %d\n", q->ptr, q->type)); +#ifdef SOAP_MEM_DEBUG + fprintf(stderr, "new(object type = %d) = %p not freed: deletion callback failed\n", q->type, q->ptr); +#endif + } + SOAP_FREE(soap, q); + } + } + soap->fault = NULL; /* this was possibly deallocated */ + soap->header = NULL; /* this was possibly deallocated */ +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +struct soap_clist * +SOAP_FMAC2 +soap_link(struct soap *soap, void *p, int t, int n, int (*fdelete)(struct soap_clist*)) +{ register struct soap_clist *cp; + if ((cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)))) + { cp->next = soap->clist; + cp->type = t; + cp->size = n; + cp->ptr = p; + cp->fdelete = fdelete; + soap->clist = cp; + } + return cp; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_unlink(struct soap *soap, const void *p) +{ register char **q; + register struct soap_clist **cp; + if (!soap || !p) + return; + for (q = (char**)&soap->alist; *q; q = *(char***)q) + { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*)))) + { *q = **(char***)q; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p)); +#ifdef SOAP_MEM_DEBUG + soap_track_unlink(soap, p); +#endif + return; + } + } + for (cp = &soap->clist; *cp; cp = &(*cp)->next) + { if (p == (*cp)->ptr) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p)); + q = (char**)*cp; + *cp = (*cp)->next; + SOAP_FREE(soap, q); + return; + } + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_lookup_type(struct soap *soap, const char *id) +{ register struct soap_ilist *ip; + if (id && *id) + { ip = soap_lookup(soap, id); + if (ip) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type)); + return ip->type; + } + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id)); + return 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k) +{ struct soap_ilist *ip; + void **q; + if (!p || !id || !*id) + return p; + ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ + if (!ip) + { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */ + return NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n)); + ip->type = t; + ip->size = n; + ip->link = p; + ip->copy = NULL; + ip->flist = NULL; + ip->ptr = NULL; + ip->level = k; + *p = NULL; + } + else if (ip->ptr) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes)\n", id, t, ip->ptr, (unsigned int)n)); + if (ip->type != t) + { strcpy(soap->id, id); + soap->error = SOAP_HREF; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: href='%s' id-type=%d href-type=%d\n", id, ip->type, t)); + return NULL; + } + while (ip->level < k) + { q = (void**)soap_malloc(soap, sizeof(void*)); + if (!q) + return NULL; + *p = (void*)q; + p = q; + k--; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); + } + *p = ip->ptr; + } + else if (ip->level > k) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id)); + while (ip->level > k) + { void *s, **r = &ip->link; + q = (void**)ip->link; + while (q) + { *r = (void*)soap_malloc(soap, sizeof(void*)); + if (!*r) + return NULL; + s = *q; + *q = *r; + r = (void**)*r; + q = (void**)s; + } + *r = NULL; + ip->size = n; + ip->copy = NULL; + ip->level = ip->level - 1; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); + } + q = (void**)ip->link; + ip->link = p; + *p = (void*)q; + } + else + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes)\n", id, t, p, (unsigned int)n)); + while (ip->level < k) + { q = (void**)soap_malloc(soap, sizeof(void*)); + if (!q) + return NULL; + *p = q; + p = q; + k--; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n")); + } + q = (void**)ip->link; + ip->link = p; + *p = (void*)q; + } + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIDREF +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +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)) +{ struct soap_ilist *ip; + if (!p || !href || !*href) + return p; + ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */ + if (!ip) + { if (!(ip = soap_enter(soap, href))) /* new hash table entry for string id */ + return NULL; + ip->type = st; + ip->size = n; + ip->link = NULL; + ip->copy = NULL; + ip->ptr = NULL; + ip->level = 0; + ip->flist = NULL; + 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)); + } + else if (ip->type != st || (ip->level == k && ip->size != n)) + { 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)); + strcpy(soap->id, href); + soap->error = SOAP_HREF; + return NULL; + } + if (fcopy || n < sizeof(void*) || *href != '#') + { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); + if (!fp) + { soap->error = SOAP_EOM; + return NULL; + } + fp->next = ip->flist; + fp->type = tt; + fp->ptr = p; + fp->level = k; + fp->len = len; + if (fcopy) + fp->fcopy = fcopy; + else + fp->fcopy = soap_fcopy; + ip->flist = fp; + 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)); + } + else + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, st, href)); + *(void**)p = ip->copy; + ip->copy = p; + } + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void* +SOAP_FMAC2 +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*)) +{ +#ifndef WITH_NOIDREF + struct soap_ilist *ip; +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k)); + soap->alloced = 0; + if (!p) + { if (finstantiate) + p = finstantiate(soap, t, type, arrayType, &n); + else + p = soap_malloc(soap, n); + if (p) + soap->alloced = 1; + } +#ifndef WITH_NOIDREF + if (!id || !*id) +#endif + return p; +#ifndef WITH_NOIDREF + ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p)); + if (!ip) + { if (!(ip = soap_enter(soap, id))) /* new hash table entry for string id */ + return NULL; + ip->type = t; + ip->link = NULL; + ip->copy = NULL; + ip->flist = NULL; + ip->size = n; + ip->ptr = p; + ip->level = k; + 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)); + } + else if ((ip->type != t || (ip->level == k && ip->size != n)) && (ip->copy || ip->flist)) + { 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)); + strcpy(soap->id, id); + soap->error = SOAP_HREF; + return NULL; + } + else if (ip->ptr) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); + strcpy(soap->id, id); + soap->error = SOAP_DUPLICATE_ID; + return NULL; + } + else + { ip->size = n; + ip->ptr = p; + ip->level = k; + 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)); + } + return ip->ptr; +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_fcopy(struct soap *soap, int st, int tt, void *p, size_t len, const void *q, size_t n) +{ DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n)); + memcpy(p, q, n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_end_send(struct soap *soap) +{ +#ifndef WITH_LEANER + if (soap->dime.list) + { /* SOAP body referenced attachments must appear first */ + soap->dime.last->next = soap->dime.first; + soap->dime.first = soap->dime.list->next; + soap->dime.list->next = NULL; + soap->dime.last = soap->dime.list; + } + if (soap_putdime(soap) || soap_putmime(soap)) + return soap->error; + soap->mime.list = NULL; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->dime.list = NULL; + soap->dime.first = NULL; + soap->dime.last = NULL; +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send\n")); + if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */ + { if (soap_flush(soap)) +#ifdef WITH_ZLIB + { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE) + { soap->zlib_state = SOAP_ZLIB_NONE; + deflateEnd(soap->d_stream); + } + return soap->error; + } +#else + return soap->error; +#endif +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { int r; + soap->d_stream->avail_in = 0; + do + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n")); + r = deflate(soap->d_stream, Z_FINISH); + if (soap->d_stream->avail_out != SOAP_BUFLEN) + { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream->avail_out)) + { soap->zlib_state = SOAP_ZLIB_NONE; + deflateEnd(soap->d_stream); + return soap->error; + } + soap->d_stream->next_out = (Byte*)soap->z_buf; + soap->d_stream->avail_out = SOAP_BUFLEN; + } + } while (r == Z_OK); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated total %lu->%lu bytes\n", soap->d_stream->total_in, soap->d_stream->total_out)); + soap->z_ratio_out = (float)soap->d_stream->total_out / (float)soap->d_stream->total_in; + soap->mode &= ~SOAP_ENC_ZLIB; + soap->zlib_state = SOAP_ZLIB_NONE; + if (deflateEnd(soap->d_stream) != Z_OK || r != Z_STREAM_END) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS)); + return soap->error = SOAP_ZLIB_ERROR; + } +#ifdef WITH_GZIP + if (soap->zlib_out != SOAP_ZLIB_DEFLATE) + { soap->z_buf[0] = soap->z_crc & 0xFF; + soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF; + soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF; + soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF; + soap->z_buf[4] = soap->d_stream->total_in & 0xFF; + soap->z_buf[5] = (soap->d_stream->total_in >> 8) & 0xFF; + soap->z_buf[6] = (soap->d_stream->total_in >> 16) & 0xFF; + soap->z_buf[7] = (soap->d_stream->total_in >> 24) & 0xFF; + if (soap_flush_raw(soap, soap->z_buf, 8)) + return soap->error; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc)); + } +#endif + } +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) + { char *p; +#ifndef WITH_NOHTTP + if (!(soap->mode & SOAP_ENC_XML)) + { soap->mode--; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size)); + if (soap->status >= SOAP_POST) + soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size); + else if (soap->status != SOAP_STOP) + soap->error = soap->fresponse(soap, soap->status, soap->blist->size); + if (soap->error || soap_flush(soap)) + return soap->error; + soap->mode++; + } +#endif + for (p = soap_first_block(soap, NULL); p; p = soap_next_block(soap, NULL)) + { DBGMSG(SENT, p, soap_block_size(soap, NULL)); + if ((soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)))) + { soap_end_block(soap, NULL); + return soap->error; + } + } + soap_end_block(soap, NULL); + } +#ifndef WITH_LEANER + else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) + { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); + if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7))) + return soap->error; + } +#endif + } +#ifdef WITH_TCPFIN +#ifdef WITH_OPENSSL + if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) + soap->fshutdownsocket(soap, soap->socket, 1); /* Send TCP FIN */ +#else + if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) + soap->fshutdownsocket(soap, soap->socket, 1); /* Send TCP FIN */ +#endif +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); + soap->omode &= ~SOAP_XML_SEC; + soap->count = 0; + soap->part = SOAP_END; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_end_recv(struct soap *soap) +{ soap->part = SOAP_END; +#ifndef WITH_LEANER + if ((soap->mode & SOAP_ENC_DIME) && soap_getdime(soap)) + { soap->dime.first = NULL; + soap->dime.last = NULL; + return soap->error; + } + soap->dime.list = soap->dime.first; + soap->dime.first = NULL; + soap->dime.last = NULL; + /* Check if MIME attachments and mime-post-check flag is set, if set call soap_resolve() and return */ + if (soap->mode & SOAP_ENC_MIME) + { +#ifndef WITH_NOIDREF + if (soap->mode & SOAP_MIME_POSTCHECK) + { soap_resolve(soap); + return SOAP_OK; + } +#endif + if (soap_getmime(soap)) + return soap->error; + } + soap->mime.list = soap->mime.first; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->mime.boundary = NULL; + if (soap->xlist) + { struct soap_multipart *content; + for (content = soap->mime.list; content; content = content->next) + soap_resolve_attachment(soap, content); + } +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n")); +#ifdef WITH_ZLIB + if (soap->mode & SOAP_ENC_ZLIB) + { /* Make sure end of compressed content is reached */ + while (soap->d_stream->next_out != Z_NULL) + if ((int)soap_get1(soap) == EOF) + break; + soap->mode &= ~SOAP_ENC_ZLIB; + memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN); + soap->bufidx = (char*)soap->d_stream->next_in - soap->z_buf; + soap->buflen = soap->z_buflen; + soap->zlib_state = SOAP_ZLIB_NONE; + if (inflateEnd(soap->d_stream) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate end ok\n")); +#ifdef WITH_GZIP + if (soap->zlib_in == SOAP_ZLIB_GZIP) + { soap_wchar c; + short i; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Inflate gzip crc check\n")); + for (i = 0; i < 8; i++) + { if ((int)(c = soap_get1(soap)) == EOF) + return soap->error = SOAP_EOF; + soap->z_buf[i] = (char)c; + } + 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))) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc)); + return soap->error = SOAP_ZLIB_ERROR; + } + 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))) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: incorrect message length\n")); + return soap->error = SOAP_ZLIB_ERROR; + } + } + soap->zlib_in = SOAP_ZLIB_NONE; +#endif + } +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) + while ((int)soap_getchar(soap) != EOF) /* advance to last chunk */ + ; + if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap))) + return soap->error; +#ifndef WITH_NOIDREF + if (soap_resolve(soap)) + return soap->error; +#endif +#ifndef WITH_LEANER + if (soap->xlist) + { if (soap->mode & SOAP_ENC_MTOM) + return soap->error = SOAP_MIME_HREF; + return soap->error = SOAP_DIME_HREF; + } +#endif + soap_free_ns(soap); + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_free_temp(struct soap *soap) +{ register struct soap_attribute *tp, *tq; + register struct Namespace *ns; + soap_free_ns(soap); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n")); + while (soap->blist) + soap_end_block(soap, NULL); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute storage\n")); + for (tp = soap->attributes; tp; tp = tq) + { tq = tp->next; + if (tp->value) + SOAP_FREE(soap, tp->value); + SOAP_FREE(soap, tp); + } + soap->attributes = NULL; +#ifdef WITH_FAST + if (soap->labbuf) + SOAP_FREE(soap, soap->labbuf); + soap->labbuf = NULL; + soap->lablen = 0; + soap->labidx = 0; +#endif + ns = soap->local_namespaces; + if (ns) + { for (; ns->id; ns++) + { if (ns->out) + { if (soap->encodingStyle == ns->out) + soap->encodingStyle = SOAP_STR_EOS; + SOAP_FREE(soap, ns->out); + ns->out = NULL; + } + if (soap->encodingStyle == ns->ns) + soap->encodingStyle = SOAP_STR_EOS; + } + SOAP_FREE(soap, soap->local_namespaces); + soap->local_namespaces = NULL; + } +#ifndef WITH_LEANER + while (soap->xlist) + { struct soap_xlist *xp = soap->xlist->next; + SOAP_FREE(soap, soap->xlist); + soap->xlist = xp; + } +#endif +#ifndef WITH_NOIDREF + soap_free_pht(soap); + soap_free_iht(soap); +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static void +soap_free_ns(struct soap *soap) +{ register struct soap_nlist *np, *nq; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n")); + for (np = soap->nlist; np; np = nq) + { nq = np->next; + SOAP_FREE(soap, np); + } + soap->nlist = NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) +static void +soap_init_logs(struct soap *soap) +{ int i; + for (i = 0; i < SOAP_MAXLOGS; i++) + { soap->logfile[i] = NULL; + soap->fdebug[i] = NULL; + } +} +#endif +#endif + +/******************************************************************************/ +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_open_logfile(struct soap *soap, int i) +{ if (soap->logfile[i]) + soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a"); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +static void +soap_close_logfile(struct soap *soap, int i) +{ if (soap->fdebug[i]) + { fclose(soap->fdebug[i]); + soap->fdebug[i] = NULL; + } +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_close_logfiles(struct soap *soap) +{ int i; + for (i = 0; i < SOAP_MAXLOGS; i++) + soap_close_logfile(soap, i); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +static void +soap_set_logfile(struct soap *soap, int i, const char *logfile) +{ const char *s; + char *t = NULL; + soap_close_logfile(soap, i); + s = soap->logfile[i]; + soap->logfile[i] = logfile; + if (s) + SOAP_FREE(soap, (void*)s); + if (logfile) + if ((t = (char*)SOAP_MALLOC(soap, strlen(logfile) + 1))) + strcpy(t, logfile); + soap->logfile[i] = t; +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_recv_logfile(struct soap *soap, const char *logfile) +{ soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_sent_logfile(struct soap *soap, const char *logfile) +{ soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); +} +#endif + +/******************************************************************************/ +#ifdef SOAP_DEBUG +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_test_logfile(struct soap *soap, const char *logfile) +{ soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_copy(const struct soap *soap) +{ return soap_copy_context((struct soap*)malloc(sizeof(struct soap)), soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +struct soap* +SOAP_FMAC2 +soap_copy_context(struct soap *copy, const struct soap *soap) +{ if (soap_check_state(soap)) + return NULL; + if (copy) + { register struct soap_plugin *p = NULL; +#ifdef __cplusplus + *copy = *soap; +#else + memcpy(copy, soap, sizeof(struct soap)); +#endif + copy->state = SOAP_COPY; + copy->error = SOAP_OK; + copy->userid = NULL; + copy->passwd = NULL; + copy->nlist = NULL; + copy->blist = NULL; + copy->clist = NULL; + copy->alist = NULL; + copy->attributes = NULL; + copy->labbuf = NULL; + copy->lablen = 0; + copy->labidx = 0; +#ifdef SOAP_MEM_DEBUG + soap_init_mht(copy); +#endif +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) + soap_init_logs(copy); +#endif +#ifdef SOAP_DEBUG + soap_set_test_logfile(copy, soap->logfile[SOAP_INDEX_TEST]); + soap_set_sent_logfile(copy, soap->logfile[SOAP_INDEX_SENT]); + soap_set_recv_logfile(copy, soap->logfile[SOAP_INDEX_RECV]); +#endif +#ifdef WITH_C_LOCALE + copy->c_locale = duplocale(soap->c_locale); +#else + copy->c_locale = NULL; +#endif +#ifdef WITH_OPENSSL + copy->bio = NULL; + copy->ssl = NULL; +#endif +#ifdef WITH_ZLIB + copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); + copy->d_stream->zalloc = Z_NULL; + copy->d_stream->zfree = Z_NULL; + copy->d_stream->opaque = Z_NULL; + copy->z_buf = NULL; +#endif + copy->local_namespaces = NULL; +#ifndef WITH_NOIDREF + soap_init_iht(copy); + soap_init_pht(copy); +#endif + copy->header = NULL; + copy->fault = NULL; + copy->action = NULL; +#ifndef WITH_LEAN +#ifdef WITH_COOKIES + copy->cookies = soap_copy_cookies(copy, soap); +#else + copy->cookies = NULL; +#endif +#endif + copy->plugins = NULL; + for (p = soap->plugins; p; p = p->next) + { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); + if (!q) + return NULL; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); + *q = *p; + if (p->fcopy && p->fcopy(copy, q, p)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s'\n", p->id)); + SOAP_FREE(copy, q); + return NULL; + } + q->next = copy->plugins; + copy->plugins = q; + } + } + return copy; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_copy_stream(struct soap *copy, struct soap *soap) +{ copy->mode = soap->mode; + copy->imode = soap->imode; + copy->omode = soap->omode; + copy->socket = soap->socket; + copy->recv_timeout = soap->recv_timeout; + copy->send_timeout = soap->send_timeout; +#if defined(__cplusplus) && !defined(WITH_LEAN) + copy->os = soap->os; + copy->is = soap->is; +#endif + copy->sendfd = soap->sendfd; + copy->recvfd = soap->recvfd; + copy->bufidx = soap->bufidx; + copy->buflen = soap->buflen; + copy->ahead = soap->ahead; + copy->cdata = soap->cdata; + copy->chunksize = soap->chunksize; + copy->chunkbuflen = soap->chunkbuflen; + copy->keep_alive = soap->keep_alive; + copy->tcp_keep_alive = soap->tcp_keep_alive; + copy->tcp_keep_idle = soap->tcp_keep_idle; + copy->tcp_keep_intvl = soap->tcp_keep_intvl; + copy->tcp_keep_cnt = soap->tcp_keep_cnt; + copy->max_keep_alive = soap->max_keep_alive; +#ifndef WITH_NOIO + copy->peer = soap->peer; + copy->peerlen = soap->peerlen; +#endif +#ifdef WITH_OPENSSL + copy->bio = soap->bio; + copy->ssl = soap->ssl; + copy->ctx = soap->ctx; +#endif +#ifdef WITH_ZLIB + copy->zlib_state = soap->zlib_state; + copy->zlib_in = soap->zlib_in; + copy->zlib_out = soap->zlib_out; + copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); + memcpy(copy->d_stream, soap->d_stream, sizeof(z_stream)); + copy->z_crc = soap->z_crc; + copy->z_ratio_in = soap->z_ratio_in; + copy->z_ratio_out = soap->z_ratio_out; + copy->z_buf = NULL; + copy->z_buflen = soap->z_buflen; + copy->z_level = soap->z_level; + if (soap->z_buf && soap->zlib_state != SOAP_ZLIB_NONE) + { copy->z_buf = (char*)SOAP_MALLOC(copy, SOAP_BUFLEN); + memcpy(copy->z_buf, soap->z_buf, sizeof(soap->z_buf)); + } +#endif + memcpy(copy->buf, soap->buf, sizeof(soap->buf)); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init(struct soap *soap) +{ soap->state = SOAP_INIT; +#ifdef SOAP_MEM_DEBUG + soap_init_mht(soap); +#endif +#if !defined(WITH_LEAN) || defined(SOAP_DEBUG) + soap_init_logs(soap); +#endif +#ifdef SOAP_DEBUG + soap_set_test_logfile(soap, "TEST.log"); + soap_set_sent_logfile(soap, "SENT.log"); + soap_set_recv_logfile(soap, "RECV.log"); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing context\n")); +#endif + soap->version = 0; + soap_imode(soap, SOAP_IO_DEFAULT); + soap_omode(soap, SOAP_IO_DEFAULT); + soap->plugins = NULL; + soap->user = NULL; + soap->userid = NULL; + soap->passwd = NULL; +#ifndef WITH_NOHTTP + soap->fpost = http_post; + soap->fget = http_get; + soap->fput = http_put; + soap->fdel = http_del; + soap->fhead = http_head; + soap->fform = NULL; + soap->fposthdr = http_post_header; + soap->fresponse = http_response; + soap->fparse = http_parse; + soap->fparsehdr = http_parse_header; +#endif + soap->fheader = NULL; + soap->fconnect = NULL; + soap->fdisconnect = NULL; +#ifndef WITH_NOIO + soap->ipv6_multicast_if = 0; + soap->ipv4_multicast_if = NULL; +#ifndef WITH_IPV6 + soap->fresolve = tcp_gethost; +#else + soap->fresolve = NULL; +#endif + soap->faccept = tcp_accept; + soap->fopen = tcp_connect; + soap->fclose = tcp_disconnect; + soap->fclosesocket = tcp_closesocket; + soap->fshutdownsocket = tcp_shutdownsocket; + soap->fsend = fsend; + soap->frecv = frecv; + soap->fpoll = soap_poll; +#else + soap->fopen = NULL; + soap->fclose = NULL; + soap->fpoll = NULL; +#endif + soap->fseterror = NULL; + soap->fignore = NULL; + soap->fserveloop = NULL; + soap->fplugin = fplugin; + soap->fmalloc = NULL; +#ifndef WITH_LEANER + soap->fprepareinit = NULL; + soap->fpreparesend = NULL; + soap->fpreparerecv = NULL; + soap->fpreparefinal = NULL; + soap->fdimereadopen = NULL; + soap->fdimewriteopen = NULL; + soap->fdimereadclose = NULL; + soap->fdimewriteclose = NULL; + soap->fdimeread = NULL; + soap->fdimewrite = NULL; + soap->fmimereadopen = NULL; + soap->fmimewriteopen = NULL; + soap->fmimereadclose = NULL; + soap->fmimewriteclose = NULL; + soap->fmimeread = NULL; + soap->fmimewrite = NULL; +#endif + soap->float_format = "%.9G"; /* Alternative: use "%G" */ + soap->double_format = "%.17lG"; /* Alternative: use "%lG" */ + soap->dime_id_format = "cid:id%d"; /* default DIME id format */ + soap->http_version = "1.1"; + soap->proxy_http_version = "1.0"; + soap->http_content = NULL; + soap->actor = NULL; + soap->lang = "en"; + soap->keep_alive = 0; + soap->tcp_keep_alive = 0; + soap->tcp_keep_idle = 0; + soap->tcp_keep_intvl = 0; + soap->tcp_keep_cnt = 0; + soap->max_keep_alive = SOAP_MAXKEEPALIVE; + soap->recv_timeout = 0; + soap->send_timeout = 0; + soap->connect_timeout = 0; + soap->accept_timeout = 0; + soap->socket_flags = 0; + soap->connect_flags = 0; + soap->bind_flags = 0; + soap->accept_flags = 0; + soap->linger_time = 0; + soap->ip = 0; + soap->labbuf = NULL; + soap->lablen = 0; + soap->labidx = 0; + soap->encodingStyle = SOAP_STR_EOS; +#ifndef WITH_NONAMESPACES + soap->namespaces = namespaces; +#else + soap->namespaces = NULL; +#endif + soap->local_namespaces = NULL; + soap->nlist = NULL; + soap->blist = NULL; + soap->clist = NULL; + soap->alist = NULL; + soap->attributes = NULL; + soap->header = NULL; + soap->fault = NULL; + soap->master = SOAP_INVALID_SOCKET; + soap->socket = SOAP_INVALID_SOCKET; + soap->os = NULL; + soap->is = NULL; +#ifndef WITH_LEANER + soap->dom = NULL; + soap->dime.list = NULL; + soap->dime.first = NULL; + soap->dime.last = NULL; + soap->mime.list = NULL; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->mime.boundary = NULL; + soap->mime.start = NULL; + soap->xlist = NULL; +#endif +#ifndef UNDER_CE + soap->recvfd = 0; + soap->sendfd = 1; +#else + soap->recvfd = stdin; + soap->sendfd = stdout; +#endif + soap->host[0] = '\0'; + soap->port = 0; + soap->action = NULL; + soap->proxy_host = NULL; + soap->proxy_port = 8080; + soap->proxy_userid = NULL; + soap->proxy_passwd = NULL; + soap->authrealm = NULL; + soap->prolog = NULL; +#ifdef WITH_ZLIB + soap->zlib_state = SOAP_ZLIB_NONE; + soap->zlib_in = SOAP_ZLIB_NONE; + soap->zlib_out = SOAP_ZLIB_NONE; + soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); + soap->d_stream->zalloc = Z_NULL; + soap->d_stream->zfree = Z_NULL; + soap->d_stream->opaque = Z_NULL; + soap->z_buf = NULL; + soap->z_level = 6; +#endif +#ifndef WITH_LEAN + soap->c14ninclude = NULL; + soap->c14nexclude = NULL; + soap->cookies = NULL; + soap->cookie_domain = NULL; + soap->cookie_path = NULL; + soap->cookie_max = 32; +#endif +#ifdef WMW_RPM_IO + soap->rpmreqid = NULL; +#endif +#ifdef PALM + palmNetLibOpen(); +#endif +#ifndef WITH_NOIDREF + soap_init_iht(soap); + soap_init_pht(soap); +#endif +#ifdef WITH_OPENSSL + if (!soap_ssl_init_done) + { soap_ssl_init(); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing OpenSSL, version=%ld\n", (long)OPENSSL_VERSION_NUMBER)); + } + soap->fsslauth = ssl_auth_init; + soap->fsslverify = ssl_verify_callback; + soap->bio = NULL; + soap->ssl = NULL; + soap->ctx = NULL; + soap->ssl_flags = SOAP_SSL_DEFAULT; + soap->keyfile = NULL; + soap->password = NULL; + soap->dhfile = NULL; + soap->cafile = NULL; + soap->capath = NULL; + soap->crlfile = NULL; + soap->randfile = NULL; + soap->session = NULL; +#endif +#ifdef WITH_C_LOCALE + soap->c_locale = newlocale(LC_ALL_MASK, "C", NULL); +#else + soap->c_locale = NULL; +#endif + soap_begin(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init1(struct soap *soap, soap_mode mode) +{ soap_init2(soap, mode, mode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_init2(struct soap *soap, soap_mode imode, soap_mode omode) +{ soap_init(soap); + soap_imode(soap, imode); + soap_omode(soap, omode); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_begin(struct soap *soap) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reinitializing context\n")); + if (!soap->keep_alive) + { soap->buflen = 0; + soap->bufidx = 0; + } + soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); + soap->null = 0; + soap->position = 0; + soap->encoding = 0; + soap->mustUnderstand = 0; + soap->mode = 0; + soap->ns = 0; + soap->part = SOAP_END; + soap->alloced = 0; + soap->count = 0; + soap->length = 0; + soap->cdata = 0; + soap->error = SOAP_OK; + soap->peeked = 0; + soap->ahead = 0; + soap->idnum = 0; + soap->level = 0; + soap->endpoint[0] = '\0'; +#ifndef WITH_LEANER + soap->dime.chunksize = 0; + soap->dime.buflen = 0; +#endif + soap_free_temp(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_end(struct soap *soap) +{ if (soap_check_state(soap)) + return; + soap_free_temp(soap); + soap_dealloc(soap, NULL); + while (soap->clist) + { register struct soap_clist *cp = soap->clist->next; + SOAP_FREE(soap, soap->clist); + soap->clist = cp; + } + soap_closesock(soap); +#ifdef SOAP_DEBUG + soap_close_logfiles(soap); +#endif +#ifdef PALM + palmNetLibClose(); +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_namespaces(struct soap *soap, const struct Namespace *p) +{ register struct Namespace *ns = soap->local_namespaces; + register struct soap_nlist *np, *nq, *nr; + register unsigned int level = soap->level; + soap->namespaces = p; + soap->local_namespaces = NULL; + soap_set_local_namespaces(soap); + /* reverse the namespace list */ + np = soap->nlist; + soap->nlist = NULL; + if (np) + { nq = np->next; + np->next = NULL; + while (nq) + { nr = nq->next; + nq->next = np; + np = nq; + nq = nr; + } + } + /* then push on new stack */ + while (np) + { register const char *s; + soap->level = np->level; /* preserve element nesting level */ + s = np->ns; + if (!s && np->index >= 0 && ns) + { s = ns[np->index].out; + if (!s) + s = ns[np->index].ns; + } + if (s && soap_push_namespace(soap, np->id, s)) + return soap->error; + nq = np; + np = np->next; + SOAP_FREE(soap, nq); + } + if (ns) + { register int i; + for (i = 0; ns[i].id; i++) + { if (ns[i].out) + { SOAP_FREE(soap, ns[i].out); + ns[i].out = NULL; + } + } + SOAP_FREE(soap, ns); + } + soap->level = level; /* restore level */ + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_local_namespaces(struct soap *soap) +{ if (soap->namespaces && !soap->local_namespaces) + { register const struct Namespace *ns1; + register struct Namespace *ns2; + register size_t n = 1; + for (ns1 = soap->namespaces; ns1->id; ns1++) + n++; + n *= sizeof(struct Namespace); + ns2 = (struct Namespace*)SOAP_MALLOC(soap, n); + if (ns2) + { memcpy(ns2, soap->namespaces, n); + if (ns2[0].ns) + { if (!strcmp(ns2[0].ns, soap_env1)) + soap->version = 1; + else + soap->version = 2; + } + soap->local_namespaces = ns2; + } + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef PALM_1 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_strsearch(const char *big, const char *little) +{ register size_t n = strlen(little); + register const char *s = big; + while (s) + { if (!strncmp(s, little, n) && (s[n] == '\0' || s[n] == ' ')) + return s; + s = strchr(s, ' '); + if (s) + s++; + } + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef PALM_1 +SOAP_FMAC1 +struct soap_nlist * +SOAP_FMAC2 +soap_lookup_ns(struct soap *soap, const char *tag, size_t n) +{ register struct soap_nlist *np; + for (np = soap->nlist; np; np = np->next) + { if (!strncmp(np->id, tag, n) && !np->id[n]) + return np; + } + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static struct soap_nlist * +soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized) +{ register struct soap_nlist *np; + size_t n, k; + if (soap_strsearch(soap->c14nexclude, id)) + return NULL; + if (!utilized) + { for (np = soap->nlist; np; np = np->next) + { if (!strcmp(np->id, id) && (!np->ns || !strcmp(np->ns, ns))) + break; + } + if (np) + { if ((np->level < soap->level || !np->ns) && np->index == 1) + utilized = 1; + else + return NULL; + } + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", soap->level, id, ns?ns:"(null)", utilized)); + n = strlen(id); + if (ns) + k = strlen(ns); + else + k = 0; + np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k + 1); + if (!np) + { soap->error = SOAP_EOM; + return NULL; + } + np->next = soap->nlist; + soap->nlist = np; + strcpy(np->id, id); + if (ns) + { np->ns = np->id + n + 1; + strcpy(np->ns, ns); + } + else + np->ns = NULL; + np->level = soap->level; + np->index = utilized; + return np; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static void +soap_utilize_ns(struct soap *soap, const char *tag, size_t n) +{ register struct soap_nlist *np = soap_lookup_ns(soap, tag, n); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s'\n", tag)); + if (np) + { if (np->index == 0) + soap_push_ns(soap, np->id, np->ns, 1); + } + else if (strncmp(tag, "xml", 3)) + { strncpy(soap->tmpbuf, tag, n); + soap->tmpbuf[n] = '\0'; + soap_push_ns(soap, soap->tmpbuf, NULL, 1); + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static void +soap_pop_ns(struct soap *soap) +{ soap_pop_namespace(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element(struct soap *soap, const char *tag, int id, const char *type) +{ +#ifdef WITH_XMLNS + register const char *s; +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:SOAP_STR_EOS)); +#ifdef WITH_DOM + if (soap->part == SOAP_BEGIN_SECURITY && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) + { register struct soap_nlist *np; + /* wsu:Id found: clear xmlns renderings, so re-emit them for exc-c14n */ + for (np = soap->nlist; np; np = np->next) + { if (np->index == 2) + np->index = 0; + } + } + if (soap->mode & SOAP_XML_DOM) + { register struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); + if (!elt) + return soap->error; + elt->soap = soap; + elt->next = NULL; + elt->prnt = soap->dom; + elt->name = soap_strdup(soap, tag); + elt->elts = NULL; + elt->atts = NULL; + elt->nstr = NULL; + elt->data = NULL; + elt->wide = NULL; + elt->node = NULL; + elt->type = 0; + elt->head = NULL; + elt->tail = NULL; + if (soap->dom) + { struct soap_dom_element *p = soap->dom->elts; + if (p) + { while (p->next) + p = p->next; + p->next = elt; + } + else + soap->dom->elts = elt; + } + soap->dom = elt; + } + else + { +#endif + soap->level++; +#ifndef WITH_LEAN + if (!soap->ns) + { if (!(soap->mode & SOAP_XML_CANONICAL) + && soap_send(soap, NULL))/* TODO KMD to avoid the put of xml tag in the soap messages */ + return soap->error; + } + else if (soap->mode & SOAP_XML_INDENT) + { if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) + return soap->error; + soap->body = 1; + } +#endif +#ifdef WITH_XMLNS + s = strchr(tag, ':'); + if (s && strncmp(tag, "SOAP-ENV", s - tag)) + { struct Namespace *ns = soap->local_namespaces; + size_t n = s - tag; + if (soap_send_raw(soap, "<", 1) + || soap_send(soap, s + 1)) + return soap->error; + if (soap->nlist && !strncmp(soap->nlist->id, tag, n) && !soap->nlist->id[n]) + ns = NULL; + for (; ns && ns->id; ns++) + { if (*ns->id && (ns->out || ns->ns) && !strncmp(ns->id, tag, n) && !ns->id[n]) + { soap_push_ns(soap, ns->id, ns->out ? ns->out : ns->ns, 0); + if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) + return soap->error; + break; + } + } + } + else +#endif + if (soap_send_raw(soap, "<", 1) + || soap_send(soap, tag)) + return soap->error; +#ifdef WITH_DOM + } +#endif + if (!soap->ns) + { struct Namespace *ns; + for (ns = soap->local_namespaces; ns && ns->id; ns++) + { if (*ns->id && (ns->out || ns->ns)) + { sprintf(soap->tmpbuf, "xmlns:%s", ns->id); + if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns)) + return soap->error; + } + } + } + soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */ +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { const char *t = strchr(tag, ':'); + if (t) + soap_utilize_ns(soap, tag, t - tag); + } +#endif + if (id > 0) + { sprintf(soap->tmpbuf, "_%d", id); + if (soap_attribute(soap, "id", soap->tmpbuf)) + return soap->error; + } + if (type && *type && (!(soap->mode & SOAP_XML_SEC) || soap->part == SOAP_IN_BODY)) + { if (soap_attribute(soap, "xsi:type", type)) + return soap->error; +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { const char *t = strchr(type, ':'); + if (t) + soap_utilize_ns(soap, type, t - type); + } +#endif + } + if (soap->null && soap->position > 0) + { register int i; + sprintf(soap->tmpbuf, "[%d", soap->positions[0]); + for (i = 1; i < soap->position; i++) + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]); + strcat(soap->tmpbuf, "]"); + if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf)) + return soap->error; + } + if (soap->mustUnderstand) + { if (soap->actor && *soap->actor) + { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor)) + return soap->error; + } + if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1")) + return soap->error; + soap->mustUnderstand = 0; + } + if (soap->encoding) + { if (soap->encodingStyle && soap->local_namespaces) + { if (!*soap->encodingStyle) + { if (soap->local_namespaces[1].out) + soap->encodingStyle = soap->local_namespaces[1].out; + else + soap->encodingStyle = soap->local_namespaces[1].ns; + } + if (soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) + return soap->error; + } + soap->encoding = 0; + } + soap->null = 0; + soap->position = 0; + if (soap->part == SOAP_BEGIN_SECURITY && (soap->mode & SOAP_XML_CANONICAL)) + soap->part = SOAP_IN_SECURITY; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) +{ if (*tag == '-') + return SOAP_OK; + if (soap_element(soap, tag, id, type)) + return soap->error; + return soap_element_start_end_out(soap, NULL); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +#ifndef HAVE_STRRCHR +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_strrchr(const char *s, int t) +{ register char *r = NULL; + while (*s) + if (*s++ == t) + r = (char*)s - 1; + return r; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +#ifndef HAVE_STRTOL +SOAP_FMAC1 +long +SOAP_FMAC2 +soap_strtol(const char *s, char **t, int b) +{ register long n = 0; + register int c; + while (*s > 0 && *s <= 32) + s++; + if (b == 10) + { short neg = 0; + if (*s == '-') + { s++; + neg = 1; + } + else if (*s == '+') + s++; + while ((c = *s) && c >= '0' && c <= '9') + { if (n >= 214748364 && (n > 214748364 || c >= '8')) + break; + n *= 10; + n += c - '0'; + s++; + } + if (neg) + n = -n; + } + else /* b == 16 and value is always positive */ + { while ((c = *s)) + { if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'F') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + c -= 'a' - 10; + if (n > 0x07FFFFFF) + break; + n <<= 4; + n += c; + s++; + } + } + if (t) + *t = (char*)s; + return n; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +#ifndef HAVE_STRTOUL +SOAP_FMAC1 +unsigned long +SOAP_FMAC2 +soap_strtoul(const char *s, char **t, int b) +{ unsigned long n = 0; + register int c; + while (*s > 0 && *s <= 32) + s++; + if (b == 10) + { if (*s == '+') + s++; + while ((c = *s) && c >= '0' && c <= '9') + { if (n >= 429496729 && (n > 429496729 || c >= '6')) + break; + n *= 10; + n += c - '0'; + s++; + } + } + else /* b == 16 */ + { while ((c = *s)) + { if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'F') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + c -= 'a' - 10; + if (n > 0x0FFFFFFF) + break; + n <<= 4; + n += c; + s++; + } + } + if (t) + *t = (char*)s; + return n; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset) +{ if (!type || !*type) + return soap_element_begin_out(soap, tag, id, NULL); + if (soap_element(soap, tag, id, "SOAP-ENC:Array")) + return soap->error; + if (soap->version == 2) + { const char *s; + s = soap_strrchr(type, '['); + if ((size_t)(s - type) < sizeof(soap->tmpbuf)) + { strncpy(soap->tmpbuf, type, s - type); + soap->tmpbuf[s - type] = '\0'; + if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) + return soap->error; + if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1))) + return soap->error; + } + } + else + { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) + return soap->error; + if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) + return soap->error; + } +#ifndef WITH_LEAN + if ((soap->mode & SOAP_XML_CANONICAL)) + { const char *s = strchr(type, ':'); + if (s) + soap_utilize_ns(soap, type, s - type); + } +#endif + return soap_element_start_end_out(soap, NULL); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_start_end_out(struct soap *soap, const char *tag) +{ register struct soap_attribute *tp; +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { struct soap_nlist *np; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible && tp->name) + { const char *s = strchr(tp->name, ':'); + if (s) + soap_utilize_ns(soap, tp->name, s - tp->name); + } + } + for (np = soap->nlist; np; np = np->next) + { if (np->index == 1 && np->ns) + { sprintf(soap->tmpbuf, "xmlns:%s", np->id); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s'\n", np->level, soap->tmpbuf, np->ns)); + soap_set_attr(soap, soap->tmpbuf, np->ns); + np->index = 2; + } + } + } +#endif +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { register struct soap_dom_attribute **att; + att = &soap->dom->atts; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!*att) + return soap->error; + (*att)->next = NULL; + (*att)->nstr = NULL; + (*att)->name = soap_strdup(soap, tp->name); + (*att)->data = soap_strdup(soap, tp->value); + (*att)->wide = NULL; + (*att)->soap = soap; + att = &(*att)->next; + tp->visible = 0; + } + } + return SOAP_OK; + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { +#ifdef WITH_XMLNS + const char *s = strchr(tp->name, ':'); + if (s) + { size_t n = s - tp->name; + if (soap->nlist && !strncmp(soap->nlist->id, tp->name, n) && !soap->nlist->id[n]) + s++; + else + s = tp->name; + if (soap_send(soap, " ") || soap_send(soap, s)) + return soap->error; + } + else +#endif + if (soap_send(soap, " ") || soap_send(soap, tp->name)) + return soap->error; + if (tp->visible == 2 && tp->value) + if (soap_send_raw(soap, "=\"", 2) + || soap_string_out(soap, tp->value, 1) + || soap_send_raw(soap, "\"", 1)) + return soap->error; + tp->visible = 0; + } + } + if (tag) + { +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { if (soap_send_raw(soap, ">", 1) + || soap_element_end_out(soap, tag)) + return soap->error; + return SOAP_OK; + } +#endif + soap->level--; /* decrement level just before /> */ + if (soap_send_raw(soap, "/>", 2)) + return soap->error; + return SOAP_OK; + } + return soap_send_raw(soap, ">", 1); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_end_out(struct soap *soap, const char *tag) +{ if (*tag == '-') + return SOAP_OK; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag)); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (soap->dom->prnt) + soap->dom = soap->dom->prnt; + return SOAP_OK; + } +#endif +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + soap_pop_ns(soap); + if (soap->mode & SOAP_XML_INDENT) + { if (!soap->body) + { if (soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1)) + return soap->error; + } + soap->body = 0; + } +#endif +#ifdef WITH_XMLNS + { const char *s = strchr(tag, ':'); + if (s && strncmp(tag, "SOAP-ENV", s - tag)) + { soap_pop_ns(soap); + tag = s + 1; + } + } +#endif + if (soap_send_raw(soap, "error; + soap->level--; /* decrement level just before > */ + return soap_send_raw(soap, ">", 1); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_ref(struct soap *soap, const char *tag, int id, int href) +{ register int n = 0; + const char *s = "href"; + if (soap->version == 2) + { s = "SOAP-ENC:ref"; + n = 1; + } + sprintf(soap->href, "#_%d", href); + return soap_element_href(soap, tag, id, s, soap->href + n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val) +{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val)); + if (soap_element(soap, tag, id, NULL) + || soap_attribute(soap, ref, val) + || soap_element_start_end_out(soap, tag)) + return soap->error; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_null(struct soap *soap, const char *tag, int id, const char *type) +{ struct soap_attribute *tp; + for (tp = soap->attributes; tp; tp = tp->next) + if (tp->visible) + break; + if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL)) + { if (soap_element(soap, tag, id, type)) + return soap->error; + if (!tp && soap_attribute(soap, "xsi:nil", "true")) + return soap->error; + return soap_element_start_end_out(soap, tag); + } + soap->null = 1; + soap->position = 0; + soap->mustUnderstand = 0; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +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) +{ if (!p) + { soap_element_null(soap, tag, id, type); + return -1; + } +#ifndef WITH_NOIDREF + if (soap->mode & SOAP_XML_TREE) + return 0; + if (id < 0) + { struct soap_plist *pp; + if (a) + id = soap_array_pointer_lookup(soap, p, a, n, t, &pp); + else + id = soap_pointer_lookup(soap, p, t, &pp); + if (id) + { if (soap_is_embedded(soap, pp)) + { soap_element_ref(soap, tag, 0, id); + return -1; + } + if (soap_is_single(soap, pp)) + return 0; + soap_set_embedded(soap, pp); + } + } + return id; +#else + return 0; +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_result(struct soap *soap, const char *tag) +{ if (soap->version == 2 && soap->encodingStyle) + { if (soap_element(soap, "SOAP-RPC:result", 0, NULL) + || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc) + || soap_element_start_end_out(soap, NULL) + || soap_string_out(soap, tag, 0) + || soap_element_end_out(soap, "SOAP-RPC:result")) + return soap->error; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_check_result(struct soap *soap, const char *tag) +{ if (soap->version == 2 && soap->encodingStyle) + { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1); + /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_attribute(struct soap *soap, const char *name, const char *value) +{ + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attribute '%s'='%s'\n", name, value)); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && !(soap->mode & SOAP_XML_CANONICAL) && soap->dom) + { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!a) + return soap->error; + a->next = soap->dom->atts; + a->nstr = NULL; + a->name = soap_strdup(soap, name); + a->data = soap_strdup(soap, value); + a->wide = NULL; + a->soap = soap; + soap->dom->atts = a; + return SOAP_OK; + } +#endif +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { /* TODO: consider using this code to handle default namespace bindings + if (!strncmp(name, "xmlns", 5) && (name[5] == ':' || name[5] == '\0')) + { if (name[5] == ':') + soap_push_ns(soap, name + 6, value, 0); + else + soap_push_ns(soap, "", value, 0); + } + */ + if (!strncmp(name, "xmlns:", 6)) + soap_push_ns(soap, name + 6, value, 0); + else if (soap_set_attr(soap, name, value)) + return soap->error; + } + else +#endif + { if (soap_send(soap, " ") || soap_send(soap, name)) + return soap->error; + if (value) + if (soap_send_raw(soap, "=\"", 2) + || soap_string_out(soap, value, 1) + || soap_send_raw(soap, "\"", 1)) + return soap->error; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_begin_in(struct soap *soap, const char *tag, int nillable, const char *type) +{ if (!soap_peek_element(soap)) + { if (soap->other) + return soap->error = SOAP_TAG_MISMATCH; + if (tag && *tag == '-') + return SOAP_OK; + if (!(soap->error = soap_match_tag(soap, soap->tag, tag))) + { soap->peeked = 0; + if (type && *soap->type && soap_match_tag(soap, soap->type, type)) + return soap->error = SOAP_TYPE; + if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) + return soap->error = SOAP_NULL; + if (soap->body) + soap->level++; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:SOAP_STR_EOS )); + } + } + else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') + soap->error = SOAP_OK; + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_element_end_in(struct soap *soap, const char *tag) +{ register soap_wchar c; + register char *s; + register int n = 0; + if (tag && *tag == '-') + return SOAP_OK; + if (soap->error == SOAP_NO_TAG) + soap->error = SOAP_OK; +#ifdef WITH_DOM + /* this whitespace or mixed content is not insignificant for DOM */ + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (!soap->peeked && !soap_string_in(soap, 3, -1, -1)) + return soap->error; + if (soap->dom->prnt) + soap->dom = soap->dom->prnt; + } +#endif + if (soap->peeked) + { if (*soap->tag) + n++; + soap->peeked = 0; + } + do + { while (((c = soap_get(soap)) != SOAP_TT)) + { if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (c == SOAP_LT) + n++; + else if (c == '/') + { c = soap_get(soap); + if (c == SOAP_GT) + n--; + else + soap_unget(soap, c); + } + } + } while (n--); + s = soap->tag; + n = sizeof(soap->tag); + while (soap_notblank(c = soap_get(soap))) + { if (--n > 0) + *s++ = (char)c; + } + *s = '\0'; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + while (soap_blank(c)) + c = soap_get(soap); + if (c != SOAP_GT) + return soap->error = SOAP_SYNTAX_ERROR; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:SOAP_STR_EOS)); +#ifndef WITH_LEAN + if (tag && (soap->mode & SOAP_XML_STRICT)) + { soap_pop_namespace(soap); + if (soap_match_tag(soap, soap->tag, tag)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag name does not match\n")); + return soap->error = SOAP_SYNTAX_ERROR; + } + } +#endif + soap->level--; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_attr_value(struct soap *soap, const char *name, int flag) +{ register struct soap_attribute *tp; + if (*name == '-') + return SOAP_STR_EOS; + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible && !soap_match_tag(soap, tp->name, name)) + break; + } + if (tp) + { if (flag == 2 && (soap->mode & SOAP_XML_STRICT)) + soap->error = SOAP_PROHIBITED; + else + return tp->value; + } + else if (flag == 1 && (soap->mode & SOAP_XML_STRICT)) + soap->error = SOAP_REQUIRED; + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_attr(struct soap *soap, const char *name, const char *value) +{ register struct soap_attribute *tp; + if (*name == '-') + return SOAP_OK; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:SOAP_STR_EOS)); + for (tp = soap->attributes; tp; tp = tp->next) + { if (!strcmp(tp->name, name)) + break; + } + if (!tp) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); + if (!(tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(name)))) + return soap->error = SOAP_EOM; + tp->ns = NULL; +#ifndef WITH_LEAN + if (soap->mode & SOAP_XML_CANONICAL) + { struct soap_attribute **tpp = &soap->attributes; + const char *s = strchr(name, ':'); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inserting attribute %s for c14n\n", name)) + if (!strncmp(name, "xmlns", 5)) + { for (; *tpp; tpp = &(*tpp)->next) + if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0) + break; + } + else if (!s) + { for (; *tpp; tpp = &(*tpp)->next) + if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0)) + break; + } + else + { int k; + for (; *tpp; tpp = &(*tpp)->next) + { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name]) + { if (!tp->ns) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p (%s)\n", name, (*tpp)->ns, (*tpp)->ns)); + tp->ns = (*tpp)->ns; + } + } + else if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0))) + break; + } + } + tp->next = *tpp; + *tpp = tp; + } + else +#endif + { tp->next = soap->attributes; + soap->attributes = tp; + } + strcpy(tp->name, name); + tp->value = NULL; + } + else if (tp->visible) + { return SOAP_OK; + } + else if (value && tp->value && tp->size <= strlen(value)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value)); + SOAP_FREE(soap, tp->value); + tp->value = NULL; + tp->ns = NULL; + } + if (value) + { if (!tp->value) + { tp->size = strlen(value) + 1; + if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) + return soap->error = SOAP_EOM; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, tp->value)); + } + strcpy(tp->value, value); + if (!strncmp(tp->name, "xmlns:", 6)) + tp->ns = tp->value; + tp->visible = 2; +#ifndef WITH_LEAN + if (!strcmp(name, "wsu:Id")) + { soap->part = SOAP_BEGIN_SECURITY; + strncpy(soap->id, value, sizeof(soap->id)); + soap->id[sizeof(soap->id)-1] = '\0'; + } +#endif + } + else + tp->visible = 1; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_clr_attr(struct soap *soap) +{ register struct soap_attribute *tp; +#ifndef WITH_LEAN + if ((soap->mode & SOAP_XML_CANONICAL)) + { while (soap->attributes) + { tp = soap->attributes->next; + if (soap->attributes->value) + SOAP_FREE(soap, soap->attributes->value); + SOAP_FREE(soap, soap->attributes); + soap->attributes = tp; + } + } + else +#endif + { for (tp = soap->attributes; tp; tp = tp->next) + tp->visible = 0; + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d) +{ register size_t i; + for (i = 0; i < n; i++) + { register soap_wchar c = soap_get(soap); + switch (c) + { + case SOAP_TT: + *s++ = '<'; + soap_unget(soap, '/'); + break; + case SOAP_LT: + *s++ = '<'; + break; + case SOAP_GT: + if (d == ' ') + { soap_unget(soap, c); + *s = '\0'; + return SOAP_OK; + } + *s++ = '>'; + break; + case SOAP_QT: + if (c == d) + { *s = '\0'; + return SOAP_OK; + } + *s++ = '"'; + break; + case SOAP_AP: + if (c == d) + { *s = '\0'; + return SOAP_OK; + } + *s++ = '\''; + break; + case '\t': + case '\n': + case '\r': + case ' ': + case '/': + if (d == ' ') + { soap_unget(soap, c); + *s = '\0'; + return SOAP_OK; + } + default: + if ((int)c == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + } + return soap->error = SOAP_EOM; +} +#endif + +/******************************************************************************/ +#ifdef WITH_FAST +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_store_lab(struct soap *soap, const char *s, size_t n) +{ soap->labidx = 0; + return soap_append_lab(soap, s, n); +} +#endif +#endif + +/******************************************************************************/ +#ifdef WITH_FAST +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_append_lab(struct soap *soap, const char *s, size_t n) +{ if (soap->labidx + n >= soap->lablen) + { register char *t = soap->labbuf; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, old size=%lu", (unsigned long)soap->lablen)); + if (soap->lablen == 0) + soap->lablen = SOAP_LABLEN; + while (soap->labidx + n >= soap->lablen) + soap->lablen <<= 1; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen)); + soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); + if (!soap->labbuf) + { if (t) + SOAP_FREE(soap, t); + return soap->error = SOAP_EOM; + } + if (t) + { memcpy(soap->labbuf, t, soap->labidx); + SOAP_FREE(soap, t); + } + } + if (s) + { memcpy(soap->labbuf + soap->labidx, s, n); + soap->labidx += n; + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_peek_element(struct soap *soap) +{ +#ifdef WITH_DOM + register struct soap_dom_attribute **att = NULL; + register char *lead = NULL; +#endif + register struct soap_attribute *tp, *tq = NULL; + const char *t; + register char *s; + register soap_wchar c; + register int i; + if (soap->peeked) + { if (!*soap->tag) + return soap->error = SOAP_NO_TAG; + return SOAP_OK; + } + soap->peeked = 1; + soap->id[0] = '\0'; + soap->href[0] = '\0'; + soap->type[0] = '\0'; + soap->arrayType[0] = '\0'; + soap->arraySize[0] = '\0'; + soap->arrayOffset[0] = '\0'; + soap->other = 0; + soap->root = -1; + soap->position = 0; + soap->null = 0; + soap->mustUnderstand = 0; + c = soap_getutf8(soap); +#ifdef WITH_DOM + /* whitespace leading to start tag is not insignificant for DOM */ + if (soap_blank(c)) + { soap->labidx = 0; + do + { if (soap_append_lab(soap, NULL, 0)) + return SOAP_EOM; + s = soap->labbuf + soap->labidx; + i = soap->lablen - soap->labidx; + soap->labidx = soap->lablen; + while (soap_blank(c) && i--) + { *s++ = c; + c = soap_getutf8(soap); + } + } + while (soap_blank(c)); + *s = '\0'; + lead = soap_strdup(soap, soap->labbuf); + } +#else + while (soap_blank(c)) + c = soap_getutf8(soap); +#endif + if (c != SOAP_LT) + { *soap->tag = '\0'; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifdef WITH_DOM + /* whitespace leading to end tag is not insignificant for DOM */ + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->tail = soap_strdup(soap, lead); +#endif + return soap->error = SOAP_NO_TAG; + } + s = soap->tag; + do c = soap_get1(soap); + while (soap_blank(c)); + i = sizeof(soap->tag); + while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) + { if (--i > 0) + *s++ = (char)c; + c = soap_get1(soap); + } + while (soap_blank(c)) + c = soap_get1(soap); + *s = '\0'; +#ifdef WITH_DOM + if (soap->mode & SOAP_XML_DOM) + { register struct soap_dom_element *elt; + elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); + if (!elt) + return soap->error; + elt->next = NULL; + elt->nstr = NULL; + elt->name = soap_strdup(soap, soap->tag); + elt->prnt = soap->dom; + elt->elts = NULL; + elt->atts = NULL; + elt->data = NULL; + elt->wide = NULL; + elt->type = 0; + elt->node = NULL; + elt->head = lead; + elt->tail = NULL; + elt->soap = soap; + if (soap->dom) + { struct soap_dom_element *p = soap->dom->elts; + if (p) + { while (p->next) + p = p->next; + p->next = elt; + } + else + soap->dom->elts = elt; + } + soap->dom = elt; + att = &elt->atts; + } +#endif + soap_pop_namespace(soap); + for (tp = soap->attributes; tp; tp = tp->next) + tp->visible = 0; + while ((int)c != EOF && c != '>' && c != '/') + { s = soap->tmpbuf; + i = sizeof(soap->tmpbuf); + while (c != '=' && c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF) + { if (--i > 0) + *s++ = (char)c; + c = soap_get1(soap); + } + *s = '\0'; + if (i == sizeof(soap->tmpbuf)) + return soap->error = SOAP_SYNTAX_ERROR; +#ifdef WITH_DOM + /* add attribute name to dom */ + if (att) + { *att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); + if (!*att) + return soap->error; + (*att)->next = NULL; + (*att)->nstr = NULL; + (*att)->name = soap_strdup(soap, soap->tmpbuf); + (*att)->data = NULL; + (*att)->wide = NULL; + (*att)->soap = soap; + } +#endif + if (!strncmp(soap->tmpbuf, "xmlns", 5)) + { if (soap->tmpbuf[5] == ':') + t = soap->tmpbuf + 6; + else if (soap->tmpbuf[5]) + t = NULL; + else + t = SOAP_STR_EOS; + } + else + t = NULL; + tq = NULL; + for (tp = soap->attributes; tp; tq = tp, tp = tp->next) + { if (!SOAP_STRCMP(tp->name, soap->tmpbuf)) + break; + } + if (!tp) + { tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + strlen(soap->tmpbuf)); + if (!tp) + return soap->error = SOAP_EOM; + strcpy(tp->name, soap->tmpbuf); + tp->value = NULL; + tp->size = 0; + /* if attribute name is qualified, append it to the end of the list */ + if (tq && strchr(soap->tmpbuf, ':')) + { tq->next = tp; + tp->next = NULL; + } + else + { tp->next = soap->attributes; + soap->attributes = tp; + } + } + while (soap_blank(c)) + c = soap_get1(soap); + if (c == '=') + { do c = soap_getutf8(soap); + while (soap_blank(c)); + if (c != SOAP_QT && c != SOAP_AP) + { soap_unget(soap, c); + c = ' '; /* blank delimiter */ + } + if (soap_getattrval(soap, tp->value, tp->size, c)) + { +#ifdef WITH_FAST + if (soap->error != SOAP_EOM) + return soap->error; + soap->error = SOAP_OK; + if (soap_store_lab(soap, tp->value, tp->size)) + return soap->error; + if (tp->value) + SOAP_FREE(soap, tp->value); + for (;;) + { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c)) + { if (soap->error != SOAP_EOM) + return soap->error; + soap->error = SOAP_OK; + soap->labidx = soap->lablen; + if (soap_append_lab(soap, NULL, 0)) + return soap->error; + } + else + break; + } + if (soap->labidx) + tp->size = soap->lablen; + else + { tp->size = strlen(soap->labbuf) + 1; + if (tp->size < SOAP_LABLEN) + tp->size = SOAP_LABLEN; + } + if (!(tp->value = (char*)SOAP_MALLOC(soap, tp->size))) + return soap->error = SOAP_EOM; + strcpy(tp->value, soap->labbuf); +#else + size_t n; + if (soap->error != SOAP_EOM) + return soap->error; + soap->error = SOAP_OK; + if (soap_new_block(soap) == NULL) + return soap->error; + for (;;) + { if (!(s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN))) + return soap->error; + if (soap_getattrval(soap, s, SOAP_BLKLEN, c)) + { if (soap->error != SOAP_EOM) + return soap->error; + soap->error = SOAP_OK; + } + else + break; + } + n = tp->size + soap->blist->size; + if (!(s = (char*)SOAP_MALLOC(soap, n))) + return soap->error = SOAP_EOM; + if (tp->value) + { memcpy(s, tp->value, tp->size); + SOAP_FREE(soap, tp->value); + } + soap_save_block(soap, NULL, s + tp->size, 0); + tp->value = s; + tp->size = n; +#endif + } + do c = soap_get1(soap); + while (soap_blank(c)); + tp->visible = 2; /* seen this attribute w/ value */ +#ifdef WITH_DOM + if (att) + (*att)->data = soap_strdup(soap, tp->value); +#endif + } + else + tp->visible = 1; /* seen this attribute w/o value */ +#ifdef WITH_DOM + if (att) + att = &(*att)->next; +#endif + if (t && tp->value) + { if (soap_push_namespace(soap, t, tp->value)) + return soap->error; + } + } +#ifdef WITH_DOM + if (att) + { soap->dom->nstr = soap_current_namespace(soap, soap->tag); + for (att = &soap->dom->atts; *att; att = &(*att)->next) + (*att)->nstr = soap_current_namespace(soap, (*att)->name); + } +#endif + if ((int)c == EOF) + return soap->error = SOAP_EOF; + if (!(soap->body = (c != '/'))) + do c = soap_get1(soap); + while (soap_blank(c)); +#ifdef WITH_DOM + if (soap->mode & SOAP_XML_DOM) + { if (!soap->body && soap->dom->prnt) + soap->dom = soap->dom->prnt; + } +#endif + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible && tp->value) + { +#ifndef WITH_NOIDREF + if (!strcmp(tp->name, "id")) + { if ((soap->version > 0 && !(soap->mode & SOAP_XML_TREE)) + || (soap->mode & SOAP_XML_GRAPH)) + { *soap->id = '#'; + strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2); + soap->id[sizeof(soap->id)-1] = '\0'; + } + } + else if (!strcmp(tp->name, "href")) + { if (soap->version == 1 + || (soap->mode & SOAP_XML_GRAPH) + || (soap->mode & SOAP_ENC_MTOM) + || (soap->mode & SOAP_ENC_DIME)) + { strncpy(soap->href, tp->value, sizeof(soap->href) - 1); + soap->href[sizeof(soap->href)-1] = '\0'; + } + } + else +#endif + if (!soap_match_tag(soap, tp->name, "xsi:type")) + { strncpy(soap->type, tp->value, sizeof(soap->type) - 1); + soap->type[sizeof(soap->type)-1] = '\0'; + } + else if ((!soap_match_tag(soap, tp->name, "xsi:null") + || !soap_match_tag(soap, tp->name, "xsi:nil")) + && (!strcmp(tp->value, "1") + || !strcmp(tp->value, "true"))) + { soap->null = 1; + } + else if (soap->version == 1) + { if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType")) + { s = soap_strrchr(tp->value, '['); + if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType)) + { strncpy(soap->arrayType, tp->value, s - tp->value); + soap->arrayType[s - tp->value] = '\0'; + strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1); + } + else + strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); + soap->arraySize[sizeof(soap->arrayType)-1] = '\0'; + soap->arrayType[sizeof(soap->arrayType)-1] = '\0'; + } + else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) + strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset)); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:position")) + soap->position = soap_getposition(tp->value, soap->positions); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:root")) + soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") + && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) + soap->mustUnderstand = 1; + else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")) + { if ((!soap->actor || strcmp(soap->actor, tp->value)) + && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")) + soap->other = 1; + } + } + else if (soap->version == 2) + { +#ifndef WITH_NOIDREF + if (!strcmp(tp->name, "ref") + || !soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) + { *soap->href = '#'; + strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2); + soap->href[sizeof(soap->href)-1] = '\0'; + } + else +#endif + if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) + strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) + strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1); + else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand") + && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true"))) + soap->mustUnderstand = 1; + else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:role")) + { if ((!soap->actor || strcmp(soap->actor, tp->value)) + && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next")) + soap->other = 1; + } + } + } + } + return soap->error = SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_retry(struct soap *soap) +{ soap->error = SOAP_OK; + soap_revert(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_revert(struct soap *soap) +{ if (!soap->peeked) + { soap->peeked = 1; + if (soap->body) + soap->level--; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting last element (level=%u)\n", soap->level)); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_string_out(struct soap *soap, const char *s, int flag) +{ register const char *t; + register soap_wchar c; + register soap_wchar mask = (soap_wchar)0xFFFFFF80UL; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { soap->dom->data = soap_strdup(soap, s); + return SOAP_OK; + } +#endif + if (soap->mode & SOAP_C_UTFSTRING) + mask = 0; + t = s; + while ((c = *t++)) + { switch (c) + { + case 0x09: + if (flag) + { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) + return soap->error; + s = t; + } + break; + case 0x0A: + if (flag || !(soap->mode & SOAP_XML_CANONICAL)) + { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) + return soap->error; + s = t; + } + break; + case 0x0D: + if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, " ", 5)) + return soap->error; + s = t; + break; + case '&': + if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5)) + return soap->error; + s = t; + break; + case '<': + if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4)) + return soap->error; + s = t; + break; + case '>': + if (!flag) + { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4)) + return soap->error; + s = t; + } + break; + case '"': + if (flag) + { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 6)) + return soap->error; + s = t; + } + break; + default: +#ifndef WITH_LEANER +#ifdef HAVE_MBTOWC + if (soap->mode & SOAP_C_MBSTRING) + { wchar_t wc; + register int m = mbtowc(&wc, t - 1, MB_CUR_MAX); + if (m > 0 && wc != c) + { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc)) + return soap->error; + s = t += m - 1; + continue; + } + } +#endif +#endif +#ifndef WITH_NOSTRINGTOUTF8 + if ((c & mask) || !(c & 0xFFFFFFE0UL)) + { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c)) + return soap->error; + s = t; + } +#endif + } + } + return soap_send_raw(soap, s, t - s - 1); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_string_in(struct soap *soap, int flag, long minlen, long maxlen) +{ register char *s; + char *t = NULL; + register size_t i; + register long l = 0; + register int n = 0, f = 0, m = 0; + register soap_wchar c; +#if !defined(WITH_LEANER) && defined(HAVE_WCTOMB) + char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8]; +#else + char buf[8]; +#endif + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading string content\n")); + if (soap->peeked) + { if (*soap->tag) + { +#ifndef WITH_LEAN + struct soap_attribute *tp; + t = soap->tmpbuf; + *t = '<'; + t[sizeof(soap->tmpbuf)-1] = '\0'; + strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2); + t += strlen(t); + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) + break; + *t++ = ' '; + strcpy(t, tp->name); + t += strlen(t); + if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) + break; /* too many or large attribute values */ + if (tp->value) + { *t++ = '='; + *t++ = '"'; + strcpy(t, tp->value); + t += strlen(t); + *t++ = '"'; + } + } + } + if (!soap->body) + *t++ = '/'; + *t++ = '>'; + *t = '\0'; + t = soap->tmpbuf; + m = (int)strlen(soap->tmpbuf); +#endif + if (soap->body) + n = 1; + f = 1; + soap->peeked = 0; + } + } +#ifdef WITH_CDATA + if (!flag) + { register int state = 0; +#ifdef WITH_FAST + soap->labidx = 0; /* use look-aside buffer */ +#else + if (soap_new_block(soap) == NULL) + return NULL; +#endif + for (;;) + { +#ifdef WITH_FAST + register size_t k; + if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ + return NULL; + s = soap->labbuf + soap->labidx; /* space to populate */ + k = soap->lablen - soap->labidx; /* number of bytes available */ + soap->labidx = soap->lablen; /* claim this space */ +#else + register size_t k = SOAP_BLKLEN; + if (!(s = (char*)soap_push_block(soap, NULL, k))) + return NULL; +#endif + for (i = 0; i < k; i++) + { if (m > 0) + { *s++ = *t++; /* copy multibyte characters */ + m--; + continue; + } + c = soap_getchar(soap); + if ((int)c == EOF) + goto end; + if (c >= 0x80 && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) + { soap_unget(soap, c); + c = soap_getutf8(soap); + if (soap->mode & SOAP_C_UTFSTRING) + { if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) + { c &= 0x7FFFFFFF; + t = buf; + if (c < 0x0800) + *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); + else + { if (c < 0x010000) + *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); + else + { if (c < 0x200000) + *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); + else + { if (c < 0x04000000) + *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); + else + { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); + *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); + } + *t++ = (char)(0x80 | (c & 0x3F)); + m = (int)(t - buf) - 1; + t = buf; + *s++ = *t++; + continue; + } + } + } + switch (state) + { case 1: + if (c == ']') + state = 4; + *s++ = c; + continue; + case 2: + if (c == '-') + state = 6; + *s++ = c; + continue; + case 3: + if (c == '?') + state = 8; + *s++ = c; + continue; + /* CDATA */ + case 4: + if (c == ']') + state = 5; + else + state = 1; + *s++ = c; + continue; + case 5: + if (c == '>') + state = 0; + else + state = 1; + *s++ = c; + continue; + /* comment */ + case 6: + if (c == '-') + state = 7; + else + state = 2; + *s++ = c; + continue; + case 7: + if (c == '>') + state = 0; + else + state = 2; + *s++ = c; + continue; + /* PI */ + case 8: + if (c == '>') + state = 0; + else + state = 3; + *s++ = c; + continue; + } + switch (c) + { + case '/': + if (n > 0) + { c = soap_getchar(soap); + if (c == '>') + n--; + soap_unget(soap, c); + } + *s++ = '/'; + break; + case '<': + c = soap_getchar(soap); + if (c == '/') + { if (n == 0) + { c = SOAP_TT; + goto end; + } + n--; + } + else if (c == '!') + { c = soap_getchar(soap); + if (c == '[') + { do c = soap_getchar(soap); + while ((int)c != EOF && c != '['); + if ((int)c == EOF) + goto end; + t = (char*)"![CDATA["; + m = 8; + state = 1; + } + else if (c == '-') + { if ((c = soap_getchar(soap)) == '-') + state = 2; + t = (char*)"!-"; + m = 2; + soap_unget(soap, c); + } + else + { t = (char*)"!"; + m = 1; + soap_unget(soap, c); + } + *s++ = '<'; + break; + } + else if (c == '?') + state = 3; + else + n++; + soap_unget(soap, c); + *s++ = '<'; + break; + case '>': + *s++ = '>'; + break; + case '"': + *s++ = '"'; + break; + default: +#ifndef WITH_LEANER +#ifdef HAVE_WCTOMB + if (soap->mode & SOAP_C_MBSTRING) + { m = wctomb(buf, c & 0x7FFFFFFF); + if (m >= 1 && m <= (int)MB_CUR_MAX) + { t = buf; + *s++ = *t++; + m--; + } + else + { *s++ = SOAP_UNKNOWN_CHAR; + m = 0; + } + } + else +#endif +#endif + *s++ = (char)(c & 0xFF); + } + l++; + if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); + soap->error = SOAP_LENGTH; + return NULL; + } + } + } + } +#endif +#ifdef WITH_FAST + soap->labidx = 0; /* use look-aside buffer */ +#else + if (soap_new_block(soap) == NULL) + return NULL; +#endif + for (;;) + { +#ifdef WITH_FAST + register size_t k; + if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ + return NULL; + s = soap->labbuf + soap->labidx; /* space to populate */ + k = soap->lablen - soap->labidx; /* number of bytes available */ + soap->labidx = soap->lablen; /* claim this space */ +#else + register size_t k = SOAP_BLKLEN; + if (!(s = (char*)soap_push_block(soap, NULL, k))) + return NULL; +#endif + for (i = 0; i < k; i++) + { if (m > 0) + { *s++ = *t++; /* copy multibyte characters */ + m--; + continue; + } + if (soap->mode & SOAP_C_UTFSTRING) + { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) + { c &= 0x7FFFFFFF; + t = buf; + if (c < 0x0800) + *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); + else + { if (c < 0x010000) + *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); + else + { if (c < 0x200000) + *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); + else + { if (c < 0x04000000) + *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); + else + { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); + *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); + } + *t++ = (char)(0x80 | (c & 0x3F)); + m = (int)(t - buf) - 1; + t = buf; + *s++ = *t++; + continue; + } + } + else + c = soap_getutf8(soap); + switch (c) + { + case SOAP_TT: + if (n == 0) + goto end; + n--; + *s++ = '<'; + t = (char*)"/"; + m = 1; + break; + case SOAP_LT: + if (f && n == 0) + goto end; + n++; + *s++ = '<'; + break; + case SOAP_GT: + *s++ = '>'; + break; + case SOAP_QT: + *s++ = '"'; + break; + case SOAP_AP: + *s++ = '\''; + break; + case '/': + if (n > 0) + { c = soap_get(soap); + if (c == SOAP_GT) + n--; + soap_unget(soap, c); + } + *s++ = '/'; + break; + case (soap_wchar)('<' | 0x80000000): + if (flag) + *s++ = '<'; + else + { *s++ = '&'; + t = (char*)"lt;"; + m = 3; + } + break; + case (soap_wchar)('>' | 0x80000000): + if (flag) + *s++ = '>'; + else + { *s++ = '&'; + t = (char*)"gt;"; + m = 3; + } + break; + case (soap_wchar)('&' | 0x80000000): + if (flag) + *s++ = '&'; + else + { *s++ = '&'; + t = (char*)"amp;"; + m = 4; + } + break; + case (soap_wchar)('"' | 0x80000000): + if (flag) + *s++ = '"'; + else + { *s++ = '&'; + t = (char*)"quot;"; + m = 5; + } + break; + case (soap_wchar)('\'' | 0x80000000): + if (flag) + *s++ = '\''; + else + { *s++ = '&'; + t = (char*)"apos;"; + m = 5; + } + break; + default: + if ((int)c == EOF) + goto end; +#ifndef WITH_LEANER +#ifdef HAVE_WCTOMB + if (soap->mode & SOAP_C_MBSTRING) + { m = wctomb(buf, c & 0x7FFFFFFF); + if (m >= 1 && m <= (int)MB_CUR_MAX) + { t = buf; + *s++ = *t++; + m--; + } + else + { *s++ = SOAP_UNKNOWN_CHAR; + m = 0; + } + } + else +#endif +#endif + *s++ = (char)(c & 0xFF); + } + l++; + if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); + soap->error = SOAP_LENGTH; + return NULL; + } + } + } +end: + soap_unget(soap, c); + *s = '\0'; +#ifdef WITH_FAST + t = soap_strdup(soap, soap->labbuf); +#else + soap_size_block(soap, NULL, i+1); + t = soap_save_block(soap, NULL, 0); +#endif + if ((soap->mode & SOAP_XML_STRICT) && l < minlen) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); + soap->error = SOAP_LENGTH; + return NULL; + } +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { if (flag == 3) + soap->dom->tail = t; + else + soap->dom->data = t; + } +#endif + if (flag == 2) + if (soap_s2QName(soap, t, &t)) + return NULL; + return t; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) +{ const char *t; + char tmp; + register soap_wchar c; +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + { wchar_t *r = (wchar_t*)s; + int n = 1; + while (*r++) + n++; + soap->dom->wide = r = (wchar_t*)soap_malloc(soap, n * sizeof(wchar_t)); + while (n--) + *r++ = *s++; + return SOAP_OK; + } +#endif + while ((c = *s++)) + { switch (c) + { + case 0x09: + if (flag) + t = " "; + else + t = "\t"; + break; + case 0x0A: + if (flag || !(soap->mode & SOAP_XML_CANONICAL)) + t = " "; + else + t = "\n"; + break; + case 0x0D: + t = " "; + break; + case '&': + t = "&"; + break; + case '<': + t = "<"; + break; + case '>': + if (flag) + t = ">"; + else + t = ">"; + break; + case '"': + if (flag) + t = """; + else + t = "\""; + break; + default: + if (c >= 0x20 && c < 0x80) + { tmp = (char)c; + if (soap_send_raw(soap, &tmp, 1)) + return soap->error; + } + else if (soap_pututf8(soap, (unsigned long)c)) + return soap->error; + continue; + } + if (soap_send(soap, t)) + return soap->error; + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +wchar_t * +SOAP_FMAC2 +soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen) +{ wchar_t *s; + register int i, n = 0, f = 0; + register long l = 0; + register soap_wchar c; + char *t = NULL; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reading wide string content\n")); + if (soap->peeked) + { if (*soap->tag) + { +#ifndef WITH_LEAN + struct soap_attribute *tp; + t = soap->tmpbuf; + *t = '<'; + t[sizeof(soap->tmpbuf)-1] = '\0'; + strncpy(t + 1, soap->tag, sizeof(soap->tmpbuf) - 2); + t += strlen(t); + for (tp = soap->attributes; tp; tp = tp->next) + { if (tp->visible) + { if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) + break; + *t++ = ' '; + strcpy(t, tp->name); + t += strlen(t); + if (t >= soap->tmpbuf + sizeof(soap->tmpbuf) - 2) + break; + if (tp->value) + { *t++ = '='; + *t++ = '"'; + strcpy(t, tp->value); + t += strlen(t); + *t++ = '"'; + } + } + } + if (!soap->body) + *t++ = '/'; + *t++ = '>'; + *t = '\0'; + t = soap->tmpbuf; +#endif + if (soap->body) + n = 1; + f = 1; + soap->peeked = 0; + } + } + if (soap_new_block(soap) == NULL) + return NULL; + for (;;) + { if (!(s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN))) + return NULL; + for (i = 0; i < SOAP_BLKLEN; i++) + { if (t) + { *s++ = (wchar_t)*t++; + if (!*t) + t = NULL; + continue; + } + c = soap_getutf8(soap); + switch (c) + { + case SOAP_TT: + if (n == 0) + goto end; + n--; + *s++ = '<'; + soap_unget(soap, '/'); + break; + case SOAP_LT: + if (f && n == 0) + goto end; + n++; + *s++ = '<'; + break; + case SOAP_GT: + *s++ = '>'; + break; + case SOAP_QT: + *s++ = '"'; + break; + case SOAP_AP: + *s++ = '\''; + break; + case '/': + if (n > 0) + { c = soap_getutf8(soap); + if (c == SOAP_GT) + n--; + soap_unget(soap, c); + } + *s++ = '/'; + break; + case '<': + if (flag) + *s++ = (soap_wchar)'<'; + else + { *s++ = (soap_wchar)'&'; + t = (char*)"lt;"; + } + break; + case '>': + if (flag) + *s++ = (soap_wchar)'>'; + else + { *s++ = (soap_wchar)'&'; + t = (char*)"gt;"; + } + break; + case '"': + if (flag) + *s++ = (soap_wchar)'"'; + else + { *s++ = (soap_wchar)'&'; + t = (char*)"quot;"; + } + break; + default: + if ((int)c == EOF) + goto end; + *s++ = (wchar_t)c & 0x7FFFFFFF; + } + l++; + if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); + soap->error = SOAP_LENGTH; + return NULL; + } + } + } +end: + soap_unget(soap, c); + *s = '\0'; + soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); + if ((soap->mode & SOAP_XML_STRICT) && l < minlen) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen)); + soap->error = SOAP_LENGTH; + return NULL; + } + s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->wide = s; +#endif + return s; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_int2s(struct soap *soap, int n) +{ return soap_long2s(soap, (long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2int(struct soap *soap, const char *s, int *p) +{ if (s) + { char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = (int)soap_strtol(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + soap->error = SOAP_TYPE; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int * +SOAP_FMAC2 +soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":int") + && soap_match_tag(soap, soap->type, ":short") + && soap_match_tag(soap, soap->type, ":byte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL); + if (*soap->href) + p = (int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(int), 0, NULL); + else if (p) + { if (soap_s2int(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_long2s(struct soap *soap, long n) +{ sprintf(soap->tmpbuf, "%ld", n); + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_long2s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2long(struct soap *soap, const char *s, long *p) +{ if (s) + { char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = soap_strtol(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + soap->error = SOAP_TYPE; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +long * +SOAP_FMAC2 +soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":int") + && soap_match_tag(soap, soap->type, ":short") + && soap_match_tag(soap, soap->type, ":byte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL); + if (*soap->href) + p = (long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long), 0, NULL); + else if (p) + { if (soap_s2long(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_LONG642s(struct soap *soap, LONG64 n) +{ sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n); + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_LONG642s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) +{ if (s) + { +#ifdef HAVE_STRTOLL + char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = strtoll(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) +#else +# ifdef HAVE_SSCANF + if (sscanf(s, SOAP_LONG_FORMAT, p) != 1) +# endif +#endif + soap->error = SOAP_TYPE; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +LONG64 * +SOAP_FMAC2 +soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":integer") + && soap_match_tag(soap, soap->type, ":positiveInteger") + && soap_match_tag(soap, soap->type, ":negativeInteger") + && soap_match_tag(soap, soap->type, ":nonPositiveInteger") + && soap_match_tag(soap, soap->type, ":nonNegativeInteger") + && soap_match_tag(soap, soap->type, ":long") + && soap_match_tag(soap, soap->type, ":int") + && soap_match_tag(soap, soap->type, ":short") + && soap_match_tag(soap, soap->type, ":byte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL); + if (*soap->href) + p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(LONG64), 0, NULL); + else if (p) + { if (soap_s2LONG64(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_byte2s(struct soap *soap, char n) +{ return soap_long2s(soap, (long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2byte(struct soap *soap, const char *s, char *p) +{ if (s) + { long n; + char *r; + n = soap_strtol(s, &r, 10); + if (s == r || *r || n < -128 || n > 127) + soap->error = SOAP_TYPE; + *p = (char)n; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":byte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL); + if (*soap->href) + p = (char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(char), 0, NULL); + else if (p) + { if (soap_s2byte(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_short2s(struct soap *soap, short n) +{ return soap_long2s(soap, (long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_long2s(soap, (long)*p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2short(struct soap *soap, const char *s, short *p) +{ if (s) + { long n; + char *r; + n = soap_strtol(s, &r, 10); + if (s == r || *r || n < -32768 || n > 32767) + soap->error = SOAP_TYPE; + *p = (short)n; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +short * +SOAP_FMAC2 +soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":short") + && soap_match_tag(soap, soap->type, ":byte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL); + if (*soap->href) + p = (short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(short), 0, NULL); + else if (p) + { if (soap_s2short(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_float2s(struct soap *soap, float n) +{ char *s; +/* if (soap_isnan((double)n)) + return "NaN";*/ + if (soap_ispinff(n)) + return "INF"; + if (soap_isninff(n)) + return "-INF"; + s = soap->tmpbuf; +#if defined(HAVE_SPRINTF_L) + sprintf_l(s, soap->c_locale, soap->float_format, n); +#else + sprintf(s, soap->float_format, n); + s = strchr(s, ','); /* convert decimal comma to DP */ + if (s) + *s = '.'; +#endif + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_float2s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2float(struct soap *soap, const char *s, float *p) +{ if (s) + { if (!*s) + return soap->error = SOAP_TYPE; + if (!soap_tag_cmp(s, "INF")) + *p = FLT_PINFTY; + else if (!soap_tag_cmp(s, "+INF")) + *p = FLT_PINFTY; + else if (!soap_tag_cmp(s, "-INF")) + *p = FLT_NINFTY; + else if (!soap_tag_cmp(s, "NaN")) + *p = FLT_NAN; + else + { +/* On some systems strtof requires -std=c99 or does not even link: so we try to use strtod first */ +#if defined(HAVE_STRTOD_L) + char *r; + *p = (float)strtod_l(s, &r, soap->c_locale); + if (*r) +#elif defined(HAVE_STRTOD) + char *r; + *p = (float)strtod(s, &r); + if (*r) +#elif defined(HAVE_STRTOF_L) + char *r; + *p = strtof_l((char*)s, &r, soap->c_locale); + if (*r) +#elif defined(HAVE_STRTOF) + char *r; + *p = strtof((char*)s, &r); + if (*r) +#endif + { +#if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) + if (sscanf_l(s, soap->c_locale, "%g", p) != 1) + soap->error = SOAP_TYPE; +#elif defined(HAVE_SSCANF) + if (sscanf(s, "%g", p) != 1) + soap->error = SOAP_TYPE; +#else + soap->error = SOAP_TYPE; +#endif + } + } + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static int soap_isnumeric(struct soap *soap, const char *type) +{ if (soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":float") + && soap_match_tag(soap, soap->type, ":double") + && soap_match_tag(soap, soap->type, ":decimal") + && soap_match_tag(soap, soap->type, ":integer") + && soap_match_tag(soap, soap->type, ":positiveInteger") + && soap_match_tag(soap, soap->type, ":negativeInteger") + && soap_match_tag(soap, soap->type, ":nonPositiveInteger") + && soap_match_tag(soap, soap->type, ":nonNegativeInteger") + && soap_match_tag(soap, soap->type, ":long") + && soap_match_tag(soap, soap->type, ":int") + && soap_match_tag(soap, soap->type, ":short") + && soap_match_tag(soap, soap->type, ":byte") + && soap_match_tag(soap, soap->type, ":unsignedLong") + && soap_match_tag(soap, soap->type, ":unsignedInt") + && soap_match_tag(soap, soap->type, ":unsignedShort") + && soap_match_tag(soap, soap->type, ":unsignedByte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return SOAP_ERR; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +float * +SOAP_FMAC2 +soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type != '\0' && soap_isnumeric(soap, type)) + return NULL; +#endif + p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL); + if (*soap->href) + p = (float*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(float), 0, NULL); + else if (p) + { if (soap_s2float(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_double2s(struct soap *soap, double n) +{ char *s; +/* if (soap_isnan(n)) + return "NaN";*/ + if (soap_ispinfd(n)) + return "INF"; + if (soap_isninfd(n)) + return "-INF"; + s = soap->tmpbuf; +#if defined(HAVE_SPRINTF_L) + sprintf_l(s, soap->c_locale, soap->double_format, n); +#else + sprintf(s, soap->double_format, n); + s = strchr(s, ','); /* convert decimal comma to DP */ + if (s) + *s = '.'; +#endif + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_double2s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2double(struct soap *soap, const char *s, double *p) +{ if (s) + { if (!*s) + return soap->error = SOAP_TYPE; + if (!soap_tag_cmp(s, "INF")) + *p = DBL_PINFTY; + else if (!soap_tag_cmp(s, "+INF")) + *p = DBL_PINFTY; + else if (!soap_tag_cmp(s, "-INF")) + *p = DBL_NINFTY; + else if (!soap_tag_cmp(s, "NaN")) + *p = DBL_NAN; + else + { +#if defined(HAVE_STRTOD_L) + char *r; + *p = strtod_l(s, &r, soap->c_locale); + if (*r) +#elif defined(HAVE_STRTOD) + char *r; + *p = strtod(s, &r); + if (*r) +#endif + { +#if defined(HAVE_SSCANF_L) && !defined(HAVE_STRTOF_L) && !defined(HAVE_STRTOD_L) + if (sscanf_l(s, soap->c_locale, "%lg", p) != 1) + soap->error = SOAP_TYPE; +#elif defined(HAVE_SSCANF) + if (sscanf(s, "%lg", p) != 1) + soap->error = SOAP_TYPE; +#else + soap->error = SOAP_TYPE; +#endif + } + } + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +double * +SOAP_FMAC2 +soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type != '\0' && soap_isnumeric(soap, type)) + return NULL; +#endif + p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL); + if (*soap->href) + p = (double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(double), 0, NULL); + else if (p) + { if (soap_s2double(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_unsignedByte2s(struct soap *soap, unsigned char n) +{ return soap_unsignedLong2s(soap, (unsigned long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) +{ if (s) + { unsigned long n; + char *r; + n = soap_strtoul(s, &r, 10); + if (s == r || *r || n > 255) + soap->error = SOAP_TYPE; + *p = (unsigned char)n; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +unsigned char * +SOAP_FMAC2 +soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":unsignedByte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL); + if (*soap->href) + p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned char), 0, NULL); + else if (p) + { if (soap_s2unsignedByte(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_unsignedShort2s(struct soap *soap, unsigned short n) +{ return soap_unsignedLong2s(soap, (unsigned long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) +{ if (s) + { unsigned long n; + char *r; + n = soap_strtoul(s, &r, 10); + if (s == r || *r || n > 65535) + soap->error = SOAP_TYPE; + *p = (unsigned short)n; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +unsigned short * +SOAP_FMAC2 +soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":unsignedShort") + && soap_match_tag(soap, soap->type, ":unsignedByte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL); + if (*soap->href) + p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned short), 0, NULL); + else if (p) + { if (soap_s2unsignedShort(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_unsignedInt2s(struct soap *soap, unsigned int n) +{ return soap_unsignedLong2s(soap, (unsigned long)n); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) +{ if (s) + { char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = (unsigned int)soap_strtoul(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + soap->error = SOAP_TYPE; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +unsigned int * +SOAP_FMAC2 +soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":unsignedInt") + && soap_match_tag(soap, soap->type, ":unsignedShort") + && soap_match_tag(soap, soap->type, ":unsignedByte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL); + if (*soap->href) + p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned int), 0, NULL); + else if (p) + { if (soap_s2unsignedInt(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_unsignedLong2s(struct soap *soap, unsigned long n) +{ sprintf(soap->tmpbuf, "%lu", n); + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) +{ if (s) + { char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = soap_strtoul(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) + soap->error = SOAP_TYPE; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +unsigned long * +SOAP_FMAC2 +soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; +#ifndef WITH_LEAN + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":unsignedInt") + && soap_match_tag(soap, soap->type, ":unsignedShort") + && soap_match_tag(soap, soap->type, ":unsignedByte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } +#endif + p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL); + if (*soap->href) + p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(unsigned long), 0, NULL); + else if (p) + { if (soap_s2unsignedLong(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_ULONG642s(struct soap *soap, ULONG64 n) +{ sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n); + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_ULONG642s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) +{ if (s) + { +#ifdef HAVE_STRTOULL + char *r; +#ifndef WITH_NOIO +#ifndef WITH_LEAN + soap_reset_errno; +#endif +#endif + *p = strtoull(s, &r, 10); + if ((s == r && (soap->mode & SOAP_XML_STRICT)) || *r +#ifndef WITH_NOIO +#ifndef WITH_LEAN + || soap_errno == SOAP_ERANGE +#endif +#endif + ) +#else +#ifdef HAVE_SSCANF + if (sscanf(s, SOAP_ULONG_FORMAT, p) != 1) +#endif +#endif + soap->error = SOAP_TYPE; + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +ULONG64 * +SOAP_FMAC2 +soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":positiveInteger") + && soap_match_tag(soap, soap->type, ":nonNegativeInteger") + && soap_match_tag(soap, soap->type, ":unsignedLong") + && soap_match_tag(soap, soap->type, ":unsignedInt") + && soap_match_tag(soap, soap->type, ":unsignedShort") + && soap_match_tag(soap, soap->type, ":unsignedByte")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } + p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL); + if (*soap->href) + p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(ULONG64), 0, NULL); + else if (p) + { if (soap_s2ULONG64(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2string(struct soap *soap, const char *s, char **t) +{ if (s) + { if (!(*t = soap_strdup(soap, s))) + return soap->error = SOAP_EOM; + if (!(soap->mode & (SOAP_ENC_LATIN | SOAP_C_UTFSTRING))) + { /* TODO: consider truncating UTF8 to ASCII for regular XML attribute strings? */ + } + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2QName(struct soap *soap, const char *s, char **t) +{ if (s) + { soap->labidx = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Normalized namespace(s) of QNames '%s'", s)); + /* convert (by prefix normalize prefix) all QNames in s */ + for (;;) + { size_t n; + struct soap_nlist *np; + register const char *p; + /* skip blanks */ + while (*s && soap_blank(*s)) + s++; + if (!*s) + break; + /* find next QName */ + n = 1; + while (s[n] && !soap_blank(s[n])) + n++; + np = soap->nlist; + /* if there is no namespace stack, or prefix is "xml" then copy string */ + if (!np || !strncmp(s, "xml:", 4)) + { soap_append_lab(soap, s, n); + } + else /* we normalize the QName by replacing its prefix */ + { p = strchr(s, ':'); + if (p) + { size_t k = p - s; + while (np && (strncmp(np->id, s, k) || np->id[k])) + np = np->next; + p++; + } + else + { while (np && *np->id) + np = np->next; + p = s; + } + /* replace prefix */ + if (np) + { if (np->index >= 0 && soap->local_namespaces) + { const char *q = soap->local_namespaces[np->index].id; + if (q) + soap_append_lab(soap, q, strlen(q)); + } + else if (np->ns) + { soap_append_lab(soap, "\"", 1); + soap_append_lab(soap, np->ns, strlen(np->ns)); + soap_append_lab(soap, "\"", 1); + } + else + { 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)); + return soap->error = SOAP_NAMESPACE; + } + } + else /* no namespace: assume default "" namespace */ + { soap_append_lab(soap, "\"\"", 2); + } + soap_append_lab(soap, ":", 1); + soap_append_lab(soap, p, n - (p-s)); + } + /* advance to next and add spacing */ + s += n; + if (*s) + soap_append_lab(soap, " ", 1); + } + soap_append_lab(soap, SOAP_STR_EOS, 1); + *t = soap_strdup(soap, soap->labbuf); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, " into '%s'\n", *t)); + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_QName2s(struct soap *soap, const char *s) +{ const char *t = NULL; + if (s) + { soap->labidx = 0; + for (;;) + { size_t n; + /* skip blanks */ + while (*s && soap_blank(*s)) + s++; + if (!*s) + break; + /* find next QName */ + n = 1; + while (s[n] && !soap_blank(s[n])) + n++; + /* normal prefix: pass string as is */ + if (*s != '"') + { soap_append_lab(soap, s, n); +#ifndef WITH_LEAN + if ((soap->mode & SOAP_XML_CANONICAL)) + { const char *r = strchr(s, ':'); + if (r) + soap_utilize_ns(soap, s, r - s); + } +#endif + } + else /* URL-based string prefix */ + { const char *q; + s++; + q = strchr(s, '"'); + if (q) + { struct Namespace *p = soap->local_namespaces; + if (p) + { for (; p->id; p++) + { if (p->ns) + if (!soap_tag_cmp(s, p->ns)) + break; + if (p->in) + if (!soap_tag_cmp(s, p->in)) + break; + } + } + /* URL is in the namespace table? */ + if (p && p->id) + { soap_append_lab(soap, p->id, strlen(p->id)); + } + else /* not in namespace table: create xmlns binding */ + { char *r = soap_strdup(soap, s); + r[q-s] = '\0'; + sprintf(soap->tmpbuf, "xmlns:_%d", soap->idnum++); + soap_set_attr(soap, soap->tmpbuf, r); + soap_append_lab(soap, soap->tmpbuf + 6, strlen(soap->tmpbuf + 6)); + } + soap_append_lab(soap, q + 1, n - (q-s) - 1); + } + } + /* advance to next and add spacing */ + s += n; + if (*s) + soap_append_lab(soap, " ", 1); + } + soap_append_lab(soap, SOAP_STR_EOS, 1); + t = soap_strdup(soap, soap->labbuf); + } + return t; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2wchar(struct soap *soap, const char *s, wchar_t **t) +{ if (s) + { wchar_t *r; + *t = r = (wchar_t*)soap_malloc(soap, sizeof(wchar_t) * (strlen(s) + 1)); + if (!r) + return soap->error; + if (soap->mode & SOAP_ENC_LATIN) + { while (*s) + *r++ = (wchar_t)*s++; + } + else + { /* Convert UTF8 to wchar */ + while (*s) + { register soap_wchar c, c1, c2, c3, c4; + c = (unsigned char)*s++; + if (c < 0x80) + *r++ = (wchar_t)c; + else + { c1 = (soap_wchar)*s++ & 0x3F; + if (c < 0xE0) + *r++ = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); + else + { c2 = (soap_wchar)*s++ & 0x3F; + if (c < 0xF0) + *r++ = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); + else + { c3 = (soap_wchar)*s++ & 0x3F; + if (c < 0xF8) + *r++ = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); + else + { c4 = (soap_wchar)*s++ & 0x3F; + if (c < 0xFC) + *r++ = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); + else + *r++ = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(*s++ & 0x3F)); + } + } + } + } + } + } + *r = L'\0'; + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_wchar2s(struct soap *soap, const wchar_t *s) +{ register soap_wchar c; + register char *r, *t; + const wchar_t *q = s; + size_t n = 0; + while ((c = *q++)) + { if (c > 0 && c < 0x80) + n++; + else + n += 6; + } + r = t = (char*)soap_malloc(soap, n + 1); + if (r) + { /* Convert wchar to UTF8 */ + while ((c = *s++)) + { if (c > 0 && c < 0x80) + *t++ = (char)c; + else + { if (c < 0x0800) + *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); + else + { if (c < 0x010000) + *t++ = (char)(0xE0 | ((c >> 12) & 0x0F)); + else + { if (c < 0x200000) + *t++ = (char)(0xF0 | ((c >> 18) & 0x07)); + else + { if (c < 0x04000000) + *t++ = (char)(0xF8 | ((c >> 24) & 0x03)); + else + { *t++ = (char)(0xFC | ((c >> 30) & 0x01)); + *t++ = (char)(0x80 | ((c >> 24) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 18) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 12) & 0x3F)); + } + *t++ = (char)(0x80 | ((c >> 6) & 0x3F)); + } + *t++ = (char)(0x80 | (c & 0x3F)); + } + } + *t = '\0'; + } + return r; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) +{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n); + if (id < 0) + return soap->error; + if (!**p && (soap->mode & SOAP_C_NILSTRING)) + return soap_element_null(soap, tag, id, type); + if (soap_element_begin_out(soap, tag, id, type) + || soap_string_out(soap, *p, 0) + || soap_element_end_out(soap, tag)) + return soap->error; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char ** +SOAP_FMAC2 +soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen) +{ if (soap_element_begin_in(soap, tag, 1, NULL)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) + return NULL; + } + if (soap->null) + *p = NULL; + else if (soap->body) + { *p = soap_string_in(soap, flag, minlen, maxlen); + if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL)) + return NULL; + if (!**p && tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + } + else if (tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + else + *p = soap_strdup(soap, SOAP_STR_EOS); + if (*soap->href) + p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) +{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n); + if (id < 0) + return soap->error; + if (!**p && (soap->mode & SOAP_C_NILSTRING)) + return soap_element_null(soap, tag, id, type); + if (soap_element_begin_out(soap, tag, id, type) + || soap_wstring_out(soap, *p, 0) + || soap_element_end_out(soap, tag)) + return soap->error; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +wchar_t ** +SOAP_FMAC2 +soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen) +{ if (soap_element_begin_in(soap, tag, 1, NULL)) + { if (!tag || *tag != '-' || soap->error != SOAP_NO_TAG) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) + return NULL; + } + if (soap->body) + { *p = soap_wstring_in(soap, 1, minlen, maxlen); + if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL)) + return NULL; + if (!**p && tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + } + else if (tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + else if (soap->null) + *p = NULL; + else + *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); + if (*soap->href) + p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +time_t +SOAP_FMAC2 +soap_timegm(struct tm *T) +{ +#if defined(HAVE_TIMEGM) + return timegm(T); +#else + time_t t, g, z; + struct tm tm; + t = mktime(T); + if (t == (time_t)-1) + return (time_t)-1; +#ifdef HAVE_GMTIME_R + gmtime_r(&t, &tm); +#else + tm = *gmtime(&t); +#endif + tm.tm_isdst = 0; + g = mktime(&tm); + if (g == (time_t)-1) + return (time_t)-1; + z = g - t; + return t - z; +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_dateTime2s(struct soap *soap, time_t n) +{ struct tm T, *pT = &T; +#if defined(HAVE_GMTIME_R) + if (gmtime_r(&n, pT)) + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); +#elif defined(HAVE_GMTIME) + if ((pT = gmtime(&n))) + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); +#elif defined(HAVE_GETTIMEOFDAY) + struct timezone tz; + memset((void*)&tz, 0, sizeof(tz)); +#if defined(HAVE_LOCALTIME_R) + if (localtime_r(&n, pT)) + { struct timeval tv; + gettimeofday(&tv, &tz); + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); + } +#else + if ((pT = localtime(&n))) + { struct timeval tv; + gettimeofday(&tv, &tz); + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); + } +#endif +#elif defined(HAVE_FTIME) + struct timeb t; + memset((void*)&t, 0, sizeof(t)); +#if defined(HAVE_LOCALTIME_R) + if (localtime_r(&n, pT)) + { +#ifdef __BORLANDC__ + ::ftime(&t); +#else + ftime(&t); +#endif + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); + } +#else + if ((pT = localtime(&n))) + { +#ifdef __BORLANDC__ + ::ftime(&t); +#else + ftime(&t); +#endif + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); + sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); + } +#endif +#elif defined(HAVE_LOCALTIME_R) + if (localtime_r(&n, pT)) + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); +#else + if ((pT = localtime(&n))) + strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); +#endif + else + strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z"); + return soap->tmpbuf; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n) +{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type) + || soap_string_out(soap, soap_dateTime2s(soap, *p), 0)) + return soap->error; + return soap_element_end_out(soap, tag); +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_s2dateTime(struct soap *soap, const char *s, time_t *p) +{ if (s) + { char zone[32]; + struct tm T; + const char *t; + *zone = '\0'; + memset((void*)&T, 0, sizeof(T)); + if (strchr(s, '-')) + t = "%d-%d-%dT%d:%d:%d%31s"; + else if (strchr(s, ':')) + t = "%4d%2d%2dT%d:%d:%d%31s"; + else /* parse non-XSD-standard alternative ISO 8601 format */ + t = "%4d%2d%2dT%2d%2d%2d%31s"; + if (sscanf(s, t, &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone) < 6) + return soap->error = SOAP_TYPE; + if (T.tm_year == 1) + T.tm_year = 70; + else + T.tm_year -= 1900; + T.tm_mon--; + if (*zone == '.') + { for (s = zone + 1; *s; s++) + if (*s < '0' || *s > '9') + break; + } + else + s = zone; + if (*s) + { +#ifndef WITH_NOZONE + if (*s == '+' || *s == '-') + { int h = 0, m = 0; + if (s[3] == ':') + { /* +hh:mm */ + sscanf(s, "%d:%d", &h, &m); + if (h < 0) + m = -m; + } + else /* +hhmm */ + { m = (int)atol(s); + h = m / 100; + m = m % 100; + } + T.tm_min -= m; + T.tm_hour -= h; + /* put hour and min in range */ + T.tm_hour += T.tm_min / 60; + T.tm_min %= 60; + if (T.tm_min < 0) + T.tm_min += 60; + T.tm_mday += T.tm_hour / 24; + T.tm_hour %= 24; + if (T.tm_hour < 0) + T.tm_hour += 24; + /* note: day of the month may be out of range, timegm() handles it */ + } +#endif + *p = soap_timegm(&T); + } + else + *p = mktime(&T); + } + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +time_t * +SOAP_FMAC2 +soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char *type, int t) +{ if (soap_element_begin_in(soap, tag, 0, NULL)) + return NULL; + if (*soap->type + && soap_match_tag(soap, soap->type, type) + && soap_match_tag(soap, soap->type, ":dateTime")) + { soap->error = SOAP_TYPE; + soap_revert(soap); + return NULL; + } + p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL); + if (*soap->href) + p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(time_t), 0, NULL); + else if (p) + { if (soap_s2dateTime(soap, soap_value(soap), p)) + return NULL; + } + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) +{ int i; + const char *t = NULL; + if (tag && *tag != '-') + { if (soap->local_namespaces && (t = strchr(tag, ':'))) + { strncpy(soap->tmpbuf, tag, t-tag); + soap->tmpbuf[t-tag] = '\0'; + for (i = 0; soap->local_namespaces[i].id; i++) + if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) + break; + t++; + if (soap_element(soap, t, 0, type) + || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) + || soap_element_start_end_out(soap, NULL)) + return soap->error; + } + else + { t = tag; + if (soap_element_begin_out(soap, t, 0, type)) + return soap->error; + } + } + if (p && *p) + { if (soap_send(soap, *p)) + return soap->error; + } + if (t) + return soap_element_end_out(soap, t); + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +char ** +SOAP_FMAC2 +soap_inliteral(struct soap *soap, const char *tag, char **p) +{ if (soap_element_begin_in(soap, tag, 1, NULL)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + { if (!(p = (char**)soap_malloc(soap, sizeof(char*)))) + return NULL; + } + if (soap->body || (tag && *tag == '-')) + { *p = soap_string_in(soap, 0, -1, -1); + if (!*p) + return NULL; + if (!**p && tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + } + else if (soap->null) + *p = NULL; + else + *p = soap_strdup(soap, SOAP_STR_EOS); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) +{ int i; + const char *t = NULL; + if (tag && *tag != '-') + { if (soap->local_namespaces && (t = strchr(tag, ':'))) + { strncpy(soap->tmpbuf, tag, t-tag); + soap->tmpbuf[t-tag] = '\0'; + for (i = 0; soap->local_namespaces[i].id; i++) + if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id)) + break; + t++; + if (soap_element(soap, t, 0, type) + || soap_attribute(soap, "xmlns", soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS) + || soap_element_start_end_out(soap, NULL)) + return soap->error; + } + else + { t = tag; + if (soap_element_begin_out(soap, t, 0, type)) + return soap->error; + } + if (soap_send(soap, soap->tmpbuf)) + return soap->error; + } + if (p) + { wchar_t c; + const wchar_t *s = *p; + while ((c = *s++)) + { if (soap_pututf8(soap, (unsigned long)c)) + return soap->error; + } + } + if (t) + return soap_element_end_out(soap, t); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_2 +SOAP_FMAC1 +wchar_t ** +SOAP_FMAC2 +soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p) +{ if (soap_element_begin_in(soap, tag, 1, NULL)) + { if (soap->error != SOAP_NO_TAG || soap_unget(soap, soap_get(soap)) == SOAP_TT) + return NULL; + soap->error = SOAP_OK; + } + if (!p) + { if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)))) + return NULL; + } + if (soap->body) + { *p = soap_wstring_in(soap, 0, -1, -1); + if (!*p) + return NULL; + if (!**p && tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + } + else if (tag && *tag == '-') + { soap->error = SOAP_NO_TAG; + return NULL; + } + else if (soap->null) + *p = NULL; + else + *p = soap_wstrdup(soap, (wchar_t*)SOAP_STR_EOS); + if (soap->body && soap_element_end_in(soap, tag)) + return NULL; + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +const char * +SOAP_FMAC2 +soap_value(struct soap *soap) +{ register size_t i; + register soap_wchar c = 0; + register char *s = soap->tmpbuf; + if (!soap->body) + return SOAP_STR_EOS; + do c = soap_get(soap); + while (soap_blank(c)); + for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) + { if (c == SOAP_TT || (int)c == EOF) + break; + *s++ = (char)c; + c = soap_get(soap); + } + for (s--; i > 0; i--, s--) + { if (!soap_blank(*s)) + break; + } + s[1] = '\0'; + if ((int)c == EOF || c == SOAP_TT) + soap_unget(soap, c); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); +#ifdef WITH_DOM + if ((soap->mode & SOAP_XML_DOM) && soap->dom) + soap->dom->data = soap_strdup(soap, soap->tmpbuf); +#endif + return soap->tmpbuf; /* return non-null pointer */ +} +#endif + +/******************************************************************************/ +#if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getline(struct soap *soap, char *s, int len) +{ int i = len; + soap_wchar c = 0; + for (;;) + { while (--i > 0) + { c = soap_getchar(soap); + if (c == '\r' || c == '\n') + break; + if ((int)c == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + if (c != '\n') + c = soap_getchar(soap); /* got \r or something else, now get \n */ + if (c == '\n') + { *s = '\0'; + if (i+1 == len) /* empty line: end of HTTP/MIME header */ + break; + c = soap_get0(soap); + if (c != ' ' && c != '\t') /* HTTP line continuation? */ + break; + } + else if ((int)c == EOF) + return soap->error = SOAP_EOF; + } + if (i < 0) + return soap->error = SOAP_HDR; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static size_t +soap_count_attachments(struct soap *soap) +{ +#ifndef WITH_LEANER + register struct soap_multipart *content; + register size_t count = soap->count; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=%lu\n", (unsigned long)count)); + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n")); + for (content = soap->dime.first; content; content = content->next) + { count += 12 + ((content->size+3)&(~3)); + if (content->id) + count += ((strlen(content->id)+3)&(~3)); + if (content->type) + count += ((strlen(content->type)+3)&(~3)); + if (content->options) + count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment content is %lu bytes\n", (unsigned long)content->size)); + } + } + if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) + { register size_t n = strlen(soap->mime.boundary); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n")); + for (content = soap->mime.first; content; content = content->next) + { register const char *s; + /* count \r\n--boundary\r\n */ + count += 6 + n; + /* count Content-Type: ...\r\n */ + if (content->type) + count += 16 + strlen(content->type); + /* count Content-Transfer-Encoding: ...\r\n */ + s = soap_code_str(mime_codes, content->encoding); + if (s) + count += 29 + strlen(s); + /* count Content-ID: ...\r\n */ + if (content->id) + count += 14 + strlen(content->id); + /* count Content-Location: ...\r\n */ + if (content->location) + count += 20 + strlen(content->location); + /* count Content-Description: ...\r\n */ + if (content->description) + count += 23 + strlen(content->description); + /* count \r\n...content */ + count += 2 + content->size; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment content is %lu bytes\n", (unsigned long)content->size)); + } + /* count \r\n--boundary-- */ + count += 6 + n; + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New count is %lu bytes\n", (unsigned long)count)); + return count; +#else + return soap->count; +#endif +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static int +soap_putdimefield(struct soap *soap, const char *s, size_t n) +{ if (soap_send_raw(soap, s, n)) + return soap->error; + return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_dime_option(struct soap *soap, unsigned short optype, const char *option) +{ size_t n; + char *s = NULL; + if (option) + { n = strlen(option); + s = (char*)soap_malloc(soap, n + 5); + if (s) + { s[0] = (char)(optype >> 8); + s[1] = (char)(optype & 0xFF); + s[2] = (char)(n >> 8); + s[3] = (char)(n & 0xFF); + strcpy(s + 4, option); + } + } + return s; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putdimehdr(struct soap *soap) +{ unsigned char tmp[12]; + size_t optlen = 0, idlen = 0, typelen = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id?soap->dime.id:SOAP_STR_EOS)); + if (soap->dime.options) + optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4; + if (soap->dime.id) + { idlen = strlen(soap->dime.id); + if (idlen > 0x0000FFFF) + idlen = 0x0000FFFF; + } + if (soap->dime.type) + { typelen = strlen(soap->dime.type); + if (typelen > 0x0000FFFF) + typelen = 0x0000FFFF; + } + tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7); + tmp[1] = soap->dime.flags & 0xF0; + tmp[2] = (char)(optlen >> 8); + tmp[3] = (char)(optlen & 0xFF); + tmp[4] = (char)(idlen >> 8); + tmp[5] = (char)(idlen & 0xFF); + tmp[6] = (char)(typelen >> 8); + tmp[7] = (char)(typelen & 0xFF); + tmp[8] = (char)(soap->dime.size >> 24); + tmp[9] = (char)((soap->dime.size >> 16) & 0xFF); + tmp[10] = (char)((soap->dime.size >> 8) & 0xFF); + tmp[11] = (char)(soap->dime.size & 0xFF); + if (soap_send_raw(soap, (char*)tmp, 12) + || soap_putdimefield(soap, soap->dime.options, optlen) + || soap_putdimefield(soap, soap->dime.id, idlen) + || soap_putdimefield(soap, soap->dime.type, typelen)) + return soap->error; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putdime(struct soap *soap) +{ struct soap_multipart *content; + if (!(soap->mode & SOAP_ENC_DIME)) + return SOAP_OK; + for (content = soap->dime.first; content; content = content->next) + { void *handle; + soap->dime.size = content->size; + soap->dime.id = content->id; + soap->dime.type = content->type; + soap->dime.options = content->options; + soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA; + if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error)) + { size_t size = content->size; + if (!handle) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n")); + return soap->error; + } + if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) + { size_t chunksize = sizeof(soap->tmpbuf); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n")); + do + { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size)); + if (size < chunksize) + { soap->dime.flags &= ~SOAP_DIME_CF; + if (!content->next) + soap->dime.flags |= SOAP_DIME_ME; + } + else + soap->dime.flags |= SOAP_DIME_CF; + soap->dime.size = size; + if (soap_putdimehdr(soap) + || soap_putdimefield(soap, soap->tmpbuf, size)) + break; + if (soap->dime.id) + { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA); + soap->dime.id = NULL; + soap->dime.type = NULL; + soap->dime.options = NULL; + } + } while (size >= chunksize); + } + else + { if (!content->next) + soap->dime.flags |= SOAP_DIME_ME; + if (soap_putdimehdr(soap)) + return soap->error; + do + { size_t bufsize; + if (size < sizeof(soap->tmpbuf)) + bufsize = size; + else + bufsize = sizeof(soap->tmpbuf); + if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize))) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); + soap->error = SOAP_EOF; + break; + } + if (soap_send_raw(soap, soap->tmpbuf, bufsize)) + break; + size -= bufsize; + } while (size); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); + soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); + } + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); + if (soap->fdimereadclose) + soap->fdimereadclose(soap, handle); + } + else + { if (!content->next) + soap->dime.flags |= SOAP_DIME_ME; + if (soap_putdimehdr(soap) + || soap_putdimefield(soap, (char*)content->ptr, content->size)) + return soap->error; + } + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static char * +soap_getdimefield(struct soap *soap, size_t n) +{ register soap_wchar c; + register size_t i; + register char *s; + register char *p = NULL; + if (n) + { p = (char*)soap_malloc(soap, n + 1); + if (p) + { s = p; + for (i = n; i > 0; i--) + { if ((int)(c = soap_get1(soap)) == EOF) + { soap->error = SOAP_EOF; + return NULL; + } + *s++ = (char)c; + } + *s = '\0'; + if ((soap->error = soap_move(soap, -(long)n&3))) + return NULL; + } + else + soap->error = SOAP_EOM; + } + return p; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getdimehdr(struct soap *soap) +{ register soap_wchar c; + register char *s; + register int i; + unsigned char tmp[12]; + size_t optlen, idlen, typelen; + if (!(soap->mode & SOAP_ENC_DIME)) + return soap->error = SOAP_DIME_END; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n")); + if (soap->dime.buflen || soap->dime.chunksize) + { if (soap_move(soap, (long)(soap->dime.size - soap_tell(soap)))) + return soap->error = SOAP_EOF; + soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */ + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n")); + return SOAP_OK; + } + s = (char*)tmp; + for (i = 12; i > 0; i--) + { if ((int)(c = soap_getchar(soap)) == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) + return soap->error = SOAP_DIME_MISMATCH; + soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); + optlen = (tmp[2] << 8) | tmp[3]; + idlen = (tmp[4] << 8) | tmp[5]; + typelen = (tmp[6] << 8) | tmp[7]; + soap->dime.size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11]; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); + if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error) + return soap->error; + if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error) + return soap->error; + if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error) + return soap->error; + 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)); + if (soap->dime.flags & SOAP_DIME_ME) + soap->mode &= ~SOAP_ENC_DIME; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getdime(struct soap *soap) +{ while (soap->dime.flags & SOAP_DIME_CF) + { if (soap_getdimehdr(soap)) + return soap->error; + if (soap_move(soap, (long)soap->dime.size)) + return soap->error = SOAP_EOF; + } + if (soap_move(soap, (long)(((soap->dime.size+3)&(~3))-soap_tell(soap)))) + return soap->error = SOAP_EOF; + for (;;) + { register struct soap_multipart *content; + if (soap_getdimehdr(soap)) + break; + if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error)) + { const char *id, *type, *options; + size_t size, n; + if (!soap->dime.ptr) + return soap->error; + id = soap->dime.id; + type = soap->dime.type; + options = soap->dime.options; + for (;;) + { size = soap->dime.size; + for (;;) + { n = soap->buflen - soap->bufidx; + if (size < n) + n = size; + if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n))) + break; + size -= n; + if (!size) + { soap->bufidx += n; + break; + } + if (soap_recv(soap)) + { soap->error = SOAP_EOF; + goto end; + } + } + if (soap_move(soap, -(long)soap->dime.size&3)) + { soap->error = SOAP_EOF; + break; + } + if (!(soap->dime.flags & SOAP_DIME_CF)) + break; + if (soap_getdimehdr(soap)) + break; + } +end: + if (soap->fdimewriteclose) + soap->fdimewriteclose(soap, (void*)soap->dime.ptr); + soap->dime.size = 0; + soap->dime.id = id; + soap->dime.type = type; + soap->dime.options = options; + } + else if (soap->dime.flags & SOAP_DIME_CF) + { const char *id, *type, *options; + id = soap->dime.id; + type = soap->dime.type; + options = soap->dime.options; + if (soap_new_block(soap) == NULL) + return SOAP_EOM; + for (;;) + { register soap_wchar c; + register size_t i; + register char *s; + s = (char*)soap_push_block(soap, NULL, soap->dime.size); + if (!s) + return soap->error = SOAP_EOM; + for (i = soap->dime.size; i > 0; i--) + { if ((int)(c = soap_get1(soap)) == EOF) + return soap->error = SOAP_EOF; + *s++ = (char)c; + } + if (soap_move(soap, -(long)soap->dime.size&3)) + return soap->error = SOAP_EOF; + if (!(soap->dime.flags & SOAP_DIME_CF)) + break; + if (soap_getdimehdr(soap)) + return soap->error; + } + soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */ + if (!(soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0))) + return soap->error; + soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */ + soap->dime.id = id; + soap->dime.type = type; + soap->dime.options = options; + } + else + soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); + content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size); + if (!content) + return soap->error = SOAP_EOM; + content->id = soap->dime.id; + content->type = soap->dime.type; + content->options = soap->dime.options; + if (soap->error) + return soap->error; + soap_resolve_attachment(soap, content); + } + if (soap->error != SOAP_DIME_END) + return soap->error; + return soap->error = SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getmimehdr(struct soap *soap) +{ struct soap_multipart *content; + do + { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) + return soap->error; + } + while (!*soap->msgbuf); + if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-') + { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1; + /* remove white space */ + while (soap_blank(*s)) + s--; + s[1] = '\0'; + if (soap->mime.boundary) + { if (strcmp(soap->msgbuf + 2, soap->mime.boundary)) + return soap->error = SOAP_MIME_ERROR; + } + else + soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2); + if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) + return soap->error; + } + if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL)) + return soap->error = SOAP_EOM; + content = soap->mime.last; + for (;;) + { register char *key = soap->msgbuf; + register char *val; + if (!*key) + break; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "MIME header: %s\n", key)); + val = strchr(soap->msgbuf, ':'); + if (val) + { *val = '\0'; + do val++; + while (*val && *val <= 32); + if (!soap_tag_cmp(key, "Content-ID")) + content->id = soap_strdup(soap, val); + else if (!soap_tag_cmp(key, "Content-Location")) + content->location = soap_strdup(soap, val); + else if (!soap_tag_cmp(key, "Content-Disposition")) + content->id = soap_strdup(soap, soap_get_header_attribute(soap, val, "name")); + else if (!soap_tag_cmp(key, "Content-Type")) + content->type = soap_strdup(soap, val); + else if (!soap_tag_cmp(key, "Content-Description")) + content->description = soap_strdup(soap, val); + else if (!soap_tag_cmp(key, "Content-Transfer-Encoding")) + content->encoding = (enum soap_mime_encoding)soap_code_int(mime_codes, val, (long)SOAP_MIME_NONE); + } + if (soap_getline(soap, key, sizeof(soap->msgbuf))) + return soap->error; + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getmime(struct soap *soap) +{ while (soap_get_mime_attachment(soap, NULL)) + ; + return soap->error; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_post_check_mime_attachments(struct soap *soap) +{ soap->imode |= SOAP_MIME_POSTCHECK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_check_mime_attachments(struct soap *soap) +{ if (soap->mode & SOAP_MIME_POSTCHECK) + return soap_get_mime_attachment(soap, NULL) != NULL; + return 0; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +struct soap_multipart * +SOAP_FMAC2 +soap_get_mime_attachment(struct soap *soap, void *handle) +{ register soap_wchar c = 0; + register size_t i, m = 0; + register char *s, *t = NULL; + register struct soap_multipart *content; + register short flag = 0; + if (!(soap->mode & SOAP_ENC_MIME)) + return NULL; + content = soap->mime.last; + if (!content) + { if (soap_getmimehdr(soap)) + return NULL; + content = soap->mime.last; + } + else if (content != soap->mime.first) + { if (soap->fmimewriteopen && ((content->ptr = (char*)soap->fmimewriteopen(soap, (void*)handle, content->id, content->type, content->description, content->encoding)) || soap->error)) + { if (!content->ptr) + return NULL; + } + } + 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)); + if (!content->ptr && soap_new_block(soap) == NULL) + { soap->error = SOAP_EOM; + return NULL; + } + for (;;) + { if (content->ptr) + s = soap->tmpbuf; + else if (!(s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)))) + { soap->error = SOAP_EOM; + return NULL; + } + for (i = 0; i < sizeof(soap->tmpbuf); i++) + { if (m > 0) + { *s++ = *t++; + m--; + } + else + { if (!flag) + { c = soap_get1(soap); + if ((int)c == EOF) + { soap->error = SOAP_EOF; + return NULL; + } + } + if (flag || c == '\r') + { t = soap->msgbuf; + memset(t, 0, sizeof(soap->msgbuf)); + strcpy(t, "\n--"); + if (soap->mime.boundary) + strncat(t, soap->mime.boundary, sizeof(soap->msgbuf)-4); + do c = soap_getchar(soap); + while (c == *t++); + if ((int)c == EOF) + { soap->error = SOAP_EOF; + return NULL; + } + if (!*--t) + goto end; + *t = (char)c; + flag = (c == '\r'); + m = t - soap->msgbuf + 1 - flag; + t = soap->msgbuf; + c = '\r'; + } + *s++ = (char)c; + } + } + if (content->ptr && soap->fmimewrite) + { if ((soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i))) + break; + } + } +end: + *s = '\0'; /* force 0-terminated */ + if (content->ptr) + { if (!soap->error && soap->fmimewrite) + soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); + if (soap->fmimewriteclose) + soap->fmimewriteclose(soap, (void*)content->ptr); + if (soap->error) + return NULL; + } + else + { content->size = soap_size_block(soap, NULL, i+1)-1; + content->ptr = soap_save_block(soap, NULL, NULL, 0); + } + soap_resolve_attachment(soap, content); + if (c == '-' && soap_getchar(soap) == '-') + { soap->mode &= ~SOAP_ENC_MIME; + if ((soap->mode & SOAP_MIME_POSTCHECK) && soap_end_recv(soap)) + return NULL; + } + else + { while (c != '\r' && (int)c != EOF && soap_blank(c)) + c = soap_getchar(soap); + if (c != '\r' || soap_getchar(soap) != '\n') + { soap->error = SOAP_MIME_ERROR; + return NULL; + } + if (soap_getmimehdr(soap)) + return NULL; + } + return content; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_match_cid(struct soap *soap, const char *s, const char *t) +{ register size_t n; + if (!s) + return 1; + if (!strcmp(s, t)) + return 0; + if (!strncmp(s, "cid:", 4)) + s += 4; + n = strlen(t); + if (*t == '<') + { t++; + n -= 2; + } + if (!strncmp(s, t, n) && !s[n]) + return 0; + soap_decode(soap->tmpbuf, sizeof(soap->tmpbuf), s, SOAP_STR_EOS); + if (!strncmp(soap->tmpbuf, t, n) && !soap->tmpbuf[n]) + return 0; + return 1; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static void +soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) +{ if (content->id) + { register struct soap_xlist **xp = &soap->xlist; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id=%s\n", content->id)); + while (*xp) + { register struct soap_xlist *xq = *xp; + if (!soap_match_cid(soap, xq->id, content->id)) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment %s for content id=%s\n", xq->id, content->id)); + *xp = xq->next; + *xq->ptr = (unsigned char*)content->ptr; + *xq->size = (int)content->size; + *xq->type = (char*)content->type; + if (content->options) + *xq->options = (char*)content->options; + else + *xq->options = (char*)content->description; + SOAP_FREE(soap, xq); + } + else + xp = &(*xp)->next; + } + } +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putmimehdr(struct soap *soap, struct soap_multipart *content) +{ const char *s; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type?content->type:SOAP_STR_EOS)); + if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n")) + return soap->error; + if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n")) + return soap->error; + s = soap_code_str(mime_codes, content->encoding); + if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n")) + return soap->error; + if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n")) + return soap->error; + if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n")) + return soap->error; + if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n")) + return soap->error; + return soap_send_raw(soap, "\r\n", 2); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putmime(struct soap *soap) +{ struct soap_multipart *content; + if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary) + return SOAP_OK; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n")); + for (content = soap->mime.first; content; content = content->next) + { void *handle; + if (soap->fmimereadopen && ((handle = soap->fmimereadopen(soap, (void*)content->ptr, content->id, content->type, content->description)) || soap->error)) + { size_t size = content->size; + if (!handle) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimereadopen failed\n")); + return soap->error; + } + if (soap_putmimehdr(soap, content)) + return soap->error; + if (!size) + { if ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming MIME\n")); + do + { size = soap->fmimeread(soap, handle, soap->tmpbuf, sizeof(soap->tmpbuf)); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread returned %lu bytes\n", (unsigned long)size)); + if (soap_send_raw(soap, soap->tmpbuf, size)) + break; + } while (size); + } + else + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: cannot chunk streaming MIME (no HTTP chunking)\n")); + } + } + else + { do + { size_t bufsize; + if (size < sizeof(soap->tmpbuf)) + bufsize = size; + else + bufsize = sizeof(soap->tmpbuf); + if (!(bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize))) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fmimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)content->size)); + soap->error = SOAP_EOF; + break; + } + if (soap_send_raw(soap, soap->tmpbuf, bufsize)) + break; + size -= bufsize; + } while (size); + } + if (soap->fmimereadclose) + soap->fmimereadclose(soap, handle); + } + else + { if (soap_putmimehdr(soap, content) + || soap_send_raw(soap, content->ptr, content->size)) + return soap->error; + } + } + return soap_send3(soap, "\r\n--", soap->mime.boundary, "--"); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_dime(struct soap *soap) +{ soap->omode |= SOAP_ENC_DIME; + soap->dime.first = NULL; + soap->dime.last = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_mime(struct soap *soap, const char *boundary, const char *start) +{ soap->omode |= SOAP_ENC_MIME; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->mime.boundary = soap_strdup(soap, boundary); + soap->mime.start = soap_strdup(soap, start); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_clr_dime(struct soap *soap) +{ soap->omode &= ~SOAP_ENC_DIME; + soap->dime.first = NULL; + soap->dime.last = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_clr_mime(struct soap *soap) +{ soap->omode &= ~SOAP_ENC_MIME; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->mime.boundary = NULL; + soap->mime.start = NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static struct soap_multipart* +soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size) +{ struct soap_multipart *content; + content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart)); + if (content) + { content->next = NULL; + content->ptr = ptr; + content->size = size; + content->id = NULL; + content->type = NULL; + content->options = NULL; + content->encoding = SOAP_MIME_NONE; + content->location = NULL; + content->description = NULL; + if (!*first) + *first = content; + if (*last) + (*last)->next = content; + *last = content; + } + return content; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) +{ struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size); + if (!content) + return SOAP_EOM; + content->id = soap_strdup(soap, id); + content->type = soap_strdup(soap, type); + content->options = soap_dime_option(soap, optype, option); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +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) +{ struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size); + if (!content) + return SOAP_EOM; + content->id = soap_strdup(soap, id); + content->type = soap_strdup(soap, type); + content->encoding = encoding; + content->location = soap_strdup(soap, location); + content->description = soap_strdup(soap, description); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +SOAP_FMAC1 +struct soap_multipart* +SOAP_FMAC2 +soap_next_multipart(struct soap_multipart *content) +{ if (content) + return content->next; + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static void +soap_select_mime_boundary(struct soap *soap) +{ while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) + { register char *s = soap->mime.boundary; + register size_t n = 0; + if (s) + n = strlen(s); + if (n < 16) + { n = 64; + s = soap->mime.boundary = (char*)soap_malloc(soap, n + 1); + if (!s) + return; + } + strcpy(s, "=="); + s += 2; + n -= 4; + while (n) + { *s++ = soap_base64o[soap_random & 0x3F]; + n--; + } + strcpy(s, "=="); + } + if (!soap->mime.start) + soap->mime.start = ""; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEANER +#ifndef PALM_1 +static int +soap_valid_mime_boundary(struct soap *soap) +{ register struct soap_multipart *content; + register size_t k; + if (soap->fmimeread) + return SOAP_OK; + k = strlen(soap->mime.boundary); + for (content = soap->mime.first; content; content = content->next) + { if (content->ptr && content->size >= k) + { register const char *p = (const char*)content->ptr; + register size_t i; + for (i = 0; i < content->size - k; i++, p++) + { if (!strncmp(p, soap->mime.boundary, k)) + return SOAP_ERR; + } + } + } + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************\ + * + * HTTP cookie handling + * +\******************************************************************************/ + +#ifdef WITH_COOKIES +/******************************************************************************/ +SOAP_FMAC1 +size_t +SOAP_FMAC2 +soap_encode_cookie(const char *s, char *t, size_t len) +{ register int c; + register size_t n = len; + while ((c = *s++) && --n > 0) + { if (c > ' ' && c < 128 && !strchr("()<>@,;:\\\"/[]?={}", c)) + *t++ = c; + else if (n > 2) + { *t++ = '%'; + *t++ = (c >> 4) + (c > 159 ? '7' : '0'); + c &= 0xF; + *t++ = c + (c > 9 ? '7' : '0'); + n -= 2; + } + else + break; + } + *t = '\0'; + return len - n; +} + +/******************************************************************************/ +SOAP_FMAC1 +struct soap_cookie* +SOAP_FMAC2 +soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie *p; + size_t n; + if (!domain) + domain = soap->cookie_domain; + if (!path) + path = soap->cookie_path; + if (!path) + path = SOAP_STR_EOS; + else if (*path == '/') + path++; + n = strlen(path); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie %s domain=%s path=%s\n", name, domain?domain:"(null)", path?path:"(null)")); + for (p = soap->cookies; p; p = p->next) + { 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)); + if (!strcmp(p->name, name) + && p->domain + && p->path + && !strcmp(p->domain, domain) + && !strncmp(p->path, path, n)) + break; + } + return p; +} + +/******************************************************************************/ +SOAP_FMAC1 +struct soap_cookie* +SOAP_FMAC2 +soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) +{ struct soap_cookie **p, *q; + int n; + if (!domain) + domain = soap->cookie_domain; + if (!path) + path = soap->cookie_path; + if (!path) + path = SOAP_STR_EOS; + else if (*path == '/') + path++; + q = soap_cookie(soap, name, domain, path); + 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)")); + if (!q) + { if ((q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) + { if ((q->name = (char*)SOAP_MALLOC(soap, strlen(name)+1))) + strcpy(q->name, name); + q->value = NULL; + q->domain = NULL; + q->path = NULL; + q->expire = 0; + q->maxage = -1; + q->version = 1; + q->secure = 0; + q->modified = 0; + for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--) + if (!strcmp((*p)->name, name) && (*p)->path && path && strcmp((*p)->path, path) < 0) + break; + if (n) + { q->next = *p; + *p = q; + } + else + { SOAP_FREE(soap, q->name); + SOAP_FREE(soap, q); + q = NULL; + } + } + } + else + q->modified = 1; + if (q) + { if (q->value) + { SOAP_FREE(soap, q->value); + q->value = NULL; + } + if (q->domain) + { SOAP_FREE(soap, q->domain); + q->domain = NULL; + } + if (q->path) + { SOAP_FREE(soap, q->path); + q->path = NULL; + } + if (value && *value && (q->value = (char*)SOAP_MALLOC(soap, strlen(value)+1))) + strcpy(q->value, value); + if (domain && (q->domain = (char*)SOAP_MALLOC(soap, strlen(domain)+1))) + strcpy(q->domain, domain); + if (path && (q->path = (char*)SOAP_MALLOC(soap, strlen(path)+1))) + strcpy(q->path, path); + q->session = 1; + q->env = 0; + } + return q; +} + +/******************************************************************************/ +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie **p, *q; + if (!domain) + domain = soap->cookie_domain; + if (!domain) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie domain not set\n", name?name:"(null)")); + return; + } + if (!path) + path = soap->cookie_path; + if (!path) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in clear cookie %s: cookie path not set\n", name?name:"(null)")); + return; + } + if (*path == '/') + path++; + for (p = &soap->cookies, q = *p; q; q = *p) + { if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path))) + { if (q->value) + SOAP_FREE(soap, q->value); + if (q->domain) + SOAP_FREE(soap, q->domain); + if (q->path) + SOAP_FREE(soap, q->path); + *p = q->next; + SOAP_FREE(soap, q); + } + else + p = &q->next; + } +} + +/******************************************************************************/ +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie *p; + if ((p = soap_cookie(soap, name, domain, path))) + return p->value; + return NULL; +} + +/******************************************************************************/ +SOAP_FMAC1 +char * +SOAP_FMAC2 +soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie *p; + if ((p = soap_cookie(soap, name, domain, path)) && p->env) + return p->value; + return NULL; +} + +/******************************************************************************/ +SOAP_FMAC1 +time_t +SOAP_FMAC2 +soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie *p; + if ((p = soap_cookie(soap, name, domain, path))) + return p->expire; + return -1; +} + +/******************************************************************************/ +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path) +{ struct soap_cookie *p; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age %ld: %s domain=%s path=%s\n", expire, name, domain?domain:"(null)", path?path:"(null)")); + if ((p = soap_cookie(soap, name, domain, path))) + { p->maxage = expire; + p->modified = 1; + return SOAP_OK; + } + return SOAP_ERR; +} + +/******************************************************************************/ +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie *p; + if ((p = soap_cookie(soap, name, domain, path))) + { p->session = 1; + p->modified = 1; + return SOAP_OK; + } + return SOAP_ERR; +} + +/******************************************************************************/ +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path) +{ struct soap_cookie *p; + if ((p = soap_cookie(soap, name, domain, path))) + { p->session = 0; + p->modified = 1; + return SOAP_OK; + } + return SOAP_ERR; +} + +/******************************************************************************/ +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putsetcookies(struct soap *soap) +{ struct soap_cookie *p; + char *s, tmp[4096]; + const char *t; + for (p = soap->cookies; p; p = p->next) + { + if (p->modified +#ifdef WITH_OPENSSL + || (!p->env && !soap->ssl == !p->secure) +#endif + ) + { s = tmp; + if (p->name) + s += soap_encode_cookie(p->name, s, tmp-s+4064); + if (p->value && *p->value) + { *s++ = '='; + s += soap_encode_cookie(p->value, s, tmp-s+4064); + } + if (p->domain && (int)strlen(p->domain) < tmp-s+4064) + { strcpy(s, ";Domain="); + strcat(s, p->domain); + } + else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064) + { strcpy(s, ";Domain="); + strcat(s, soap->cookie_domain); + } + strcat(s, ";Path=/"); + s += strlen(s); + if (p->path) + t = p->path; + else + t = soap->cookie_path; + if (t) + { if (*t == '/') + t++; + if ((int)strlen(t) < tmp-s+4064) + { if (strchr(t, '%')) /* already URL encoded? */ + { strcpy(s, t); + s += strlen(s); + } + else + s += soap_encode_cookie(t, s, tmp-s+4064); + } + } + if (p->version > 0 && s-tmp < 4060) + { sprintf(s, ";Version=%u", p->version); + s += strlen(s); + } + if (p->maxage >= 0 && s-tmp < 4060) + { sprintf(s, ";Max-Age=%ld", p->maxage); + s += strlen(s); + } + if (s-tmp < 4073 + && (p->secure +#ifdef WITH_OPENSSL + || soap->ssl +#endif + )) + strcpy(s, ";Secure"); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); + if ((soap->error = soap->fposthdr(soap, "Set-Cookie", tmp))) + return soap->error; + } + } + return SOAP_OK; +} + +/******************************************************************************/ +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure) +{ struct soap_cookie **p, *q; + unsigned int version = 0; + time_t now = time(NULL); + char *s, tmp[4096]; + p = &soap->cookies; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookies for domain=%s path=%s\n", domain, path)); + if (*path == '/') + path++; + while ((q = *p)) + { if (q->expire && now > q->expire) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name)); + SOAP_FREE(soap, q->name); + if (q->value) + SOAP_FREE(soap, q->value); + if (q->domain) + SOAP_FREE(soap, q->domain); + if (q->path) + SOAP_FREE(soap, q->path); + *p = q->next; + SOAP_FREE(soap, q); + } + else + { int flag; + char *t = q->domain; + size_t n = 0; + if (!t) + flag = 1; + else + { const char *r = strchr(t, ':'); + if (r) + n = r - t; + else + n = strlen(t); + flag = !strncmp(t, domain, n); + } + /* domain-level cookies, cannot compile when WITH_NOIO set */ +#ifndef WITH_NOIO + if (!flag) + { struct hostent *hostent = gethostbyname((char*)domain); + if (hostent) + { const char *r = strchr(hostent->h_name, '.'); + if (!r) + r = hostent->h_name; + flag = !strncmp(t, r, n); + } + } +#endif + if (flag + && (!q->path || !strncmp(q->path, path, strlen(q->path))) + && (!q->secure || secure)) + { s = tmp; + if (q->version != version) + { sprintf(s, "$Version=%u;", q->version); + version = q->version; + } + if (q->name) + s += soap_encode_cookie(q->name, s, tmp-s+4080); + if (q->value && *q->value) + { *s++ = '='; + s += soap_encode_cookie(q->value, s, tmp-s+4080); + } + if (q->path && *q->path && (int)strlen(q->path) < tmp-s+4080) + { sprintf(s, ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); + s += strlen(s); + } + if (q->domain && (int)strlen(q->domain) < tmp-s+4080) + sprintf(s, ";$Domain=\"%s\"", q->domain); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); + if ((soap->error = soap->fposthdr(soap, "Cookie", tmp))) + return soap->error; + } + p = &q->next; + } + } + return SOAP_OK; +} + +/******************************************************************************/ +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_getcookies(struct soap *soap, const char *val) +{ struct soap_cookie *p = NULL, *q; + const char *s; + char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ + char *domain = NULL; + char *path = NULL; + unsigned int version = 0; + time_t now = time(NULL); + if (!val) + return; + s = val; + while (*s) + { s = soap_decode_key(tmp, sizeof(tmp), s); + if (!soap_tag_cmp(tmp, "$Version")) + { if ((s = soap_decode_val(tmp, sizeof(tmp), s))) + { if (p) + p->version = (int)atol(tmp); + else + version = (int)atol(tmp); + } + } + else if (!soap_tag_cmp(tmp, "$Path")) + { s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) + strcpy(t, tmp); + } + else + t = NULL; + if (p) + { if (p->path) + SOAP_FREE(soap, p->path); + p->path = t; + } + else + { if (path) + SOAP_FREE(soap, path); + path = t; + } + } + else if (!soap_tag_cmp(tmp, "$Domain")) + { s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((t = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) + strcpy(t, tmp); + } + else + t = NULL; + if (p) + { if (p->domain) + SOAP_FREE(soap, p->domain); + p->domain = t; + } + else + { if (domain) + SOAP_FREE(soap, domain); + domain = t; + } + } + else if (p && !soap_tag_cmp(tmp, "Path")) + { if (p->path) + SOAP_FREE(soap, p->path); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((p->path = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) + strcpy(p->path, tmp); + } + else + p->path = NULL; + } + else if (p && !soap_tag_cmp(tmp, "Domain")) + { if (p->domain) + SOAP_FREE(soap, p->domain); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { if ((p->domain = (char*)SOAP_MALLOC(soap, strlen(tmp)+1))) + strcpy(p->domain, tmp); + } + else + p->domain = NULL; + } + else if (p && !soap_tag_cmp(tmp, "Version")) + { s = soap_decode_val(tmp, sizeof(tmp), s); + p->version = (unsigned int)atol(tmp); + } + else if (p && !soap_tag_cmp(tmp, "Max-Age")) + { s = soap_decode_val(tmp, sizeof(tmp), s); + p->expire = now + atol(tmp); + } + else if (p && !soap_tag_cmp(tmp, "Expires")) + { struct tm T; + char a[3]; + static const char mns[] = "anebarprayunulugepctovec"; + s = soap_decode_val(tmp, sizeof(tmp), s); + if (strlen(tmp) > 20) + { memset((void*)&T, 0, sizeof(T)); + a[0] = tmp[4]; + a[1] = tmp[5]; + a[2] = '\0'; + T.tm_mday = (int)atol(a); + a[0] = tmp[8]; + a[1] = tmp[9]; + T.tm_mon = (int)(strstr(mns, a) - mns) / 2; + a[0] = tmp[11]; + a[1] = tmp[12]; + T.tm_year = 100 + (int)atol(a); + a[0] = tmp[13]; + a[1] = tmp[14]; + T.tm_hour = (int)atol(a); + a[0] = tmp[16]; + a[1] = tmp[17]; + T.tm_min = (int)atol(a); + a[0] = tmp[19]; + a[1] = tmp[20]; + T.tm_sec = (int)atol(a); + p->expire = soap_timegm(&T); + } + } + else if (p && !soap_tag_cmp(tmp, "Secure")) + p->secure = 1; + else + { if (p) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%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)); + if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) + { q->version = p->version; + q->expire = p->expire; + q->secure = p->secure; + q->env = 1; + } + if (p->name) + SOAP_FREE(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } + if ((p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)))) + { p->name = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); + strcpy(p->name, tmp); + s = soap_decode_val(tmp, sizeof(tmp), s); + if (*tmp) + { p->value = (char*)SOAP_MALLOC(soap, strlen(tmp)+1); + strcpy(p->value, tmp); + } + else + p->value = NULL; + if (domain) + p->domain = domain; + else if (*soap->host) + { p->domain = (char*)SOAP_MALLOC(soap, strlen(soap->host)+1); + strcpy(p->domain, soap->host); + } + else + p->domain = NULL; + if (path) + p->path = path; + else if (soap->path && *soap->path) + { p->path = (char*)SOAP_MALLOC(soap, strlen(soap->path)+1); + strcpy(p->path, soap->path); + } + else + { p->path = (char*)SOAP_MALLOC(soap, 2); + strcpy(p->path, "/"); + } + p->expire = 0; + p->secure = 0; + p->version = version; + } + } + } + if (p) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%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)); + if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path))) + { q->version = p->version; + q->expire = p->expire; + q->secure = p->secure; + q->env = 1; + } + if (p->name) + SOAP_FREE(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } + if (domain) + SOAP_FREE(soap, domain); + if (path) + SOAP_FREE(soap, path); +} + +/******************************************************************************/ +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_getenv_cookies(struct soap *soap) +{ struct soap_cookie *p; + const char *s; + char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */ + if (!(s = getenv("HTTP_COOKIE"))) + return SOAP_ERR; + do + { s = soap_decode_key(key, sizeof(key), s); + s = soap_decode_val(val, sizeof(val), s); + p = soap_set_cookie(soap, key, val, NULL, NULL); + if (p) + p->env = 1; + } while (*s); + return SOAP_OK; +} + +/******************************************************************************/ +SOAP_FMAC1 +struct soap_cookie* +SOAP_FMAC2 +soap_copy_cookies(struct soap *copy, const struct soap *soap) +{ struct soap_cookie *p, **q, *r; + q = &r; + for (p = soap->cookies; p; p = p->next) + { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)))) + return r; + **q = *p; + if (p->name) + { if (((*q)->name = (char*)SOAP_MALLOC(copy, strlen(p->name)+1))) + strcpy((*q)->name, p->name); + } + if (p->value) + { if (((*q)->value = (char*)SOAP_MALLOC(copy, strlen(p->value)+1))) + strcpy((*q)->value, p->value); + } + if (p->domain) + { if (((*q)->domain = (char*)SOAP_MALLOC(copy, strlen(p->domain)+1))) + strcpy((*q)->domain, p->domain); + } + if (p->path) + { if (((*q)->path = (char*)SOAP_MALLOC(copy, strlen(p->path)+1))) + strcpy((*q)->path, p->path); + } + q = &(*q)->next; + } + *q = NULL; + return r; +} + +/******************************************************************************/ +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_free_cookies(struct soap *soap) +{ struct soap_cookie *p; + for (p = soap->cookies; p; p = soap->cookies) + { soap->cookies = p->next; + SOAP_FREE(soap, p->name); + if (p->value) + SOAP_FREE(soap, p->value); + if (p->domain) + SOAP_FREE(soap, p->domain); + if (p->path) + SOAP_FREE(soap, p->path); + SOAP_FREE(soap, p); + } +} + +/******************************************************************************/ +#endif /* WITH_COOKIES */ + +/******************************************************************************/ +#ifdef WITH_GZIP +#ifndef PALM_1 +static int +soap_getgziphdr(struct soap *soap) +{ int i; + soap_wchar c = 0, f = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n")); + for (i = 0; i < 9; i++) + { if ((int)(c = soap_get1(soap) == EOF)) + return soap->error = SOAP_EOF; + if (i == 2) + f = c; + } + if (f & 0x04) /* FEXTRA */ + { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--) + { if ((int)soap_get1(soap) == EOF) + return soap->error = SOAP_EOF; + } + } + if (f & 0x08) /* FNAME */ + { do + c = soap_get1(soap); + while (c && (int)c != EOF); + } + if ((int)c != EOF && (f & 0x10)) /* FCOMMENT */ + { do + c = soap_get1(soap); + while (c && (int)c != EOF); + } + if ((int)c != EOF && (f & 0x01)) /* FHCRC */ + { if ((int)(c = soap_get1(soap)) != EOF) + c = soap_get1(soap); + } + if ((int)c == EOF) + return soap->error = SOAP_EOF; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_begin_recv(struct soap *soap) +{ soap_wchar c; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input\n")); + soap->error = SOAP_OK; + soap_free_temp(soap); + soap_set_local_namespaces(soap); + soap->version = 0; /* don't assume we're parsing SOAP content by default */ +#ifndef WITH_NOIDREF + soap_free_iht(soap); +#endif + if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK) + soap->omode |= SOAP_IO_CHUNK; + soap->imode &= ~(SOAP_IO | SOAP_ENC_MIME); + soap->mode = soap->imode; + if (!soap->keep_alive) + { soap->buflen = 0; + soap->bufidx = 0; + } + if (!(soap->mode & SOAP_IO_KEEPALIVE)) + soap->keep_alive = 0; + soap->ahead = 0; + soap->peeked = 0; + soap->level = 0; + soap->part = SOAP_BEGIN; + soap->alloced = 0; + soap->count = 0; + soap->length = 0; + soap->cdata = 0; + *soap->endpoint = '\0'; + soap->action = NULL; + soap->header = NULL; + soap->fault = NULL; + soap->status = 0; +#ifndef WITH_LEANER + soap->dom = NULL; + soap->dime.chunksize = 0; + soap->dime.buflen = 0; + soap->dime.list = NULL; + soap->dime.first = NULL; + soap->dime.last = NULL; + soap->mime.list = NULL; + soap->mime.first = NULL; + soap->mime.last = NULL; + soap->mime.boundary = NULL; + soap->mime.start = NULL; +#endif +#ifdef WIN32 +#ifndef UNDER_CE +#ifndef WITH_FASTCGI + if (!soap_valid_socket(soap->socket)) + _setmode(soap->recvfd, _O_BINARY); +#endif +#endif +#endif +#ifdef WITH_ZLIB + soap->mode &= ~SOAP_ENC_ZLIB; + soap->zlib_in = SOAP_ZLIB_NONE; + soap->zlib_out = SOAP_ZLIB_NONE; + soap->d_stream->next_in = Z_NULL; + soap->d_stream->avail_in = 0; + soap->d_stream->next_out = (Byte*)soap->buf; + soap->d_stream->avail_out = SOAP_BUFLEN; + soap->z_ratio_in = 1.0; +#endif +#ifdef WITH_OPENSSL + if (soap->ssl) + ERR_clear_error(); +#endif +#ifndef WITH_LEANER + if (soap->fprepareinit) + soap->fprepareinit(soap); +#endif + c = soap_getchar(soap); +#ifdef WITH_GZIP + if (c == 0x1F) + { if (soap_getgziphdr(soap)) + return soap->error; + if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + soap->zlib_state = SOAP_ZLIB_INFLATE; + soap->mode |= SOAP_ENC_ZLIB; + soap->zlib_in = SOAP_ZLIB_GZIP; + soap->z_crc = crc32(0L, NULL, 0); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); + if (!soap->z_buf) + soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); + memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); + /* should not chunk over plain transport, so why bother to check? */ + /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */ + /* soap->z_buflen = soap->bufidx; */ + /* else */ + soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); + soap->d_stream->avail_in = soap->buflen - soap->bufidx; + soap->z_buflen = soap->buflen; + soap->buflen = soap->bufidx; + c = soap_getchar(soap); + } +#endif +#ifndef WITH_LEANER + if (c == '-' && soap_get0(soap) == '-') + soap->mode |= SOAP_ENC_MIME; + else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20) + soap->mode |= SOAP_ENC_DIME; + else +#endif + { while (soap_blank(c)) + c = soap_getchar(soap); + } + if ((int)c == EOF) + return soap->error = SOAP_EOF; + soap_unget(soap, c); +#ifndef WITH_NOHTTP + /* if not XML or (start of)BOM or MIME/DIME/ZLIB, assume HTTP header */ + if (c != '<' && c != 0xEF && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB))) + { soap_mode m = soap->imode; + soap->mode &= ~SOAP_IO; + soap->error = soap->fparse(soap); + if (soap->error == 401) /* KMD ADDED: avoid close socket when receive 401 and Connection != Close*/ + { + return soap->error; + } + if (soap->error && soap->error < SOAP_STOP) + { soap->keep_alive = 0; /* force close later */ + return soap->error; + } + if (soap->error == SOAP_STOP) + return soap->error; + soap->mode = soap->imode; /* if imode is changed, effectuate */ + soap->imode = m; /* restore imode */ +#ifdef WITH_ZLIB + soap->mode &= ~SOAP_ENC_ZLIB; +#endif + if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) + { soap->chunkbuflen = soap->buflen; + soap->buflen = soap->bufidx; + soap->chunksize = 0; + } +#ifndef WITH_LEANER + else if (soap->fpreparerecv && soap->buflen != soap->bufidx) + soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); +#endif + /* Note: fparse should not use soap_unget to push back last char */ + if (soap_get0(soap) == (int)EOF) + { if (soap->status == 200) + return soap->error = SOAP_NO_DATA; /* HTTP OK: always expect data */ + return soap->error = soap->status; + } +#ifdef WITH_ZLIB + if (soap->zlib_in != SOAP_ZLIB_NONE) + { +#ifdef WITH_GZIP + if (soap->zlib_in != SOAP_ZLIB_DEFLATE) + { c = soap_get1(soap); + if (c == 0x1F) + { if (soap_getgziphdr(soap)) + return soap->error; + if (inflateInit2(soap->d_stream, -MAX_WBITS) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + soap->z_crc = crc32(0L, NULL, 0); + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n")); + } + else + { soap_revget1(soap); + if (inflateInit(soap->d_stream) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + soap->zlib_in = SOAP_ZLIB_DEFLATE; + } + } + else +#endif + if (inflateInit(soap->d_stream) != Z_OK) + return soap->error = SOAP_ZLIB_ERROR; + soap->zlib_state = SOAP_ZLIB_INFLATE; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n")); + soap->mode |= SOAP_ENC_ZLIB; + if (!soap->z_buf) + soap->z_buf = (char*)SOAP_MALLOC(soap, SOAP_BUFLEN); + memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN); + soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); + soap->d_stream->avail_in = soap->buflen - soap->bufidx; + soap->z_buflen = soap->buflen; + soap->buflen = soap->bufidx; + } +#endif + if (soap->error) + { if (soap->error == SOAP_FORM && soap->fform) + { soap->error = soap->fform(soap); + if (soap->error == SOAP_OK) + soap->error = SOAP_STOP; /* prevents further processing */ + } + return soap->error; + } + } +#endif +#ifndef WITH_LEANER + if (soap->mode & SOAP_ENC_MIME) + { if (soap_getmimehdr(soap)) + return soap->error; + if (soap->mime.start) + { do + { if (!soap->mime.last->id) + break; + if (!soap_match_cid(soap, soap->mime.start, soap->mime.last->id)) + break; + } while (soap_get_mime_attachment(soap, NULL)); + } + if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime")) + soap->mode |= SOAP_ENC_DIME; + } + if (soap->mode & SOAP_ENC_DIME) + { if (soap_getdimehdr(soap)) + return soap->error; + if (soap->dime.flags & SOAP_DIME_CF) + { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n")); + soap->dime.chunksize = soap->dime.size; + if (soap->buflen - soap->bufidx >= soap->dime.chunksize) + { soap->dime.buflen = soap->buflen; + soap->buflen = soap->bufidx + soap->dime.chunksize; + } + else + soap->dime.chunksize -= soap->buflen - soap->bufidx; + } + soap->count = soap->buflen - soap->bufidx; + } +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_parse(struct soap *soap) +{ char header[SOAP_HDRLEN], *s; + unsigned short httpcmd = 0, status = 0, k = 0; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); + *soap->endpoint = '\0'; + soap->length = 0; + soap->userid = NULL; + soap->passwd = NULL; + soap->action = NULL; + soap->authrealm = NULL; + soap->proxy_from = NULL; + soap->http_content = NULL; + soap->status = 0; + do + { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) + { if (soap->error == SOAP_EOF) + return SOAP_EOF; + return soap->error = 414; + } + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf)); + for (;;) + { if (soap_getline(soap, header, SOAP_HDRLEN)) + { if (soap->error == SOAP_EOF) + { soap->error = SOAP_OK; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "EOF in HTTP header, continue anyway\n")); + break; + } + return soap->error; + } + if (!*header) + break; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header)); + s = strchr(header, ':'); + if (s) + { char *t; + *s = '\0'; + do s++; + while (*s && *s <= 32); + if (*s == '"') + s++; + t = s + strlen(s) - 1; + while (t > s && *t <= 32) + t--; + if (t >= s && *t == '"') + t--; + t[1] = '\0'; + if ((soap->error = soap->fparsehdr(soap, header, s))) + { if (soap->error < SOAP_STOP) + return soap->error; + status = soap->error; + soap->error = SOAP_OK; + } + } + } + if ((s = strchr(soap->msgbuf, ' '))) + { k = (unsigned short)soap_strtoul(s, &s, 10); + if (!soap_blank(*s)) + k = 0; + } + else + k = 0; + } while (k == 100); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", k)); + s = strstr(soap->msgbuf, "HTTP/"); + if (s && s[7] != '1') + { if (soap->keep_alive == 1) + soap->keep_alive = 0; + if (k == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* k == 0 for HTTP request */ + { soap->imode |= SOAP_IO_CHUNK; + soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; + } + } + if (soap->keep_alive < 0) + soap->keep_alive = 1; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); + if (k == 0) + { size_t l = 0; + if (s) + { if (!strncmp(soap->msgbuf, "POST ", l = 5)) + httpcmd = 1; + else if (!strncmp(soap->msgbuf, "GET ", l = 4)) + httpcmd = 2; + else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) + httpcmd = 3; + else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) + httpcmd = 4; + else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) + httpcmd = 5; + } + if (s && httpcmd) + { size_t m = strlen(soap->endpoint); + size_t n = m + (s - soap->msgbuf) - l - 1; + if (m > n) + m = n; + if (n >= sizeof(soap->endpoint)) + n = sizeof(soap->endpoint) - 1; + strncpy(soap->path, soap->msgbuf + l, n - m); + soap->path[n - m] = '\0'; + strcat(soap->endpoint, soap->path); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint)); + if (httpcmd > 1) + { switch (httpcmd) + { case 2: soap->error = soap->fget(soap); break; + case 3: soap->error = soap->fput(soap); break; + case 4: soap->error = soap->fdel(soap); break; + case 5: soap->error = soap->fhead(soap); break; + default: soap->error = SOAP_HTTP_METHOD; break; + } + if (soap->error == SOAP_OK) + soap->error = SOAP_STOP; /* prevents further processing */ + return soap->error; + } + if (status) + return soap->error = status; + } + else if (status) + return soap->error = status; + else if (s) + return soap->error = 405; + } + soap->status = k; + /* Status OK (HTTP 200) */ + if (k == 0 || k == 200) + return SOAP_OK; + /* Status 201 (Created), 202 (Accepted), ... and HTTP 400 and 500 errors + require normal return to try parsing SOAP/XML body. + Otherwise, try to parse HTTP body. + */ + if(k==401 && soap->keep_alive!=0) /* KMD ADDED: avoid close socket when receive 401 and Connection != Close*/ + return soap->error = k; + if (soap->length > 0 || (soap->imode & SOAP_IO) == SOAP_IO_CHUNK) + { if (((k > 200 && k <= 299) || k == 400 || k == 500)) + return SOAP_OK; + /* force close afterwards in soap_closesock() */ + soap->keep_alive = 0; + /* read HTTP body for error details */ + s = soap_get_http_body(soap); + if (s) + return soap_set_receiver_error(soap, soap->msgbuf, s, k); + } + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP error %d\n", k)); + return soap_set_receiver_error(soap, "HTTP Error", soap->msgbuf, k); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_parse_header(struct soap *soap, const char *key, const char *val) +{ if (!soap_tag_cmp(key, "Host")) + { +#ifdef WITH_OPENSSL + if (soap->imode & SOAP_ENC_SSL) + strcpy(soap->endpoint, "https://"); + else +#endif + strcpy(soap->endpoint, "http://"); + strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8); + soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; + } +#ifndef WITH_LEANER + else if (!soap_tag_cmp(key, "Content-Type")) + { const char *action; + soap->http_content = soap_strdup(soap, val); + if (soap_get_header_attribute(soap, val, "application/dime")) + soap->imode |= SOAP_ENC_DIME; + else if (soap_get_header_attribute(soap, val, "multipart/related") + || soap_get_header_attribute(soap, val, "multipart/form-data")) + { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary")); + soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start")); + soap->imode |= SOAP_ENC_MIME; + } + action = soap_get_header_attribute(soap, val, "action"); + if (action) + { if (*action == '"') + { soap->action = soap_strdup(soap, action + 1); + soap->action[strlen(soap->action) - 1] = '\0'; + } + else + soap->action = soap_strdup(soap, action); + } + } +#endif + else if (!soap_tag_cmp(key, "Content-Length")) + { soap->length = soap_strtoul(val, NULL, 10); + } + else if (!soap_tag_cmp(key, "Content-Encoding")) + { if (!soap_tag_cmp(val, "deflate")) +#ifdef WITH_ZLIB + soap->zlib_in = SOAP_ZLIB_DEFLATE; +#else + return SOAP_ZLIB_ERROR; +#endif + else if (!soap_tag_cmp(val, "gzip")) +#ifdef WITH_GZIP + soap->zlib_in = SOAP_ZLIB_GZIP; +#else + return SOAP_ZLIB_ERROR; +#endif + } +#ifdef WITH_ZLIB + else if (!soap_tag_cmp(key, "Accept-Encoding")) + { +#ifdef WITH_GZIP + if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip")) + soap->zlib_out = SOAP_ZLIB_GZIP; + else +#endif + if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate")) + soap->zlib_out = SOAP_ZLIB_DEFLATE; + else + soap->zlib_out = SOAP_ZLIB_NONE; + } +#endif + else if (!soap_tag_cmp(key, "Transfer-Encoding")) + { soap->imode &= ~SOAP_IO; + if (!soap_tag_cmp(val, "chunked")) + soap->imode |= SOAP_IO_CHUNK; + } + else if (!soap_tag_cmp(key, "Connection")) + { if (!soap_tag_cmp(val, "keep-alive")) + soap->keep_alive = -soap->keep_alive; + else if (!soap_tag_cmp(val, "close")) + soap->keep_alive = 0; + } +#ifndef WITH_LEAN + else if (!soap_tag_cmp(key, "Authorization")) + { if (!soap_tag_cmp(val, "Basic *")) + { int n; + char *s; + soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n); + soap->tmpbuf[n] = '\0'; + if ((s = strchr(soap->tmpbuf, ':'))) + { *s = '\0'; + soap->userid = soap_strdup(soap, soap->tmpbuf); + soap->passwd = soap_strdup(soap, s + 1); + } + } + } + else if (!soap_tag_cmp(key, "WWW-Authenticate")) + { soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val + 6, "realm")); + } + else if (!soap_tag_cmp(key, "Expect")) + { if (!soap_tag_cmp(val, "100-continue")) + { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)) + || (soap->error = soap->fposthdr(soap, NULL, NULL))) + return soap->error; + } + } +#endif + else if (!soap_tag_cmp(key, "SOAPAction")) + { if (*val == '"') + { soap->action = soap_strdup(soap, val + 1); + soap->action[strlen(soap->action) - 1] = '\0'; + } + else + soap->action = soap_strdup(soap, val); + } + else if (!soap_tag_cmp(key, "Location")) + { strncpy(soap->endpoint, val, sizeof(soap->endpoint)); + soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; + } + else if (!soap_tag_cmp(key, "X-Forwarded-For")) + { soap->proxy_from = soap_strdup(soap, val); + } +#ifdef WITH_COOKIES + else if (!soap_tag_cmp(key, "Cookie") + || !soap_tag_cmp(key, "Cookie2") + || !soap_tag_cmp(key, "Set-Cookie") + || !soap_tag_cmp(key, "Set-Cookie2")) + { soap_getcookies(soap, val); + } +#endif + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_get_header_attribute(struct soap *soap, const char *line, const char *key) +{ register const char *s = line; + if (s) + { while (*s) + { register short flag; + s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s); + flag = soap_tag_cmp(soap->tmpbuf, key); + s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s); + if (!flag) + return soap->tmpbuf; + } + } + return NULL; +} +#endif +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_decode_key(char *buf, size_t len, const char *val) +{ return soap_decode(buf, len, val, "=,;"); +} +#endif +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#ifndef PALM_1 +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_decode_val(char *buf, size_t len, const char *val) +{ if (*val != '=') + { *buf = '\0'; + return val; + } + return soap_decode(buf, len, val + 1, ",;"); +} +#endif +#endif + +/******************************************************************************/ +#if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) +#ifndef PALM_1 +static const char* +soap_decode(char *buf, size_t len, const char *val, const char *sep) +{ const char *s; + char *t = buf; + for (s = val; *s; s++) + if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) + break; + if (*s == '"') + { s++; + while (*s && *s != '"' && --len) + *t++ = *s++; + } + else + { while (*s && !soap_blank(*s) && !strchr(sep, *s) && --len) + { if (*s == '%') + { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4) + + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0'); + s += 3; + } + else + *t++ = *s++; + } + } + *t = '\0'; + while (*s && !strchr(sep, *s)) + s++; + return s; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_envelope_begin_out(struct soap *soap) +{ +#ifndef WITH_LEANER + size_t n = 0; + if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && strlen(soap->mime.boundary) + strlen(soap->mime.start) < sizeof(soap->tmpbuf) - 80 ) + { const char *s; + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + s = "application/dime"; + else if (soap->version == 2) + { if (soap->mode & SOAP_ENC_MTOM) + s = "application/xop+xml; charset=utf-8; type=\"application/soap+xml\""; + else + s = "application/soap+xml; charset=utf-8"; + } + else if (soap->mode & SOAP_ENC_MTOM) + s = "application/xop+xml; text/xml; charset=utf-8"; + else + s = "text/xml; charset=utf-8"; + 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); + n = strlen(soap->tmpbuf); + if (soap_send_raw(soap, soap->tmpbuf, n)) + return soap->error; + } + if (soap->mode & SOAP_IO_LENGTH) + soap->dime.size = soap->count; /* DIME in MIME correction */ + if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) + { if (soap_putdimehdr(soap)) + return soap->error; + } +#endif + soap->part = SOAP_IN_ENVELOPE; + return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_envelope_end_out(struct soap *soap) +{ if (soap_element_end_out(soap, "SOAP-ENV:Envelope")) + return soap->error; +#ifndef WITH_LEANER + if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + { soap->dime.size = soap->count - soap->dime.size; /* DIME in MIME correction */ + sprintf(soap->id, soap->dime_id_format, 0); + soap->dime.id = soap->id; + if (soap->local_namespaces) + { if (soap->local_namespaces[0].out) + soap->dime.type = (char*)soap->local_namespaces[0].out; + else + soap->dime.type = (char*)soap->local_namespaces[0].ns; + } + soap->dime.options = NULL; + soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI; + if (!soap->dime.first) + soap->dime.flags |= SOAP_DIME_ME; + soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + (soap->dime.type ? ((strlen(soap->dime.type)+3)&(~3)) : 0); + } + if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) + return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3); +#endif + soap->part = SOAP_END_ENVELOPE; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static char* +soap_get_http_body(struct soap *soap) +{ +#ifndef WITH_LEAN + register size_t l = 0, n = 0; + register char *s; + /* get HTML body of HTTP error content */ + if (!(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) + { n = soap->length; + if (!n) + return NULL; + } +#ifdef WITH_FAST + soap->labidx = 0; /* use look-aside buffer */ +#else + if (soap_new_block(soap) == NULL) + return NULL; +#endif + for (;;) + { +#ifdef WITH_FAST + register size_t i, k; + if (soap_append_lab(soap, NULL, 0)) /* allocate more space in look-aside buffer if necessary */ + return NULL; + s = soap->labbuf + soap->labidx; /* space to populate */ + k = soap->lablen - soap->labidx; /* number of bytes available */ + soap->labidx = soap->lablen; /* claim this space */ +#else + register size_t i, k = SOAP_BLKLEN; + if (!(s = (char*)soap_push_block(soap, NULL, k))) + return NULL; +#endif + for (i = 0; i < k; i++) + { register soap_wchar c = soap_getchar(soap); + if ((int)c == EOF) + goto end; + *s++ = (char)(c & 0xFF); + l++; + if (n > 0 && l >= n) + goto end; + } + } +end: + *s = '\0'; +#ifdef WITH_FAST + s = soap_strdup(soap, soap->labbuf); +#else + soap_size_block(soap, NULL, i+1); + s = soap_save_block(soap, NULL, 0); +#endif + return s; +#else + return NULL; +#endif +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_envelope_begin_in(struct soap *soap) +{ register struct Namespace *p; + soap->part = SOAP_IN_ENVELOPE; + if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) + { if (soap->error == SOAP_TAG_MISMATCH + && !soap_element_begin_in(soap, "Envelope", 0, NULL)) + soap->error = SOAP_VERSIONMISMATCH; + else if (soap->status) + soap->error = soap->status; + return soap->error; + } + p = soap->local_namespaces; + if (p) + { const char *ns = p[0].out; + if (!ns) + ns = p[0].ns; + if (!strcmp(ns, soap_env1)) + { soap->version = 1; /* make sure we use SOAP 1.1 */ + if (p[1].out) + SOAP_FREE(soap, p[1].out); + if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)))) + strcpy(p[1].out, soap_enc1); + } + else if (!strcmp(ns, soap_env2)) + { soap->version = 2; /* make sure we use SOAP 1.2 */ + if (p[1].out) + SOAP_FREE(soap, p[1].out); + if ((p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)))) + strcpy(p[1].out, soap_enc2); + } + } + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_envelope_end_in(struct soap *soap) +{ soap->part = SOAP_END_ENVELOPE; + return soap_element_end_in(soap, "SOAP-ENV:Envelope"); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_body_begin_out(struct soap *soap) +{ soap->part = SOAP_IN_BODY; + if (soap->version == 1) + soap->encoding = 1; +#ifndef WITH_LEAN + if ((soap->mode & SOAP_XML_SEC) && soap_set_attr(soap, "wsu:Id", "Body")) + return soap->error; +#endif + if (soap_element(soap, "SOAP-ENV:Body", 0, NULL)) + return soap->error; + return soap_element_start_end_out(soap, NULL); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_body_end_out(struct soap *soap) +{ if (soap_element_end_out(soap, "SOAP-ENV:Body")) + return soap->error; + soap->part = SOAP_END_BODY; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_body_begin_in(struct soap *soap) +{ soap->part = SOAP_IN_BODY; + if (soap_element_begin_in(soap, "SOAP-ENV:Body", 0, NULL)) + return soap->error; + if (!soap->body) + soap->part = SOAP_NO_BODY; + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_body_end_in(struct soap *soap) +{ if (soap->part == SOAP_NO_BODY) + return SOAP_OK; + soap->part = SOAP_END_BODY; + return soap_element_end_in(soap, "SOAP-ENV:Body"); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_header(struct soap *soap) +{ if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) + soap->error = SOAP_OK; + else if (soap->error == SOAP_OK && soap->fheader) + soap->error = soap->fheader(soap); + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_endpoint(struct soap *soap, const char *endpoint) +{ register const char *s; + register size_t i, n; + soap->endpoint[0] = '\0'; + soap->host[0] = '\0'; + soap->path[0] = '/'; + soap->path[1] = '\0'; + soap->port = 80; + if (!endpoint || !*endpoint) + return; +#ifdef WITH_OPENSSL + if (!soap_tag_cmp(endpoint, "https:*")) + soap->port = 443; +#endif + strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1); + soap->endpoint[sizeof(soap->endpoint) - 1] = '\0'; + s = strchr(endpoint, ':'); + if (s && s[1] == '/' && s[2] == '/') + s += 3; + else + s = endpoint; + n = strlen(s); + if (n >= sizeof(soap->host)) + n = sizeof(soap->host) - 1; +#ifdef WITH_IPV6 + if (s[0] == '[') + { s++; + for (i = 0; i < n; i++) + { if (s[i] == ']') + { s++; + --n; + break; + } + soap->host[i] = s[i]; + } + } + else + { for (i = 0; i < n; i++) + { soap->host[i] = s[i]; + if (s[i] == '/' || s[i] == ':') + break; + } + } +#else + for (i = 0; i < n; i++) + { soap->host[i] = s[i]; + if (s[i] == '/' || s[i] == ':') + break; + } +#endif + soap->host[i] = '\0'; + if (s[i] == ':') + { soap->port = (int)atol(s + i + 1); + for (i++; i < n; i++) + if (s[i] == '/') + break; + } + if (i < n && s[i]) + { strncpy(soap->path, s + i, sizeof(soap->path)); + soap->path[sizeof(soap->path) - 1] = '\0'; + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_connect(struct soap *soap, const char *endpoint, const char *action) +{ return soap_connect_command(soap, SOAP_POST, endpoint, action); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) +{ char *endpoint; + const char *s; + if (endpoints && (s = strchr(endpoints, ' '))) + { endpoint = (char*)SOAP_MALLOC(soap, strlen(endpoints) + 1); + for (;;) + { strncpy(endpoint, endpoints, s - endpoints); + endpoint[s - endpoints] = '\0'; + if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) + break; + if (!*s) + break; + soap->error = SOAP_OK; + while (*s == ' ') + s++; + endpoints = s; + s = strchr(endpoints, ' '); + if (!s) + s = endpoints + strlen(endpoints); + } + SOAP_FREE(soap, endpoint); + } + else + soap_try_connect_command(soap, http_command, endpoints, action); + return soap->error; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static int +soap_try_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action) +{ char host[sizeof(soap->host)]; + int port; + size_t count; + soap->error = SOAP_OK; + strcpy(host, soap->host); /* save previous host name: if != then reconnect */ + port = soap->port; /* save previous port to compare */ + soap->status = http_command; + soap_set_endpoint(soap, endpoint); +#ifndef WITH_LEANER + if (soap->fconnect) + { if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port))) + return soap->error; + } + else +#endif + if (soap->fopen && *soap->host) + { if (!soap->keep_alive || !soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port || !soap->fpoll || soap->fpoll(soap)) + { soap->keep_alive = 0; /* to force close */ + soap->omode &= ~SOAP_IO_UDP; /* to force close */ + soap_closesock(soap); + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect/reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port)); +#ifndef WITH_LEAN + if (!strncmp(endpoint, "soap.udp:", 9)) + soap->omode |= SOAP_IO_UDP; +#endif + soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); + if (soap->error) + return soap->error; + soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0); + } + } + count = soap_count_attachments(soap); + if (soap_begin_send(soap)) + return soap->error; + if (http_command != SOAP_POST) + { soap->mode &= ~SOAP_IO; + soap->mode |= SOAP_IO_BUFFER; + } +#ifndef WITH_NOHTTP + soap->action = soap_strdup(soap, action); + if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint) + { unsigned int k = soap->mode; + soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); + if ((k & SOAP_IO) != SOAP_IO_FLUSH) + soap->mode |= SOAP_IO_BUFFER; + if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count))) + return soap->error; +#ifndef WITH_LEANER + if ((k & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = k; + } + if (http_command != SOAP_POST) + return soap_end_send(soap); +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) +{ register int i; + register unsigned long m; + register char *p; + if (!t) + t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1); + if (!t) + return NULL; + p = t; + t[0] = '\0'; + if (!s) + return p; + for (; n > 2; n -= 3, s += 3) + { m = s[0]; + m = (m << 8) | s[1]; + m = (m << 8) | s[2]; + for (i = 4; i > 0; m >>= 6) + t[--i] = soap_base64o[m & 0x3F]; + t += 4; + } + t[0] = '\0'; + if (n > 0) + { m = 0; + for (i = 0; i < n; i++) + m = (m << 8) | *s++; + for (; i < 3; i++) + m <<= 8; + for (i++; i > 0; m >>= 6) + t[--i] = soap_base64o[m & 0x3F]; + for (i = 3; i > n; i--) + t[i] = '='; + t[4] = '\0'; + } + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) +{ register int i, j, c; + register unsigned long m; + register const char *p; + if (!s || !*s) + { if (n) + *n = 0; + if (soap->error) + return NULL; + return SOAP_NON_NULL; + } + if (!t) + { l = (strlen(s) + 3) / 4 * 3; + t = (char*)soap_malloc(soap, l); + } + if (!t) + return NULL; + p = t; + if (n) + *n = 0; + for (;;) + { for (i = 0; i < SOAP_BLKLEN; i++) + { m = 0; + j = 0; + while (j < 4) + { c = *s++; + if (c == '=' || !c) + { i *= 3; + switch (j) + { case 2: + *t++ = (char)((m >> 4) & 0xFF); + i++; + break; + case 3: + *t++ = (char)((m >> 10) & 0xFF); + *t++ = (char)((m >> 2) & 0xFF); + i += 2; + } + if (n) + *n += i; + return p; + } + c -= '+'; + if (c >= 0 && c <= 79) + { int b = soap_base64i[c]; + if (b >= 64) + { soap->error = SOAP_TYPE; + return NULL; + } + m = (m << 6) + b; + j++; + } + else if (!soap_blank(c + '+')) + { soap->error = SOAP_TYPE; + return NULL; + } + } + *t++ = (char)((m >> 16) & 0xFF); + *t++ = (char)((m >> 8) & 0xFF); + *t++ = (char)(m & 0xFF); + if (l < 3) + { if (n) + *n += i; + return p; + } + l -= 3; + } + if (n) + *n += 3 * SOAP_BLKLEN; + } +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) +{ register char *p; + if (!t) + t = (char*)soap_malloc(soap, 2 * n + 1); + if (!t) + return NULL; + p = t; + t[0] = '\0'; + if (s) + { for (; n > 0; n--) + { register int m = *s++; + *t++ = (char)((m >> 4) + (m > 159 ? 'a' - 10 : '0')); + m &= 0x0F; + *t++ = (char)(m + (m > 9 ? 'a' - 10 : '0')); + } + } + *t++ = '\0'; + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +SOAP_FMAC1 +const char* +SOAP_FMAC2 +soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) +{ register const char *p; + if (!s || !*s) + { if (n) + *n = 0; + if (soap->error) + return NULL; + return SOAP_NON_NULL; + } + if (!t) + { l = strlen(s) / 2; + t = (char*)soap_malloc(soap, l); + } + if (!t) + return NULL; + p = t; + while (l) + { register int d1, d2; + d1 = *s++; + if (!d1) + break; + d2 = *s++; + if (!d2) + break; + *t++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); + l--; + } + if (n) + *n = (int)(t - p); + return p; +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_puthttphdr(struct soap *soap, int status, size_t count) +{ if (soap->status != SOAP_GET) + { register const char *s = "text/xml; charset=utf-8"; + register int err = SOAP_OK; +#ifndef WITH_LEANER + register const char *r = NULL; +#endif + if (status == SOAP_FILE && soap->http_content) + s = soap->http_content; + else if (status == SOAP_HTML) + s = "text/html; charset=utf-8"; + else if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) + { if (soap->version == 2) + s = "application/soap+xml; charset=utf-8"; + } +#ifndef WITH_LEANER + if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) + { if (soap->mode & SOAP_ENC_MTOM) + { r = s; + s = "application/xop+xml; charset=utf-8"; + } + else + s = "application/dime"; + } + 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) + { register const char *t = strchr(s, ';'); + sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=\"", soap->mime.boundary); + if (t) + { strncat(soap->tmpbuf, s, t - s); + soap->tmpbuf[sizeof(soap->tmpbuf)-1] = '\0'; + } + else + strcat(soap->tmpbuf, s); + if (soap->mime.start) + { strcat(soap->tmpbuf, "\"; start=\""); + strcat(soap->tmpbuf, soap->mime.start); + } + strcat(soap->tmpbuf, "\""); + if (r) + { strcat(soap->tmpbuf, "; start-info=\""); + strcat(soap->tmpbuf, r); + strcat(soap->tmpbuf, "\""); + } + s = soap->tmpbuf; + } +#endif + if (s && (err = soap->fposthdr(soap, "Content-Type", s))) + return err; +#ifdef WITH_ZLIB + if ((soap->omode & SOAP_ENC_ZLIB)) + { +#ifdef WITH_GZIP + err = soap->fposthdr(soap, "Content-Encoding", soap->zlib_out == SOAP_ZLIB_DEFLATE ? "deflate" : "gzip"); +#else + err = soap->fposthdr(soap, "Content-Encoding", "deflate"); +#endif + if (err) + return err; + } +#endif +#ifndef WITH_LEANER + if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) + err = soap->fposthdr(soap, "Transfer-Encoding", "chunked"); + else +#endif + if (s) + { sprintf(soap->tmpbuf, "%lu", (unsigned long)count); + err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); + } + if (err) + return err; + } + return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close"); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_get(struct soap *soap) +{ return SOAP_GET_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_put(struct soap *soap) +{ return SOAP_PUT_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_del(struct soap *soap) +{ return SOAP_DEL_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_head(struct soap *soap) +{ return SOAP_HEAD_METHOD; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) +{ register const char *s; + register int err; + if (soap->status == SOAP_GET) + s = "GET"; + else + s = "POST"; +#ifdef PALM + 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)) +#else + if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && strncmp(endpoint, "httpg:", 6))) +#endif + return SOAP_OK; + if (strlen(endpoint) + strlen(soap->http_version) > sizeof(soap->tmpbuf) - 80) + return soap->error = SOAP_EOM; + if (soap->proxy_host && soap_tag_cmp(endpoint, "https:*")) + sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version); + else + sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); + if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) + return err; +#ifdef WITH_OPENSSL + if ((soap->ssl && soap->port != 443) || (!soap->ssl && soap->port != 80)) + sprintf(soap->tmpbuf, "%s:%d", host, port); + else + strcpy(soap->tmpbuf, host); +#else + if (port != 80) + sprintf(soap->tmpbuf, "%s:%d", host, port); + else + strcpy(soap->tmpbuf, host); +#endif + if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf)) + || (err = soap->fposthdr(soap, "User-Agent", "INTENO CWMP")) + || (err = soap_puthttphdr(soap, SOAP_OK, count))) + return err; +#ifdef WITH_ZLIB +#ifdef WITH_GZIP + if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate"))) +#else + if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate"))) +#endif + return err; +#endif +#ifndef WITH_LEAN + if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761) + { sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd); + strcpy(soap->tmpbuf, "Basic "); + soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); + if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf))) + return err; + } + if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761) + { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd); + strcpy(soap->tmpbuf, "Basic "); + soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); + if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf))) + return err; + } +#endif +#ifdef WITH_COOKIES +#ifdef WITH_OPENSSL + if (soap_putcookies(soap, host, path, soap->ssl != NULL)) + return soap->error; +#else + if (soap_putcookies(soap, host, path, 0)) + return soap->error; +#endif +#endif + if (soap->status != SOAP_GET && (soap->version == 1 || (action && *action))) + { sprintf(soap->tmpbuf, "\"%s\"", action && strlen(action) < sizeof(soap->tmpbuf) - 3 ? action : SOAP_STR_EOS); + if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf))) + return err; + } + return soap->fposthdr(soap, NULL, NULL); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_send_header(struct soap *soap, const char *s) +{ register const char *t; + do + { t = strchr(s, '\n'); /* disallow \n in HTTP headers */ + if (!t) + t = s + strlen(s); + if (soap_send_raw(soap, s, t - s)) + return soap->error; + s = t + 1; + } while (*t); + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_post_header(struct soap *soap, const char *key, const char *val) +{ if (key) + { if (http_send_header(soap, key)) + return soap->error; + if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val))) + return soap->error; + } + return soap_send_raw(soap, "\r\n", 2); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +static int +http_response(struct soap *soap, int status, size_t count) +{ register int err; +#ifdef WMW_RPM_IO + if (soap->rpmreqid) + httpOutputEnable(soap->rpmreqid); +#endif + if (strlen(soap->http_version) > 4) + return soap->error = SOAP_EOM; + if (!status || status == SOAP_HTML || status == SOAP_FILE) + { const char *s; +#if 0 /* KMD Modification*/ + if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) +#endif + s = "200 OK"; +#if 0 /* KMD Modification*/ + else + s = "202 ACCEPTED"; +#endif + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Status = %s\n", s)); +#ifdef WMW_RPM_IO + if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ +#else + if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ +#endif + { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s); + if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) + return err; + } + else if ((err = soap->fposthdr(soap, "Status", s))) + return err; + } + else if (status >= 200 && status < 600) + { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status)); + if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) + return err; +#ifndef WITH_LEAN + if (status == 401) + { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) < sizeof(soap->tmpbuf) - 14) ? soap->authrealm : "gSOAP Web Service"); + if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf))) + return err; + } + else if ((status >= 301 && status <= 303) || status == 307) + { if ((err = soap->fposthdr(soap, "Location", soap->endpoint))) + return err; + } +#endif + } + else + { const char *s = *soap_faultcode(soap); + if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) + s = "400 Bad Request"; + else + s = "500 Internal Server Error"; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error %s (status=%d)\n", s, status)); +#ifdef WMW_RPM_IO + if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */ +#else + if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */ +#endif + { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s); + if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL))) + return err; + } + else if ((err = soap->fposthdr(soap, "Status", s))) /* CGI */ + return err; + } + if ((err = soap->fposthdr(soap, "Server", "INTENO CWMP")) + || (err = soap_puthttphdr(soap, status, count))) + return err; +#ifdef WITH_COOKIES + if (soap_putsetcookies(soap)) + return soap->error; +#endif + return soap->fposthdr(soap, NULL, NULL); +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_response(struct soap *soap, int status) +{ register size_t count; + if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */)) + && (status == SOAP_HTML || status == SOAP_FILE)) + soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; + soap->status = status; + count = soap_count_attachments(soap); + if (soap_begin_send(soap)) + return soap->error; +#ifndef WITH_NOHTTP + if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML)) + { register int n = soap->mode; + soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); + if ((n & SOAP_IO) != SOAP_IO_FLUSH) + soap->mode |= SOAP_IO_BUFFER; + if ((soap->error = soap->fresponse(soap, status, count))) + return soap->error; +#ifndef WITH_LEANER + if ((n & SOAP_IO) == SOAP_IO_CHUNK) + { if (soap_flush(soap)) + return soap->error; + } +#endif + soap->mode = n; + } +#endif + return SOAP_OK; +} +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +static const char* +soap_set_validation_fault(struct soap *soap, const char *s, const char *t) +{ if (*soap->tag) + sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag); + else + sprintf(soap->msgbuf, "Validation constraint violation: %s%s", s, t?t:SOAP_STR_EOS); + return soap->msgbuf; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_set_fault(struct soap *soap) +{ const char **c = soap_faultcode(soap); + const char **s = soap_faultstring(soap); + if (soap->fseterror) + soap->fseterror(soap, c, s); + if (!*c) + { if (soap->version == 2) + *c = "SOAP-ENV:Sender"; + else + *c = "SOAP-ENV:Client"; + } + if (*s) + return; + switch (soap->error) + { +#ifndef WITH_LEAN + case SOAP_CLI_FAULT: + *s = "Client fault"; + break; + case SOAP_SVR_FAULT: + *s = "Server fault"; + break; + case SOAP_TAG_MISMATCH: + *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL); + break; + case SOAP_TYPE: + *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type); + break; + case SOAP_SYNTAX_ERROR: + *s = "Well-formedness violation"; + break; + case SOAP_NO_TAG: + *s = "No XML element tag"; + break; + case SOAP_MUSTUNDERSTAND: + *c = "SOAP-ENV:MustUnderstand"; + sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag); + *s = soap->msgbuf; + break; + case SOAP_VERSIONMISMATCH: + *c = "SOAP-ENV:VersionMismatch"; + *s = "Invalid SOAP message or SOAP version mismatch"; + break; + case SOAP_DATAENCODINGUNKNOWN: + *c = "SOAP-ENV:DataEncodingUnknown"; + *s = "Unsupported SOAP data encoding"; + break; + case SOAP_NAMESPACE: + *s = soap_set_validation_fault(soap, "namespace error", NULL); + break; + case SOAP_USER_ERROR: + *s = "User error"; + break; + case SOAP_FATAL_ERROR: + *s = "Fatal error"; + break; + case SOAP_NO_METHOD: + sprintf(soap->msgbuf, "Method '%s' not implemented: method name or namespace not recognized", soap->tag); + *s = soap->msgbuf; + break; + case SOAP_NO_DATA: + *s = "Data required for operation"; + break; + case SOAP_GET_METHOD: + *s = "HTTP GET method not implemented"; + break; + case SOAP_PUT_METHOD: + *s = "HTTP PUT method not implemented"; + break; + case SOAP_HEAD_METHOD: + *s = "HTTP HEAD method not implemented"; + break; + case SOAP_HTTP_METHOD: + *s = "HTTP method not implemented"; + break; + case SOAP_EOM: + *s = "Out of memory"; + break; + case SOAP_MOE: + *s = "Memory overflow or memory corruption error"; + break; + case SOAP_HDR: + *s = "Header line too long"; + break; + case SOAP_IOB: + *s = "Array index out of bounds"; + break; + case SOAP_NULL: + *s = soap_set_validation_fault(soap, "nil not allowed", NULL); + break; + case SOAP_DUPLICATE_ID: + *s = soap_set_validation_fault(soap, "multiple definitions of id ", soap->id); + if (soap->version == 2) + *soap_faultsubcode(soap) = "SOAP-ENC:DuplicateID"; + break; + case SOAP_MISSING_ID: + *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id); + if (soap->version == 2) + *soap_faultsubcode(soap) = "SOAP-ENC:MissingID"; + break; + case SOAP_HREF: + *s = soap_set_validation_fault(soap, "incompatible object type ref/id pair ", soap->id); + break; + case SOAP_FAULT: + break; +#ifndef WITH_NOIO + case SOAP_UDP_ERROR: + *s = "Message too large for UDP packet"; + break; + case SOAP_TCP_ERROR: + *s = tcp_error(soap); + break; +#endif + case SOAP_HTTP_ERROR: + *s = "An HTTP processing error occurred"; + break; + case SOAP_SSL_ERROR: +#ifdef WITH_OPENSSL + *s = "SSL error"; +#else + *s = "OpenSSL not installed: recompile with -DWITH_OPENSSL"; +#endif + break; + case SOAP_PLUGIN_ERROR: + *s = "Plugin registry error"; + break; + case SOAP_DIME_ERROR: + *s = "DIME format error"; + break; + case SOAP_DIME_HREF: + *s = "DIME href to missing attachment"; + break; + case SOAP_DIME_MISMATCH: + *s = "DIME version/transmission error"; + break; + case SOAP_DIME_END: + *s = "End of DIME error"; + break; + case SOAP_MIME_ERROR: + *s = "MIME format error"; + break; + case SOAP_MIME_HREF: + *s = "MIME href to missing attachment"; + break; + case SOAP_MIME_END: + *s = "End of MIME error"; + break; + case SOAP_ZLIB_ERROR: +#ifdef WITH_ZLIB + sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream->msg?soap->d_stream->msg:SOAP_STR_EOS); + *s = soap->msgbuf; +#else + *s = "Zlib/gzip not installed for (de)compression: recompile with -DWITH_GZIP"; +#endif + break; + case SOAP_REQUIRED: + *s = soap_set_validation_fault(soap, "missing required attribute", NULL); + break; + case SOAP_PROHIBITED: + *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL); + break; + case SOAP_OCCURS: + *s = soap_set_validation_fault(soap, "occurrence violation", NULL); + break; + case SOAP_LENGTH: + *s = soap_set_validation_fault(soap, "content range or length violation", NULL); + break; + case SOAP_FD_EXCEEDED: + *s = "Maximum number of open connections was reached"; + break; + case SOAP_STOP: + *s = "Stopped: no response sent"; + break; +#endif + case SOAP_EOF: +#ifndef WITH_NOIO + strcpy(soap->msgbuf, soap_strerror(soap)); +#ifndef WITH_LEAN + if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) + { memmove(soap->msgbuf + 25, soap->msgbuf, strlen(soap->msgbuf) + 1); + memcpy(soap->msgbuf, "End of file or no input: ", 25); + } +#endif + *s = soap->msgbuf; + break; +#else + *s = "End of file or no input"; + break; +#endif + default: +#ifndef WITH_NOHTTP +#ifndef WITH_LEAN + if (soap->error > 200 && soap->error < 600) + { sprintf(soap->msgbuf, "HTTP Error: %d %s", soap->error, http_error(soap, soap->error)); + *s = soap->msgbuf; + } + else +#endif +#endif + { sprintf(soap->msgbuf, "Error %d", soap->error); + *s = soap->msgbuf; + } + } +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send_fault(struct soap *soap) +{ register int status = soap->error; + if (status == SOAP_STOP) + return status; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); + soap->keep_alive = 0; /* to terminate connection */ + soap_set_fault(soap); + if (status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) + { int r = 1; +#ifndef WITH_NOIO + if (soap->fpoll && soap->fpoll(soap)) + r = 0; +#ifndef WITH_LEAN + else if (soap_valid_socket(soap->socket)) + { struct timeval timeout; + fd_set rfd, sfd; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&rfd); + FD_ZERO(&sfd); + FD_SET(soap->socket, &rfd); + FD_SET(soap->socket, &sfd); + r = select((int)soap->socket + 1, &rfd, &sfd, NULL, &timeout); + if (r > 0) + { if (!FD_ISSET(soap->socket, &sfd) + || (FD_ISSET(soap->socket, &rfd) + && recv(soap->socket, soap->tmpbuf, 1, MSG_PEEK) < 0)) + r = 0; + } + } +#endif +#endif + if (r > 0) + { soap->error = SOAP_OK; + soap_serializeheader(soap); + soap_serializefault(soap); + soap_begin_count(soap); + if (soap->mode & SOAP_IO_LENGTH) + { soap_envelope_begin_out(soap); + soap_putheader(soap); + soap_body_begin_out(soap); + soap_putfault(soap); + soap_body_end_out(soap); + soap_envelope_end_out(soap); + } + soap_end_count(soap); + if (soap_response(soap, status) + || soap_envelope_begin_out(soap) + || soap_putheader(soap) + || soap_body_begin_out(soap) + || soap_putfault(soap) + || soap_body_end_out(soap) + || soap_envelope_end_out(soap)) + return soap_closesock(soap); + soap_end_send(soap); + } + } + soap->error = status; + return soap_closesock(soap); +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_fault(struct soap *soap) +{ register int status = soap->error; + DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Receiving SOAP Fault\n")); + soap->error = SOAP_OK; + if (soap_getfault(soap)) + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed. Is this a SOAP message at all?\n")); + *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); + soap->error = status; + soap_set_fault(soap); + } + else + { register const char *s = *soap_faultcode(soap); + if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver")) + status = SOAP_SVR_FAULT; + else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender")) + status = SOAP_CLI_FAULT; + else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand")) + status = SOAP_MUSTUNDERSTAND; + else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch")) + status = SOAP_VERSIONMISMATCH; + else + { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Fault code %s\n", s)); + status = SOAP_FAULT; + } + if (soap_body_end_in(soap) + || soap_envelope_end_in(soap) + || soap_end_recv(soap)) + return soap_closesock(soap); + soap->error = status; + } + return soap_closesock(soap); +} +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_send_empty_response(struct soap *soap, int httpstatuscode) +{ register soap_mode m = soap->omode; + soap->count = 0; + if ((m & SOAP_IO) == SOAP_IO_CHUNK) + soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; + if (soap_response(soap, httpstatuscode) || soap_end_send(soap)) + { soap->omode = m; + return soap_closesock(soap); + } + soap->omode = m; + return SOAP_OK; +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOHTTP +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_recv_empty_response(struct soap *soap) +{ if (!soap_begin_recv(soap)) + soap_end_recv(soap); + else if (soap->error == SOAP_NO_DATA || soap->error == 202) + soap->error = SOAP_OK; + return soap_closesock(soap); +} +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_NOIO +#ifndef PALM_1 +static const char* +soap_strerror(struct soap *soap) +{ register int err = soap->errnum; + if (err) + { +#ifndef WIN32 + return strerror(err); +#else +#ifndef UNDER_CE + DWORD len; + *soap->msgbuf = '\0'; + 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); +#else + DWORD i, len; + *soap->msgbuf = '\0'; + len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)soap->msgbuf, (DWORD)(sizeof(soap->msgbuf)/sizeof(TCHAR)), NULL); + for (i = 0; i <= len; i++) + { if (((TCHAR*)soap->msgbuf)[i] < 0x80) + soap->msgbuf[i] = (char)((TCHAR*)soap->msgbuf)[i]; + else + soap->msgbuf[i] = '?'; + } +#endif + return soap->msgbuf; +#endif + } +#ifndef WITH_LEAN + if (soap->recv_timeout > 0) + { if (soap->send_timeout > 0) + sprintf(soap->msgbuf, "Operation interrupted or timed out after %ds send or %ds receive delay", soap->send_timeout, soap->recv_timeout); + else + sprintf(soap->msgbuf, "Operation interrupted or timed out after %ds receive delay", soap->recv_timeout); + return soap->msgbuf; + } +#endif + return "Operation interrupted or timed out"; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror) +{ *soap_faultcode(soap) = faultcode; + if (faultsubcodeQName) + *soap_faultsubcode(soap) = faultsubcodeQName; + *soap_faultstring(soap) = faultstring; + if (faultdetailXML && *faultdetailXML) + { register const char **s = soap_faultdetail(soap); + if (s) + *s = faultdetailXML; + } + return soap->error = soaperror; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) +{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", NULL, faultstring, faultdetailXML, soaperror); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror) +{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", NULL, faultstring, faultdetailXML, soaperror); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +static int +soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) +{ char *r = NULL, *s = NULL, *t = NULL; + if (faultsubcodeQName) + r = soap_strdup(soap, faultsubcodeQName); + if (faultstring) + s = soap_strdup(soap, faultstring); + if (faultdetailXML) + t = soap_strdup(soap, faultdetailXML); + return soap_set_error(soap, faultcode, r, s, t, SOAP_FAULT); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) +{ return soap_sender_fault_subcode(soap, NULL, faultstring, faultdetailXML); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_sender_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) +{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultsubcodeQName, faultstring, faultdetailXML); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetailXML) +{ return soap_receiver_fault_subcode(soap, NULL, faultstring, faultdetailXML); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML) +{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultsubcodeQName, faultstring, faultdetailXML); +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_print_fault(struct soap *soap, FILE *fd) +{ if (soap_check_state(soap)) + fprintf(fd, "Error: soap struct state not initialized\n"); + else if (soap->error) + { const char *c, *v = NULL, *s, **d; + d = soap_faultcode(soap); + if (!*d) + soap_set_fault(soap); + c = *d; + if (soap->version == 2) + v = *soap_faultsubcode(soap); + s = *soap_faultstring(soap); + d = soap_faultdetail(soap); + 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 ? *d : "[no detail]"); + } +} +#endif +#endif + +/******************************************************************************/ +#ifdef __cplusplus +#ifndef WITH_LEAN +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_stream_fault(struct soap *soap, std::ostream& os) +{ if (soap_check_state(soap)) + os << "Error: soap struct state not initialized\n"; + else if (soap->error) + { const char *c, *v = NULL, *s, **d; + d = soap_faultcode(soap); + if (!*d) + soap_set_fault(soap); + c = *d; + if (soap->version == 2) + v = *soap_faultsubcode(soap); + s = *soap_faultstring(soap); + d = soap_faultdetail(soap); + os << (soap->version ? "SOAP 1." : "Error ") + << (soap->version ? (int)soap->version : soap->error) + << " fault: " << c + << "[" << (v ? v : "no subcode") << "]" + << std::endl + << "\"" << (s ? s : "[no reason]") << "\"" + << std::endl + << "Detail: " << (d && *d ? *d : "[no detail]") + << std::endl; + } +} +#endif +#endif +#endif + +/******************************************************************************/ +#ifndef WITH_LEAN +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +char* +SOAP_FMAC2 +soap_sprint_fault(struct soap *soap, char *buf, size_t len) +{ if (soap_check_state(soap)) + strncpy(buf, "Error: soap struct not initialized", len); + else if (soap->error) + { const char *c, *v = NULL, *s, **d; + d = soap_faultcode(soap); + if (!*d) + soap_set_fault(soap); + c = *d; + if (soap->version == 2) + v = *soap_faultsubcode(soap); + s = *soap_faultstring(soap); + d = soap_faultdetail(soap); +#ifdef WIN32 + _snprintf +#else + snprintf +#endif + (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 ? *d : "[no detail]"); + } + return buf; +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +#ifndef WITH_NOSTDLIB +SOAP_FMAC1 +void +SOAP_FMAC2 +soap_print_fault_location(struct soap *soap, FILE *fd) +{ +#ifndef WITH_LEAN + int i, j, c1, c2; + if (soap->error && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= SOAP_BUFLEN) + { i = (int)soap->bufidx - 1; + if (i <= 0) + i = 0; + c1 = soap->buf[i]; + soap->buf[i] = '\0'; + if ((int)soap->buflen >= i + 1024) + j = i + 1023; + else + j = (int)soap->buflen - 1; + c2 = soap->buf[j]; + soap->buf[j] = '\0'; + fprintf(fd, "%s%c\n\n", soap->buf, c1); + if (soap->bufidx < soap->buflen) + fprintf(fd, "%s\n", soap->buf + soap->bufidx); + soap->buf[i] = c1; + soap->buf[j] = c2; + } +#endif +} +#endif +#endif + +/******************************************************************************/ +#ifndef PALM_1 +SOAP_FMAC1 +int +SOAP_FMAC2 +soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) +{ register struct soap_plugin *p; + register int r; + if (!(p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)))) + return soap->error = SOAP_EOM; + p->id = NULL; + p->data = NULL; + p->fcopy = NULL; + p->fdelete = NULL; + r = fcreate(soap, p, arg); + if (!r && p->fdelete) + { p->next = soap->plugins; + soap->plugins = p; + DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id)); + return SOAP_OK; + } + 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)); + SOAP_FREE(soap, p); + return r; +} +#endif + +/******************************************************************************/ +#ifndef PALM_1 +static void * +fplugin(struct soap *soap, const char *id) +{ register struct soap_plugin *p; + for (p = soap->plugins; p; p = p->next) + if (p->id == id || !strcmp(p->id, id)) + return p->data; + return NULL; +} +#endif + +/******************************************************************************/ +#ifndef PALM_2 +SOAP_FMAC1 +void * +SOAP_FMAC2 +soap_lookup_plugin(struct soap *soap, const char *id) +{ return soap->fplugin(soap, id); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +} +#endif + +/******************************************************************************\ + * + * C++ soap struct methods + * +\******************************************************************************/ + +#ifdef __cplusplus +soap::soap() +{ soap_init(this); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +soap::soap(soap_mode m) +{ soap_init1(this, m); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +soap::soap(soap_mode im, soap_mode om) +{ soap_init2(this, im, om); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +soap::soap(struct soap& soap) +{ soap_copy_context(this, &soap); +} +#endif + +/******************************************************************************/ +#ifdef __cplusplus +soap::~soap() +{ soap_destroy(this); + soap_end(this); + soap_done(this); +} +#endif + +/******************************************************************************/ diff --git a/src/wsdl/cwmp-1-1.wsdl b/src/wsdl/cwmp-1-1.wsdl new file mode 100644 index 0000000..947b41e --- /dev/null +++ b/src/wsdl/cwmp-1-1.wsdl @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Service definition of function GetRPCMethods + + + + + + + + + + + + + + + + + + + + + + Metanoia cwmp service definition + + + + + + diff --git a/src/wsdl/cwmp-1-1.xsd b/src/wsdl/cwmp-1-1.xsd new file mode 100644 index 0000000..fdfe6f5 --- /dev/null +++ b/src/wsdl/cwmp-1-1.xsd @@ -0,0 +1,1664 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPE fault codes + + + + Method not supported + + + + + Request denied (no reason specified) + + + + + Internal error + + + + + Invalid arguments + + + + + Resources exceeded + + + + + Invalid parameter name + + + + + Invalid parameter type + + + + + Invalid parameter value + + + + + Attempt to set a non-writable parameter + + + + + Notification request rejected + + + + + Download failure + + + + + Upload failure + + + + + File transfer server authentication failure + + + + + Unsupported protocol for file transfer + + + + + Download failure: unable to join multicast group + + + + + Download failure: unable to contact file server + + + + + Download failure: unable to access file + + + + + Download failure: unable to complete download + + + + + Download failure: file corrupted + + + + + Download failure: file authentication failure + + + + + + + + Future expansion fault codes + + + + + + + + + CPE Vendor fault codes + + + + + + + + + ACS fault codes + + + + Method not supported + + + + + Request denied (no reason specified) + + + + + Internal error + + + + + Invalid arguments + + + + + Resources exceeded + + + + + Retry request + + + + + + + + Future expansion fault codes + + + + + + + + + ACS Vendor fault codes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fault information for TransferComplete and AutonomousTransferComplete + + + + + Transfer fault codes + + + + + + + + No fault + + + + + Request denied (no reason specified) + + + + + Internal error + + + + + Download failure + + + + + Upload failure + + + + + File transfer server authentication failure + + + + + Download failure: unable to join multicast group + + + + + Download failure: unable to contact file server + + + + + Download failure: unable to access file + + + + + Download failure: unable to complete download + + + + + Download failure: file corrupted + + + + + Download failure: file authentication failure + + + + + + + + Future expansion fault codes + + + + + + + + + CPE Vendor fault codes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notification off. The CPE need not inform the ACS of a change to the specified parameter(s) + + + + + Passive notification. Whenever the specified parameter value changes, the CPE MUST include the new value in the ParameterList in the Inform message that is sent the next time a session is established to the ACS + + + + + Active notification. Whenever the specified parameter value changes, the CPE MUST initiate a session to the ACS, and include the new value in the ParameterList in the associated Inform message + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 - Not yet started + + + + + 2 - In progress + + + + + 3 - Completed + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 - Not yet started + + + + + 2 - In progress + + + + + 3 - Completed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Option is disabled and not setup + + + + + Option is enabled and not setup + + + + + Option is disabled and setup + + + + + Option is enabled and setup + + + + + + + + + + + 0 - Disabled + + + + + 1 - Enabled with expiration + + + + + 2 - Enabled without expiration + + + + + + + + + + + + + Non-transferable + + + + + Transferable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GeRPCMethods message - Annex A.3.1.1 + + + + + + + + GeRPCMethodsResponse message - Annex A.3.1.1 + + + + + + + + + + + + + + SetParameterValues message - Annex A.3.2.1 + + + + + + + + + + + + + SetParameterValuesResponse message - Annex A.3.2.1 + + + + + + + + + All Parameter changes have been validated and applied + + + + + All Parameter changes have been validated and committed, but some or all are not yet applied (for example, if a reboot is required before the new values are applied) + + + + + + + + + + + + + GetParameterValues message - Annex A.3.2.2 + + + + + + + + + + + + GetParameterValuesResponse message - Annex A.3.2.2 + + + + + + + + + + + + GetParameterNames message - Annex A.3.2.3 + + + + + + + + + + + + + + + + + + + GetParameterNamesResponse message - Annex A.3.2.3 + + + + + + + + + + + + SetParameterAttributes message - Annex A.3.2.4 + + + + + + + + + + + + SetParameterAttributesResponse message - Annex A.3.2.4 + + + + + + + + GetParameterAttributes message - Annex A.3.2.5 + + + + + + + + + + + + GetParameterAttributesResponse message - Annex A.3.2.5 + + + + + + + + + + + + AddObject message - Annex A.3.2.6 + + + + + + + + + + + + + AddObjectResponse message - Annex A.3.2.6 + + + + + + + + + + + + + + + + The object has been created + + + + + The object creation has been validated and committed, but not yet applied + + + + + + + + + + + + + DeleteObject message - Annex A.3.2.7 + + + + + + + + + + + + + DeleteObjectResponse message - Annex A.3.2.7 + + + + + + + + + The object has been deleted + + + + + The object deletion has been validated and committed, but not yet applied + + + + + + + + + + + + + Download message - Annex A.3.2.8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DownloadResponse message - Annex A.3.2.8 + + + + + + + + + Download has completed and been applied + + + + + Download has not yet been completed and applied + + + + + + + + + + + + + + + Reboot message - Annex A.3.2.9 + + + + + + + + + + + + RebootResponse message - Annex A.3.2.9 + + + + + + + + + + GetQueuedTransfers message - Annex A.4.1.1 + + + + + + + + GetQueuedTransfersResponse message - Annex A.4.1.1 + + + + + + + + + + + + ScheduleInform message - Annex A.4.1.2 + + + + + + + + + + + + + ScheduleInformResponse message - Annex A.4.1.2 + + + + + + + + SetVouchers message - Annex A.4.1.3 + + + + + + + + + + + + SetVouchersResponse message - Annex A.4.1.3 + + + + + + + + GetOptions message - Annex A.4.1.4 + + + + + + + + + + + + + + + + + + GetOptionsResponse message - Annex A.4.1.4 + + + + + + + + + + + + Upload message - Annex A.4.1.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UploadResponse message - Annex A.4.1.5 + + + + + + + + + Upload has been completed + + + + + Upload has not yet completed + + + + + + + + + + + + + + + FactoryReset message - Annex A.4.1.6 + + + + + + + + FactoryResetResponse message - Annex A.4.1.6 + + + + + + + + GetAllQueuedTransfers message - Annex A.4.1.7 + + + + + + + + GetAllQueuedTransfersResponse message - Annex A.4.1.7 + + + + + + + + + + + + + + Inform message - Annex A.3.3.1 + + + + + + + + + + + + + + + + + InformResponse message - Annex A.3.3.1 + + + + + + + + + + + + TransferComplete message - Annex A.3.3.2 + + + + + + + + + + + + + + + TransferCompleteResponse message - Annex A.3.3.2 + + + + + + + + AutonomousTransferComplete message - Annex A.3.3.3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AutonomousTransferCompleteResponse message - Annex A.3.3.3 + + + + + + + + + + Kicked message - Annex A.4.2.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KickedResponse message - Annex A.4.2.1 + + + + + + + + + + + + + + + + + + RequestDownload message - Annex A.4.2.2 + + + + + + + + + + + + + + + + + + + + + + + RequestDownloadResponse message - Annex A.4.2.2 + + + + +